Python专题, 语言

用Python下载某篇文献中的参考文献

当对某篇文献特别感兴趣,想要一次性下载指定的十几篇或者几十篇参考文献时,可通过爬虫来下载某篇文献中指定或所有的参考文献。需要说明的是:虽然通过这种方式下载效率提高了,但不建议这么做,建议需要阅读哪篇就只下载哪篇。

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的使用

[2] 在Python中从PDF中提取超链接

1,621 次浏览

【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com

评论说明:
(1)在保留浏览器缓存的前提下,目前支持72小时自主修改或删除个人评论。如果自己无法修改或删除评论,可再次评论或联系我。如有发现广告留言,请勿点击链接,博主会不定期删除。
(2)评论支持Latex公式。把latexpage作为标签放在任何位置,评论中的公式可正常编译,示例:
$Latex formula$  [latexpage]

3 thoughts on “用Python下载某篇文献中的参考文献”

  1. 师兄有没有办法可以爬某个小方向的所有文章啊,比如输入是关键词或者某篇文章的DOI,输出就是几十篇百来篇最相关相近的文章

    1. 用爬虫是可以模拟访问APS等期刊上搜索框,并下载文章,但没什么必要,容易下载到很多无用的文献,而且IP地址可能会被封。建议是搜索后先经过简单的阅读筛选,再下载相关文献。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注