自动获取引用文献

使用selenium自动化工具进行爬取,具体来说就是bib格式引用,修改pn.txt,每行一个文献名称,输出在output.txt

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from urllib import parse
import math
from time import sleep


class GG_Bibtex(object):
    def __init__(self, driver_path, gg_search_url):
        self.driver = None
        self.paper_names = []
        self.gg_search_url = gg_search_url
        self.driver_path = driver_path
        self.reset(driver_path)

    def reset(self, driver_path):
        self.service = Service(driver_path)
        option = webdriver.ChromeOptions()
        # option.add_argument('headless')  # no show window
        self.driver = webdriver.Chrome(service=self.service, options=option)
        self.driver.set_window_size(800, 800)

    def get_bib_text(self, paper_title):
        elements_xpath = {
            'qoute_btn1': '//*[@id="gs_res_ccl_mid"]/div/div[2]/div[5]/a[2]',
            'qoute_btn2': '//*[@id="gs_res_ccl_mid"]/div[1]/div[2]/div[3]/a[2]',
            'qoute_btn3': '//*[@id="gs_res_ccl_mid"]/div/div/div[3]/a[2]',
            'qoute_btn4': '//*[@id="gs_res_ccl_mid"]/div/div/div[5]/a[2]',
            'bibtex_btn': '/html/body/div/div[4]/div/div[2]/div/div[2]/a[1]',
            'bib_text': '/html/body/pre'
        }
        strto_pn = parse.quote(paper_title)
        url = self.gg_search_url + strto_pn
        self.driver.get(url)
        try:
            qoute_btn = WebDriverWait(self.driver, 3, 0.1).until(
                EC.presence_of_element_located((By.XPATH, elements_xpath['qoute_btn1']))
            )
        except:
            try:
                qoute_btn = WebDriverWait(self.driver, 3, 0.1).until(
                    EC.presence_of_element_located((By.XPATH, elements_xpath['qoute_btn2']))
                )
            except:
                try:
                    qoute_btn = WebDriverWait(self.driver, 3, 0.1).until(
                        EC.presence_of_element_located((By.XPATH, elements_xpath['qoute_btn3']))
                    )
                except:
                    qoute_btn = WebDriverWait(self.driver, 3, 0.1).until(
                        EC.presence_of_element_located((By.XPATH, elements_xpath['qoute_btn4']))
                    )

        qoute_btn.click()

        bibtex_btn = WebDriverWait(self.driver, 15, 0.1).until(
            EC.presence_of_element_located((By.XPATH, elements_xpath['bibtex_btn']))
        )
        bibtex_btn.click()

        bib_text = WebDriverWait(self.driver, 15, 0.1).until(
            EC.presence_of_element_located((By.XPATH, elements_xpath['bib_text']))
        )
        bib_text = bib_text.text
        return bib_text

    def _quit_driver(self, ):
        self.driver.quit()
        self.service.stop()

    def results_writter(self, results, output_file_path='output.txt'):
        wtf = []
        for re_key in results.keys():
            context = results[re_key]
            # wtf.append(re_key + '\n')
            wtf.append(context + '\n\n')
        with open(output_file_path, 'w') as f:
            f.writelines(wtf)

    def run(self, paper_names, output_file_path, reset_len=10):
        """
        @params:
            paper_names: [LIST], your paper names.
            reset_len: [INT], for avoid the robot checking, you need to reset the driver for more times, default is 10 papers
        """
        self.paper_names = paper_names
        paper_len = len(paper_names)
        rest = paper_len % reset_len
        task_packs = []
        if paper_len > reset_len:
            groups_len = int(math.floor(paper_len / reset_len))  # 21/20 = 1
            for i in range(groups_len):
                sub_names = paper_names[(i) * reset_len:(i + 1) * reset_len]
                task_packs.append(sub_names)

        task_packs.append(paper_names[-1 * rest:])
        results = {}
        for ti in task_packs:
            for pn in ti:
                if len(pn) < 3:
                    continue
                print('\n---> Searching paper: {} ---> \n'.format(pn))
                bibtex = self.get_bib_text(pn)
                print(bibtex)
                results[pn] = bibtex
            self._quit_driver()
            sleep(1)
            self.reset(self.driver_path)
            print('-' * 10 + '\n Reset for avoiding robot check')
        self.results_writter(results, output_file_path)
        return results


if __name__ == "__main__":
    driver_path = r"C:\Users\86184\AppData\Local\Google\Chrome\Application\chromedriver.exe"
    input_file_path = 'pn.txt'
    output_file_path = 'output.txt'

    gg_search_url = r'https://scholar.google.com.hk/scholar?hl=zh-CN&as_sdt=0%2C5&q='
    ggb = GG_Bibtex(driver_path=driver_path, gg_search_url=gg_search_url)
    paper_names = []
    with open(input_file_path, 'r') as f:
        paper_names = f.readlines()
        paper_names = [pn.replace('\n', '') for pn in paper_names]
    results = ggb.run(paper_names=paper_names, output_file_path=output_file_path)

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
EndNote是一款用于管理和引用文献的软件工具。它可以帮助研究人员、学生和学者轻松地组织和引用各种文献资源,包括期刊文章、书籍、会议论文等。下面是使用EndNote引用文献的一般步骤: 1. 创建一个EndNote库:打开EndNote软件,点击"File"(文件)菜单,选择"New"(新建)来创建一个新的EndNote库。你可以选择将库保存在本地计算机上或者在云端进行存储。 2. 导入文献:在EndNote库中,你可以通过多种方式导入文献,例如手动输入、导入PDF文件或者通过在线数据库搜索并导入。常见的导入方式包括直接复制粘贴文献信息、导入已下载的文献文件或者通过EndNote提供的在线搜索功能导入。 3. 添加引文:在EndNote库中,你可以为每篇文献添加引文信息,包括作者、标题、期刊名称、出版日期等。你可以手动输入这些信息,也可以通过导入文献自动获取。 4. 创建引文样式:EndNote提供了各种引文样式,用于根据不同的学术要求生成参考文献列表和引文格式。你可以根据需要选择合适的引文样式,或者自定义一个新的样式。 5. 引用文献:在你写作论文或者其他学术文档时,可以使用EndNote插件将引文插入到文档中。在Word文档中,点击EndNote插件的"Insert Citation"(插入引文)按钮,选择要引用文献,EndNote会自动在文档中插入相应的引文。 6. 生成参考文献列表:在你完成论文写作后,可以使用EndNote插件生成参考文献列表。在Word文档中,点击EndNote插件的"Insert Bibliography"(插入参考文献)按钮,选择合适的引文样式,EndNote会根据你在库中添加的引文信息自动生成参考文献列表。 这是关于EndNote如何引用文献的一般介绍。如果你有更具体的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值