利用excel内的doi和python批量下载外文文献

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

利用web of science 批量获取doi至表格,之后通过运行python代码,自动批量下载文献
我用的python3.7,在Anaconda里运行的


提示:其中,python代码是根据WuGenQiang(《通过doi下载单个文献pdf》)的代码修改的(本人python没学多少,所以代码不规范,见谅)。

一、将选择的文献用excel导出

1.文献按Excel导出

在web of science内检索完自己想要的文献后,选择自己需要的文献,然后点击<将记录导出至Excel>,记录内容改为<全纪录>,点导出

在这里插入图片描述

2. 将DOI另存在一个excel中,存为xlsx格式

直接用导出的excel,会出错,可能是我调用excel的类型不对?只能读取xlsx?不太清楚,懒得试了,有兴趣的小伙伴可以自己试试
在这里插入图片描述

二、利用python批量下载Excel表中文献

将代码保存至F:\doi_download.py(也可设为其他),将excel挪到F盘,将下面代码的doi所在列改成A列,然后运行就行了。

2.代码

# -*- coding: utf-8 -*-
"""
Created on Sun Jun  6 21:09:44 2021

@author: dell
"""


"""
这是原作者的信息
@File: version_1.1_doi_to_get_pdf.py
@Time: 2021/4/20 10:10 下午
@Author: genqiang_wu@163.com
@desc: 通过doi号下载文献pdf
"""

import requests
import re
import os
import urllib.request
import openpyxl

# headers 保持与服务器的会话连接
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36',
}

'''
根据doi,找到文献的pdf,然后下载到本地
'''


def getPaperPdf(url):
    pattern = '/.*?\.pdf'
    content = requests.get(url, headers=headers)
    download_url = re.findall(pattern, content.text)
    # print(download_url)
    download_url[1] = "https:" + download_url[1]
    print(download_url[1])
    path = r"papers"
    if os.path.exists(path):
        pass
    else:
        os.makedirs(path)

    # 使用 urllib.request 来包装请求
    req = urllib.request.Request(download_url[1], headers=headers)
    # 使用 urllib.request 模块中的 urlopen方法获取页面
    u = urllib.request.urlopen(req, timeout=5)

    file_name = download_url[1].split('/')[-2] + '%' + download_url[1].split('/')[-1]
    f = open(path + '/' + file_name, 'wb')

    block_sz = 8192
    while True:
        buffer = u.read(block_sz)
        if not buffer:
            break
        f.write(buffer)
    f.close()
    print("Sucessful to download" + " " + file_name)
'''
将表格放在代码保存和运行的路径内,将wb变量内的'n0606.xlsx'改为自己的excel文件名,
最后下载的论文在该路径下新建的papers文件夹内
'''
wb = openpyxl.load_workbook('n0606.xlsx')
#doi在sheet1中
sheet1 = wb.get_sheet_by_name('Sheet1')
#读取第A列

'''
修改代码内,excel中DOI所在列,我的在BC,所以col_range变量后面的字符改为了‘BC’
'''
col_range = sheet1['A']
# 读取其中的第几行:row_range = sheet1[2:6]
fails=[]


 #以下代码加入了我找的其他SCI-hub网址,不需要可以删除一些
for col in col_range: # 打印BC两列单元格中的值内容
    doi=col.value
    print (doi)
    if __name__ == '__main__':
        sci_Hub_Url = "https://sci-hub.ren/"
        paper_url = sci_Hub_Url + doi
        print(paper_url)
        nmm=0
        try:
            getPaperPdf(paper_url)  # 通过文献的url下载pdf
            continue
        except Exception:
            nmm=1
            print("Failed to get pdf 1"  )         
        if nmm==1:
            try :
                sci_Hub_Url_2 = "https://sci-hub.se/"
                paper_url_2 = sci_Hub_Url_2 + doi
                getPaperPdf(paper_url_2)
                
                continue
            except Exception:
                print("Failed to get pdf 2")
        if nmm==1:
            try :
                sci_Hub_Url_3 = "https://sci-hub.st/"
                paper_url_3 = sci_Hub_Url_3 + doi
                getPaperPdf(paper_url_3)
                continue
            except Exception:
                print("Failed to get pdf 3")
        if nmm==1:
            try :
                sci_Hub_Url_4 = "https://sci-hub.shop/"
                paper_url_4 = sci_Hub_Url_4 + doi
                getPaperPdf(paper_url_4)
                continue
            except Exception:
                print("Failed to get pdf 4")
        if nmm==1:
            try :
                sci_Hub_Url_5 = "https://sci-hub.shop/"
                paper_url_5 = sci_Hub_Url_5 + doi
                getPaperPdf(paper_url_5)
                continue
            except Exception:
                print("Failed to get pdf 5")          
        if nmm==1:
            try :
                sci_Hub_Url_7 = "https://sci-hub.do/"
                paper_url_7 = sci_Hub_Url_7 + doi
                getPaperPdf(paper_url_7)
                continue
            except Exception:
                print("Failed to get pdf 7")    
        if nmm==1:
            try :
                sci_Hub_Url_6 = "https://libgen.ggfwzs.net/"
                paper_url_6 = sci_Hub_Url_6 + doi
                getPaperPdf(paper_url_6)
                continue
            except Exception:
                print("Failed to get pdf 6")
                fails.append(doi)
                
#获取下载失败的doi
print (fails)

结果展示图在这里。
在这里插入图片描述

总结

根据上面写的就可以根据excel的DOI批量下载论文了,不过有一些会失败,那种可能就要手动了,我自己感觉还可以,大家可以试试。
另:python实在不行,所以根据别人代码改的(强调!!!),我加的那些让代码看起来很啰嗦,有更好的写法,欢迎大家告诉我,感恩

  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值