python爬虫实现自动获取论文GB 7714引用
在写中文论文、本硕博毕业设计的时候要求非常严格的引用格式——GB 7714引用。对于普通学生来说都是在google scholar上获取,一个一个输入点击很麻烦,就想使用python完成这个自动化流程,实现批量的倒入论文标题,导出引用。
正常引用方法
一般获取GB 7714引用的方法分三步:
step1:打开Google Scholar在输入框中写入论文标题
step2:点击目标论文下方引用
step3:复制引用
这就是获取GB7714引用的方法,但是一个一个点击太慢,所以打算用python爬虫实现这个任务的自动化。
自动流程实现
环境准备
整个流程只需要两个库,直接使用pip安装就可以了:
pip install selenium beautifulsoup4
使用selenium
库来模拟浏览器行为,beautifulsoup4
库来解析HTML内容。
浏览器驱动准备
除了上面两个库,还需要安装你的浏览器对应的webdriver,这里以chromedriver (for Chrome)举例。 下载后,请确保将chromedriver放在你的系统PATH环境变量中,或者在代码中指定chromedriver的路径。安装chromedriver步骤:
step1:在浏览器地址栏输入chrome://version/
可以直接看到版本号,比如我的就是126.0.6478.126版本
step2:查找对应版本的驱动
官方网址:https://developer.chrome.com/docs/chromedriver/downloads?hl=zh-cn#current_releases
但是页面中没有对应的版本
往下翻有一个警告,点击 JSON 端点就会进入一个json格式的网页,点击ctrl+f输入chrome浏览器版本进行查找
就会查找到不同系统对应的chromedriver下载地址,复制地址到浏览器中就可以进行下载。接下来就是将chromedriver添加到环境变量中,win系统是UI界面添加非常方便,linux系统则需要通过几个命令实现添加:
sudo nano /etc/environment
打开环境变量文件,就会出现诸如 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"这样的,接着就是在这个后面添加上下载的chromedriver地址就可以。
添加过后需要激活一下:
source /etc/environment
Python爬虫
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time
def collect_scholar_info(article_titles):
"""
从Google Scholar收集文章信息。
Args:
article_title: 文章标题
Returns:
一个字典,包含文章信息,或者None如果找不到文章或发生错误。
"""
article_results = []
for article_title in article_titles:
options = webdriver.ChromeOptions()
# options.add_argument('--headless') # 可选:无头模式,不打开浏览器窗口
driver = webdriver.Chrome(options=options) # 替换为你的chromedriver路径,如果不在PATH中
driver.get("https://xueshu.aigrogu.com/")
search_box = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.NAME, "q"))
)
search_box.send_keys(article_title)
search_box.submit()
# 等待搜索结果加载 (时间可能需要调整)
time.sleep(3)
page_source = driver.page_source
# 使用 BeautifulSoup 解析页面
soup = BeautifulSoup(page_source, 'html.parser')
# 在这里编写代码来提取你需要的信息
results = soup.find_all('div', class_='gs_ri')
first_result = None
for result in results:
title = result.find('h3', class_='gs_rt').text
link = result.find('a')['href']
first_result = {'title': title, 'link': link}
cite_button = WebDriverWait(driver, 2).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "a.gs_or_cit.gs_or_btn.gs_nph"))
)
cite_button.click()
# 等待引用窗口出现并提取信息 (需要根据实际情况调整)
time.sleep(2) # 等待引用窗口加载
new_page_source = driver.page_source
new_soup = BeautifulSoup(new_page_source, 'html.parser')
time.sleep(2) # 等待引用窗口加载
gb_citation = new_soup.select_one('#gs_citt > table > tbody > tr:nth-child(1) > td:nth-child(2) > div').text
first_result['citation_GBT'] = gb_citation.strip() if gb_citation else "未能找到GB/T 7714引用"
break
article_results.append(first_result)
# 关闭浏览器
driver.quit()
return article_results
上面实现的是一个抓取函数,输入是多个paper的title,输出是爬取结果的一个list。引文GoogleScholar在多次访问后会出现人机验证,所以就是用一个镜像网站代替:
谷谷学术搜索_谷歌学术搜索_Google 学术搜索
最后输出的结果类似如下:
[{'title': 'Planning-oriented autonomous driving', 'link': 'http://openaccess.thecvf.com/content/CVPR2023/html/Hu_Planning-Oriented_Autonomous_Driving_CVPR_2023_paper.html', 'citation_GBT': 'Hu Y, Yang J, Chen L, et al. Planning-oriented autonomous driving[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 17853-17862.'}, {'title': 'DeepPhos: prediction of protein phosphorylation sites with deep learning', 'link': 'https://academic.oup.com/bioinformatics/article-abstract/35/16/2766/5270665', 'citation_GBT': 'Luo F, Wang M, Liu Y, et al. DeepPhos: prediction of protein phosphorylation sites with deep learning[J]. Bioinformatics, 2019, 35(16): 2766-2773.'}, {'title': '\n[HTML][HTML] A protocol of using PTMiner for quality control and localization of protein modifications identified by open or closed search of tandem mass spectra\n', 'link': 'https://www.ncbi.nlm.nih.gov/pmc/articles/PMC10166509/', 'citation_GBT': 'Cheng Z, Song G, Fu Y. A protocol of using PTMiner for quality control and localization of protein modifications identified by open or closed search of tandem mass spectra[J]. Biophysics Reports, 2022, 8(5-6): 269.'}, {'title': 'A Survey of Multimodal Large Language Model from A Data-centric Perspective', 'link': 'https://arxiv.org/abs/2405.16640', 'citation_GBT': 'Bai T, Liang H, Wan B, et al. A Survey of Multimodal Large Language Model from A Data-centric Perspective[J]. arXiv preprint arXiv:2405.16640, 2024.'}]
以下我这里设置输出的还有文章的链接还有标题,如果不需要可以后续处理中删掉只保留想要的东西,甚至可以格式化输出,方便复制粘贴到论文中。