搞科研的小伙伴总是会被期刊严苛的引用文献格式搞的很头疼。虽然常用的文献软件可以一键导出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. 17. Vue2.4+新增属性$listeners

    现在我们来讨论一种情况,A组件与C组件怎么通信,我们有多少种解决方案? 我们使用VueX来进行数据管理,但是如果项目中多个组件共享状态比较少,项目比较小,并且全局状态比较少,那使用VueX来实现该功能 ...

  2. Day05_21_Constructor构造器

    Constructor 构造器 构造方法(构造函数,构造器) 构造方法又被称为 构造函数/构造器/Constructor 构造方法的语法结构: [修饰符列表] 构造方法名 (形式参数列表){ 构造方法 ...

  3. 4.Linux命令基本格式与简单使用

    Linux命令名组成: 在Linux/Unix系统下输入命令,就会进行相应的操作,那么这个命令有如下组成: 命令名 [选项] [参数] 注:[]的内容代表可选 命令实例: ls #显示当前文件夹下的所 ...

  4. Linux安装MySQL8高版本压缩包(通用)

    前言 前段时间领导让我部署测试环境,希望安装高版本的MySQL,过程遇到很多问题,特此记录帮助迷失的人们 下载 MySQL官方下载地址:https://dev.mysql.com/downloads/ ...

  5. flex 的 三个参数 flex:1 0 auto

    flex :flex-group  flex-shirk  flex-basis ①.flex-group 剩余空间索取 默认值为0,不索取 eg:父元素400,子元素A为100px,B为200px. ...

  6. 【工具类】获取Http请求IP的工具类

    public class IpAddressUtil { public static String getIpAddr(HttpServletRequest request){ String ipAd ...

  7. 【手打】coredns单台使用

    目录: coredns介绍 coredns安装 corendns配置 coredns介绍 CoreDNS 其实就是一个 DNS 服务,而 DNS 作为一种常见的服务发现手段,所以很多开源项目以及工程师 ...

  8. Sqli 注入点解析

    目录 Less-1: 字符型注入 Less-2: 数字型注入 Less-3: 单引号字符型+括号 Less-4: 双引号字符型+括号 Less-5: 单引号字符型+固定输出信息 (floor报错注入& ...

  9. Python模块化编程

    目录 模块化 自定义模块 模块的内置属性 导入模块 安装第三方模块 查看模块的属性和方法 模块化 在Python中,一个.py文件就称之为一个模块(Module),为了避免模块名冲突,Python又引 ...

  10. Win64 驱动内核编程-10.突破WIN7的PatchGuard

    突破WIN7的PatchGuard WIN64 有两个内核保护机制,KPP 和 DSE.KPP 阻止我们 PATCH 内核,DSE 拦截我们加载驱动.当然 KPP 和 DSE 并不是不可战胜的,WIN ...