当对某篇文献特别感兴趣,想要一次性下载指定的十几篇或者几十篇参考文献时,可通过爬虫来下载某篇文献中指定或所有的参考文献。需要说明的是:虽然通过这种方式下载效率提高了,但不建议这么做,建议需要阅读哪篇就只下载哪篇。
1. 获取链接
首先需要安装库:pip install PyPDF2
这里可以用到Guan软件包:https://py.guanjihuan.com。代码如下:
import guan
links = guan.get_links_from_pdf(pdf_path, link_starting_form='https://doi.org')
guan.print_array(links)
以下是源代码,可以解析获取某个PDF文件中的所有链接[1,2]:
"""
This code is supported by the website: https://www.guanjihuan.com
The newest version of this code is on the web page: https://www.guanjihuan.com/archives/6869
"""
import PyPDF2
import os
import re
os.chdir('D:/') # PDF文件存放的位置
filename = input('输入PDF文件名:')
pdfFile = open(filename+'.pdf','rb')
pdfReader = PyPDF2.PdfFileReader(pdfFile)
pages = pdfReader.getNumPages()
i0 = 0
for page in range(pages):
pageSliced = pdfReader.getPage(page)
pageObject = pageSliced.getObject()
if '/Annots' in pageObject.keys():
ann = pageObject['/Annots']
old = ''
for a in ann:
u = a.getObject()
if '/A' in u.keys():
if re.search(re.compile('^https://doi.org'), u['/A']['/URI']): # 排除其他形式的链接
if u['/A']['/URI'] != old: # 排除重复链接
print(i0 , u['/A']['/URI'])
i0 += 1
old = u['/A']['/URI']
pdfFile.close()
2. 下载文献
将以上内容和“用Python在Sci-Hub上下载文献”结合,可得到以下代码。该代码可以一次性下载某篇文献中的所有参考文献:
"""
This code is supported by the website: https://www.guanjihuan.com
The newest version of this code is on the web page: https://www.guanjihuan.com/archives/6869
"""
import PyPDF2
import os
import re
from bs4 import BeautifulSoup
from urllib.request import urlopen
import requests
def main():
os.chdir('D:/') # PDF文件存放的位置
filename = input('输入PDF文件名:')
pdfFile = open(filename+'.pdf','rb') # 打开PDF文件
links = all_links_in_pdf(pdfFile) # 获取PDF文件中的链接
pdfFile.close() # 关闭PDF文件
os.chdir('D:/Reference') # 设置参考文献保存的位置
download(links) # 下载文献
def all_links_in_pdf(pdfFile):
pdfReader = PyPDF2.PdfFileReader(pdfFile)
pages = pdfReader.getNumPages()
i0 = 0
links = []
print()
for page in range(pages):
pageSliced = pdfReader.getPage(page)
pageObject = pageSliced.getObject()
if '/Annots' in pageObject.keys():
ann = pageObject['/Annots']
old = ''
for a in ann:
u = a.getObject()
if '/A' in u.keys():
if re.search(re.compile('^https://doi.org'), u['/A']['/URI']): # 排除其他形式的链接
if u['/A']['/URI'] != old: # 排除重复链接
print(i0 , u['/A']['/URI'])
links.append(u['/A']['/URI']) # 链接存在link数组中
i0 += 1
old = u['/A']['/URI']
return links
def download(links):
for i0 in [0, 1, 3]: # 指定参考文献下载,如需全部下载用for i0 in range(links.shape[0]):
address = links[i0]
r = requests.post('https://sci-hub.st/', data={'request': address})
print('\n响应结果是:', r)
print('访问的地址是:', r.url)
soup = BeautifulSoup(r.text, features='lxml')
pdf_URL = soup.embed['src']
# pdf_URL = soup.iframe['src'] # This is a code line of history version which fails to get pdf URL.
if re.search(re.compile('^https:'), pdf_URL):
pass
else:
pdf_URL = 'https:'+pdf_URL
print('PDF的地址是:', pdf_URL)
name = re.search(re.compile('fdp.*?/'),pdf_URL[::-1]).group()[::-1][1::]
print('PDF文件名是:', name)
print('保存的位置在:', os.getcwd())
print('\n正在下载第',i0,'篇')
r = requests.get(pdf_URL, stream=True)
with open(name, 'wb') as f:
for chunk in r.iter_content(chunk_size=32):
f.write(chunk)
print('第',i0,'篇下载完成!')
print('\n全部下载完成!')
if __name__ == '__main__':
main()
以上代码的效果不一定稳定。如有遇到某篇下载失败的情况,可以指定从某篇开始继续尝试下载。
参考资料:
[1] PyPDF2的使用
【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com】
师兄有没有办法可以爬某个小方向的所有文章啊,比如输入是关键词或者某篇文章的DOI,输出就是几十篇百来篇最相关相近的文章
推荐这个网站:https://www.connectedpapers.com/。也可以通过APS等期刊的官网,直接搜关键词,有筛选时间范围的。此外,一些官网也可以看到某篇文章的引用情况。
用爬虫是可以模拟访问APS等期刊上搜索框,并下载文章,但没什么必要,容易下载到很多无用的文献,而且IP地址可能会被封。建议是搜索后先经过简单的阅读筛选,再下载相关文献。