搞科研的小伙伴总是会被期刊严苛的引用文献格式搞的很头疼。虽然常用的文献软件可以一键导出BibTex,但由于很多论文在投稿之前都会先发上Arxiv占坑,软件就很可能会把文献引出为来自Arxiv。我用的是Zotero,就有这个毛病。

  因此,如果是IEEE的期刊,最好是直接去IEEE官网搜索并导出引用,否则可以使用谷歌学术。为了减少重复性的动作,我使用selenium来帮我完成这些操作。Selenium是Python的一个爬虫包,具体可以看:Python Selenium库的使用

  在此之前,需要安装的有:

  1、谷歌浏览器。也可以用别的浏览器,具体看上面的Selenium教程。

  2、Selenium控制谷歌浏览器的驱动。网址

  3、配置驱动的环境变量,就是把驱动解压的位置放到PATH里。感觉可有可无,因为代码中还是会用到驱动的位置。

  下面是Python代码,具体操作就是先从IEEE官网找,如果找不到再去谷歌学术找。需要具体配置的地方已在代码中注释:

#%% 从IEEE与谷歌学术爬取论文引用
from selenium import webdriver
from urllib import parse
from time import sleep class GetBibs():
def __init__(self, driver_path, option_path, ie_search_url, gg_search_url) -> None:
self.ie_search_url = ie_search_url
self.gg_search_url = gg_search_url
# 启用带插件的浏览器
option = webdriver.ChromeOptions()
option.add_argument("--user-data-dir="+option_path)
self.browser = webdriver.Chrome(executable_path = driver_path, options = option) # 打开chrome浏览器
self.browser.set_window_size(800,800) #不要随意修改,太窄会导致按钮的隐藏,模拟点击失效 def get_bib_from_IEEE(self, paper_title):
strto_pn=parse.quote(paper_title)
url = self.ie_search_url + strto_pn
self.browser.get(url)
compare_title = ''.join(list(filter(str.isalnum, paper_title))).lower()
#等待词条加载
for i in range(100):
try:
elements=self.browser.find_elements_by_css_selector("[class='List-results-items']")
elements[0].get_attribute('id')
break
except:
sleep(0.1)
#扫描所有词条,是否存在所需文献
paper_url = r'https://ieeexplore.ieee.org/document/'
for i in elements:
s_title = i.text.split('\n')[0]
s_title = ''.join(list(filter(str.isalnum, s_title))).lower()
if s_title == compare_title:
paper_url += i.get_attribute('id')
break
if paper_url == r'https://ieeexplore.ieee.org/document/': #没找到
return ''
# 进入文献页面
self.browser.get(paper_url)
# 等待加载bib按钮
for i in range(100):
try:
element=self.browser.find_element_by_css_selector("[class='layout-btn-white cite-this-btn']")
element.click()
break
except:
sleep(0.1)
# 点击bibtex
for i in range(100):
try:
element=self.browser.find_element_by_css_selector("[class='modal-dialog']")
element=element.find_elements_by_css_selector("[class='document-tab-link']")[1]
element.click()
break
except:
sleep(0.1)
for i in range(100):
try:
self.browser.find_element_by_css_selector("[class='text ris-text']")
break
except:
sleep(0.1)
sleep(2)
bib = self.browser.find_element_by_css_selector("[class='text ris-text']").text
return bib def get_bib_from_google_scholar(self, paper_title):
strto_pn=parse.quote(paper_title)
url = self.gg_search_url + strto_pn
self.browser.get(url)
#等待词条加载
for i in range(100):
try:
element=self.browser.find_element_by_css_selector("[class='gs_r gs_or gs_scl']")
element=element.find_element_by_css_selector("[class='gs_fl']")
element=element.find_element_by_css_selector("[class='gs_or_cit gs_nph']")
element.click()
break
except:
sleep(0.1)
for i in range(100):
try:
element=self.browser.find_element_by_id("gs_citi")
element=element.find_element_by_css_selector("[class='gs_citi']")
element.click()
break
except:
sleep(0.1)
for i in range(100):
try:
bib = self.browser.find_element_by_tag_name('pre').text
break
except:
sleep(0.1)
return bib def get_bib(self, paper_title):
bib = self.get_bib_from_IEEE(paper_title)
if bib != '':
return "IEEE", bib
return "Google", self.get_bib_from_google_scholar(paper_title) driver_path = r'C:/chromedriver/chromedriver' # 浏览器驱动位置
option_path = r"C:/Users/Administrator/AppData/Local/Google/Chrome/User Data/" # 使浏览器能用你自定义的设置,否则Selenium创建的浏览器对象是默认设置,一些插件就不能用了
ie_search_url = r'https://ieeexplore.ieee.org/search/searchresult.jsp?newsearch=true&queryText=' # 在执行代码之前,先打开IEEE官网的搜索页面,把类似的网址复制到这里,等号=后面就是一会儿要搜索的内容
gg_search_url = r'https://scholar.google.com/scholar?hl=zh-CN&as_sdt=0%2C5&inst=1597255436240989024&q=' # 谷歌学术也是一样
get_bibs = GetBibs(driver_path, option_path, ie_search_url, gg_search_url)
#%% **********************以上定义爬虫对象,以下开始爬取*******************************
paper_titles = { # 要爬取的论文,key用于标记,value是论文题目。下面是一些样例
"ESPCN":'Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network',
"Sparse_Coding":'Image Super-Resolution Via Sparse Representation',
"ESRGAN":'ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks',
"EnhanceNet":'EnhanceNet: Single Image Super-Resolution Through Automated Texture Synthesis',
'Meta-SR': 'Meta-SR: A Magnification-Arbitrary Network for Super-Resolution',
'SAN': 'Second-Order Attention Network for Single Image Super-Resolution',
} for k in paper_titles.keys():
source, bib = get_bibs.get_bib(paper_titles[k])
print(source+":",k)
print(bib)
print()

  IEEE与谷歌学术可能需要VPN,在爬之前要先做好准备。另外IEEE还需要登录机构账号,在此之前也要先登录好。

使用Selenium从IEEE与谷歌学术批量爬取BibTex文献引用的更多相关文章

  1. 爬虫 (4)- Selenium与PhantomJS(chromedriver)与爬取案例

    Selenium文档 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器 ...

  2. 爬虫新手学习2-爬虫进阶(urllib和urllib2 的区别、url转码、爬虫GET提交实例、批量爬取贴吧数据、fidder软件安装、有道翻译POST实例、豆瓣ajax数据获取)

    1.urllib和urllib2区别实例 urllib和urllib2都是接受URL请求相关模块,但是提供了不同的功能,两个最显著的不同如下: urllib可以接受URL,不能创建设置headers的 ...

  3. from appium import webdriver 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)

    使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium) - 北平吴彦祖 - 博客园 https://www.cnblogs.com/stevenshushu/p ...

  4. 从0实现python批量爬取p站插画

    一.本文编写缘由 很久没有写过爬虫,已经忘得差不多了.以爬取p站图片为着手点,进行爬虫复习与实践. 欢迎学习Python的小伙伴可以加我扣群86七06七945,大家一起学习讨论 二.获取网页源码 爬取 ...

  5. selenium+谷歌无头浏览器爬取网易新闻国内板块

    网页分析 首先来看下要爬取的网站的页面 查看网页源代码:你会发现它是由js动态加载显示的 所以采用selenium+谷歌无头浏览器来爬取它 1 加载网站,并拖动到底,发现其还有个加载更多 2 模拟点击 ...

  6. Python批量爬取谷歌原图,2021年最新可用版

    文章目录 前言 一.环境配置 1.安装selenium 2.使用正确的谷歌浏览器驱动 二.使用步骤 1.加载chromedriver.exe 2.设置是否开启可视化界面 3.输入关键词.下载图片数.图 ...

  7. python 批量爬取四级成绩单

    使用本文爬取成绩大致有几个步骤:1.提取表格(或其他格式文件——含有姓名,身份证等信息)中的数据,为进行准考证爬取做准备.2.下载准考证文件并提取出准考证和姓名信息.3.根据得到信息进行数据分析和存储 ...

  8. python动态网页爬取——四六级成绩批量爬取

    需求: 四六级成绩查询网站我所知道的有两个:学信网(http://www.chsi.com.cn/cet/)和99宿舍(http://cet.99sushe.com/),这两个网站采用的都是动态网页. ...

  9. 网络爬虫——针对任意主题批量爬取PDF

    |本文为博主原创,转载请说明出处 任务需求:要求通过Google针对任意关键字爬取大量PDF文档,如K-means,KNN,SVM等. 环境:Anaconda3--Windows7-64位--Pyth ...

随机推荐

  1. OkHttp配置HTTPS访问+服务器部署

    1 概述 OkHttp配置HTTPS访问,核心为以下三个部分: sslSocketFactory() HostnameVerifier X509TrustManager 第一个是ssl套接字工厂,第二 ...

  2. 6. linux 专业词汇

    什么是交换分区? 交换分区是一个特殊的分区,他的作用相当于windows下的虚拟内存,这个分区的大小一般设置为物理内存的两倍. 什么是Grub? Grub是一个系统引导工具,通过它可以加载内核,从而引 ...

  3. (三)LDAP 新增用户

    LDAP 新增用户 图一: 图二:LAM 配置 图三: 图四:全局配置   输入LAM控制台的密码,默认是LAM 图五:

  4. 1. Intellij IDEA导入,主题修改,布局界面+部分工具栏菜单介绍

    Project 和module 的区别 module 相当与eclispe的项目project 相当与eclpise的工作空间 主题的修改 Setting的快捷键:Ctrl+shift+S

  5. 有了CopyOnWrite为何又要有ReadWriteLock?

    引言 前文我们有介绍<看了CopyOnWriteArrayList后自己实现了一个CopyOnWriteHashMap> 关于CopyOnWrite容器的,但是它也有一些缺点: 内存占用问 ...

  6. kubernetes资源优化

    kubernetes资源优化方向 系统参数限制 设置系统内核参数: vm.overcommit_memory = 0 vm.swappiness = 0 sysctl -p #生效 内核参数overc ...

  7. spring boot最新版使用几个坑解决

    <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent ...

  8. Python实现Paramiko的二次封装

    Paramiko是一个用于执行SSH命令的Python第三方库,使用该库可实现自动化运维的所有任务,如下是一些常用代码的封装方式,多数代码为半成品,只是敲代码时的备份副本防止丢失,仅供参考,目前本人巡 ...

  9. hdu4923 f(A,B)分段处理

    题意:        给你序列A,让你构造序列B然后求出最小的f(A <B),其中A 是0,或者1组成的,而B是[0,1]的实数,f(A,B) = 求和(i从1到n) (Ai - Bi)^ 2. ...

  10. Win64 驱动内核编程-25.X64枚举和隐藏内核模块

    X64枚举和隐藏内核模块 在 WIN64 上枚举内核模块的人方法:使用 ZwQuerySystemInformation 的第 11 号功能和枚举 KLDR_DATA_TABLE_ENTRY 中的 I ...