Python批量下载参考文献|基于Python的Sci-Hub下载脚本|Python批量下载sci-hub文献|如何使用sci-hub批量下载论文

news2024/12/26 12:40:31

本篇博文将介绍如何通过Python的代码实现快速下载指定DOI号对应的文献,并且使用Sci-Hub作为下载库。

一、库函数准备

在开始之前,我们需要先安装一些必要的库,包括:

  1. requests:发送HTTP请求并获取响应的库;
  2. beautifulsoup4:用于解析HTML页面;
  3. threading:用于实现多线程处理;

这些库可以通过pip命令进行安装,具体命令如下:

pip install requests
pip install BeautifulSoup
pip install threading

除此之外,还需要在代码所在目录下创建一个名为“papers”的文件夹,用于保存下载下来的文献。同时,需要准备一个包含多个DOI号的txt文件,每个DOI号占一行。
在这里插入图片描述

二、实现步骤

整个下载过程大致可以分为以下几个步骤:

  1. 读取存储有DOI号的txt文件;
  2. 构造Sci-Hub链接并发送HTTP请求;
  3. 解析HTML页面,获取文献下载链接;
  4. 下载文献并保存到本地文件夹;
  5. 记录下载成功或失败的情况。

三、实现算法

代码通过读取txt文件中的doi号来拼接Sci-Hub的链接,然后解析得到文献下载链接并进行下载

定义了HTTP请求需要的请求头;接着定义了一个download_paper()函数,用于下载文献并保存到本地,其中doi参数是需要下载的文献的DOI号;在 download_paper() 函数内,我们首先根据DOI号构造了Sci-Hub链接,并发送HTTP请求;然后通过解析HTML页面,获取到了文献的下载链接,并使用requests库下载文献到本地,并将下载成功和失败的信息输出到控制台或记录到一个日志文件中;最后,我们打开存储有DOI号的txt文件,并遍历其中的每一行,调用download_paper()函数下载对应的文献。

需要注意的是,由于Sci-Hub常常会更换域名,因此在实际应用中,我们需要通过浏览器访问Sci-Hub,找到当前可用的域名,并将其替换到上述代码中的链接中。

四、加速下载

虽然上述代码已经可以完成文献下载的任务,但是由于单线程下载速度较慢,因此我们可以使用多线程来加速下载过程。具体来说,我们可以将需要下载文献的DOI号作为参数传递给download_paper()函数,并创建多个线程来并行下载文献。下面是一种使用多线程下载文献的代码实现方式:

import requests
from bs4 import BeautifulSoup
import os
import threading

# 创建papers文件夹用于保存文献
path = "C:/Users/ypzhao/Desktop/papers/"
if not os.path.exists(path):
    os.mkdir(path)

# 请求头
head = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36"
}

# 下载文献的函数
def download_paper(doi):
    # 拼接Sci-Hub链接
    url = "https://www.sci-hub.ren/" + doi + "#"
    
    try:
        download_url = ""
        
        # 发送HTTP请求并解析HTML页面
        r = requests.get(url, headers=head)
        r.raise_for_status()
        soup = BeautifulSoup(r.text, "html.parser")
        
        # 解析得到文献下载链接
        if soup.iframe == None:
            download_url = "https:" + soup.embed.attrs["src"]
        else:
            download_url = soup.iframe.attrs["src"]
        
        # 下载文献并保存到文件
        print(doi + "\t正在下载\n下载链接为\t" + download_url)
        download_r = requests.get(download_url, headers=head)
        download_r.raise_for_status()
        with open(path + doi.replace("/", "_") + ".pdf", "wb+") as temp:
            temp.write(download_r.content)

        print(doi + "\t文献下载成功.\n")

    # 下载失败时记录错误信息
    except Exception as e:
        with open("error.log", "a+") as error:
            error.write(doi + "\t下载失败!\n")
            if download_url.startswith("https://"):
                error.write("下载url链接为: " + download_url + "\n")
            error.write(str(e) + "\n\n")

# 打开包含doi号的txt文件
with open(path + "doi.txt", "r", encoding="utf-8") as f:
    # 遍历读取doi号,并启动多线程下载文献
    threads = []
    for line in f:
        doi = line.strip()
        t = threading.Thread(target=download_paper, args=(doi,))
        threads.append(t)
    
    # 启动所有线程
    for t in threads:
        t.start()

    # 等待所有线程完成
    for t in threads:
        t.join()

五、运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/609246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

南山城市更新--向南村(一期,二期)项目详情

向南村(一期)城市更新单元项目简介 项目于2010年被列入《深圳城市更新单元规划制定计划第一批计划》中,申报主体为向南实业股份有限公司,后与恒大合作开发。 项目位于南山区桂庙路南侧,毗邻前海、衔接后海&am…

经典算法:Fenwick Tree

经典算法:Fenwick Tree 1. 算法简介2. 原理介绍3. 算法实现4. 例题说明 1. 解题思路2. 代码实现 5. 参考链接 1. 算法简介 Fenwick Tree又称为Binary Indexed Tree,也算是一种常见的数据结构了。 他其实某种意义上来说算是Segment Tree的一种变体&…

克隆虚拟机

上一篇我们已经讲过了启动虚拟机并安装Linux系统,下面我们来讲一下如何通过已经创建好的虚拟机spark01克隆出spark02和spark03来,从而满足搭建大数据集群环境需要多台虚拟机的需求。 首先我们要理解两个概念: 1.完整克隆 完整克隆的虚拟机可…

【算法证明 三】计算顺序统计量的复杂度

计算顺序统计量,在 c 标准库中对应有一个函数:nth_element。其作用是求解一个数组中第 k 大的数字。常见的算法是基于 partition 的分治算法。不难证明这种算法的最坏复杂度是 Θ ( n 2 ) \Theta(n^2) Θ(n2)。但是其期望复杂度是 Θ ( n ) \Theta(n) …

从源码全面解析 dubbo 服务暴露的来龙去脉

👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,阿里云专家博主📕系列专栏:Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

SpringBoot配置 -- SpringBoot快速入门保姆级教程(二)

文章目录 前言二、SpringBoot配置1. 了解配置文件的3种格式2.yaml格式语法规则3.读取yaml数据的3种方式4.多环境开发配置5.多环境命令行启动参数设置6. 多环境开发兼容问题7.配置文件分类 总结 前言 为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客&am…

vcruntime140.dll如何修复

VCRUNTIME140.dll是Windows操作系统上一个非常重要的动态链接库文件,它是由Microsoft Visual C Runtime提供的运行时库文件之一,被许多应用程序用来进行编译和运行。如果该文件丢失或损坏,很多应用程序就无法正常运行,这可能会带来…

三分钟了解SpringBoot配置优先级底层源码解析

👏作者简介:大家好,我是冰点,从业11年,目前在物流独角兽企业从事技术方面工作,🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人📝联系…

关于性能测试平台的一些想法,想跟大家聊一下

目录 一、任务管理 二、用例管理 三、环境管理 四、压测机管理 五、数据管理 六、监控管理 七、日志管理 八、报表管理 九、配置管理 十、系统管理 组织架构 这里我按照每个不同系统归属的项目组为横向,性能测试团队作为职能部门为纵向的矩阵式组织架构为…

JUC学习(二)

目录 Doug Lea — JUC并发包的作者锁框架Lock和Condition接口可重入锁公平锁与非公平锁读写锁锁降级和锁升级队列同步器AQS底层实现公平锁一定公平吗?Condition实现原理 ——————————————————————————————— 在前面,我们了解…

ICV报告:乘光伏新能源汽车之势,功率器件蓄势待发

前言: 电力电子器件(Power Electronic Device),又称为功率半导体器件,用于电能变换和电能控制电路中的大功率(通常指电流为数十至数千安,电压为数百伏以上)电子器件。功率器件能够承受和控制较大电流、电压…

无限阳光、自动收集阳光CALL、阳光产生速度

简单实现无限阳光 本次实验内容:通过逆向分析植物阳光数量的动态地址找到阳光的基址与偏移,从而实现每次启动游戏都能够使用基址加偏移的方式定位阳光数据,最后我们将通过使用C语言编写通用辅助实现简单的无限阳光外挂,在教程开始…

Vue Router路由管理器

目录: 相关理解基本路由几个注意事项嵌套(多级)路由路由的query参数命名路由路由的params参数路由的props配置路由跳转的replace方法编程式路由导航缓存路由组件activated和deactivated路由守卫路由器的两种工作模式 相关理解 vue-route…

博学谷学习记录】超强总结,用心分享 | 架构师 敏捷开发 学习总结

文章目录 敏捷开发1. 概述2. 敏捷开发 敏捷开发 1. 概述 随着软件开发技术的不断发展,现在出现了很多种不同的开发模式,其实敏捷开发已经成为现在很多企业开发应用程序都想要选择的开发方案,那么什么是敏捷开发呢?1.1 四种开发模…

Linux 配置Java环境(一)

Linux 配置Java环境 一、配置Java环境1、查看系统是否有java环境2、卸载系统自带的jdk3、创建一个文件夹用于存放java的压缩包4、包下载好的jdk拖到java文件夹5、安装jdk6、配置环境变量7、让配置生效8、验证是否配置成功 一、配置Java环境 1、查看系统是否有java环境 输入指…

nginx中location和rewrite

常用的Nginx 正则表达式 ^ :匹配输入字符串的起始位置 $ :匹配输入字符串的结束位置 * :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” :匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll…

0-1背包问题:动态规划的经典应用

文章目录 引言背包问题简介0-1背包问题定义0-1背包问题的限制条件 动态规划解决思路状态定义状态转移方程 背包问题的Java实现示例与分析 总结 引言 背包问题是在给定一组物品和一个背包容量的情况下,如何选择物品放入背包,以使得放入背包的物品总价值最…

高边功率开关参数Load current(ISO)和Nominal current

1. IL(nom)是没有加散热片的情况下,考虑RON和BTS6133D与环境热阻计算得到的电流值; 2. IL(iso)是有散热片的情况下计算得到的电流值; 3. IL12(SC)是如果负载电流达到75A以上,BTS6143D会通过不断重启来来限制电流在75A以下。

【论文简述】GeoMVSNet: Learning Multi-View Stereo with Geometry Perception(CVPR 2023)

一、论文简述 1. 第一作者:Jie Zhu 2. 发表年份:2023 3. 发表期刊:CVPR 4. 关键词:MVS、级联结构、几何感知、频域增强、高斯混合模型 5. 探索动机:基于级联的结构以从粗到细的方式计算不同分辨率的深度图&#x…

数据结构与算法练习(二)数组模拟队列

文章目录 1、队列2、数组实现队列3、数组实现循环队列 1、队列 队列是一个有序列表,可以用数组或链表来实现 遵循先入先出的原则 在队尾插入元素叫做入队,对头删除元素叫做出队。2、数组实现队列 思路: 用front和rear记录队列前后的下标&a…