在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以帮助我们搜索相关论文并下载其原文。可以说,SCI-HUB造福了众多科研人员,用起来也是“美滋滋”。

然而,当师姐告诉我:“xx,可以帮我下载几篇文献嘛?”。乐心助人的我自当是满口答应了,心想:“这种小事就交给我叭~”

于是乎,我收到了一个excel文档,66篇论文的列表安静地趟在里面(此刻心中碎碎念:“这尼玛,是几篇嘛...”)。我粗略算了一下,复制、粘贴、下载,一套流程走下来,每篇论文少说也得30秒,66篇的话....啊,这不能忍!

很显然,一篇一篇的下载,不是我的风格所以,我决定写一个论文下载器助我前行。

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:810735403

一、代码分析

代码分析的详细思路跟以往依旧如此雷同,逃不过的还是:抓包分析->模拟请求->代码整合。由于一会儿kimol君还得去搬砖,今天就不详细展开了。

1. 搜索论文

通过论文的URL、PMID、DOI号或者论文标题等搜索到对应的论文,并通过bs4库找出PDF原文的链接地址,代码如下:

def search_article(artName):'''搜索论文---------------输入:论文名---------------输出:搜索结果(如果没有返回"",否则返回PDF链接)'''url = 'https://www.sci-hub.ren/'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding':'gzip, deflate, br','Content-Type':'application/x-www-form-urlencoded','Content-Length':'123','Origin':'https://www.sci-hub.ren','Connection':'keep-alive','Upgrade-Insecure-Requests':'1'}data = {'sci-hub-plugin-check':'','request':artName}res = requests.post(url, headers=headers, data=data)html = res.textsoup = BeautifulSoup(html, 'html.parser')iframe = soup.find(id='pdf')if iframe == None: # 未找到相应文章return ''else:downUrl = iframe['src']if 'http' not in downUrl:downUrl = 'https:'+downUrlreturn downUrl

2. 下载论文

得到了论文的链接地址之后,只需要通过requests发送一个请求,即可将其下载:

def download_article(downUrl):'''根据论文链接下载文章----------------------输入:论文链接----------------------输出:PDF文件二进制'''headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding':'gzip, deflate, br','Connection':'keep-alive','Upgrade-Insecure-Requests':'1'}res = requests.get(downUrl, headers=headers)return res.content

二、完整代码

将上述两个函数整合之后,我的完整代码如下:

# -*- coding: utf-8 -*-
"""
Created on Tue Jan  5 16:32:22 2021@author: kimol_love
"""
import os
import time
import requests
from bs4 import BeautifulSoupdef search_article(artName):'''搜索论文---------------输入:论文名---------------输出:搜索结果(如果没有返回"",否则返回PDF链接)'''url = 'https://www.sci-hub.ren/'headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding':'gzip, deflate, br','Content-Type':'application/x-www-form-urlencoded','Content-Length':'123','Origin':'https://www.sci-hub.ren','Connection':'keep-alive','Upgrade-Insecure-Requests':'1'}data = {'sci-hub-plugin-check':'','request':artName}res = requests.post(url, headers=headers, data=data)html = res.textsoup = BeautifulSoup(html, 'html.parser')iframe = soup.find(id='pdf')if iframe == None: # 未找到相应文章return ''else:downUrl = iframe['src']if 'http' not in downUrl:downUrl = 'https:'+downUrlreturn downUrldef download_article(downUrl):'''根据论文链接下载文章----------------------输入:论文链接----------------------输出:PDF文件二进制'''headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding':'gzip, deflate, br','Connection':'keep-alive','Upgrade-Insecure-Requests':'1'}res = requests.get(downUrl, headers=headers)return res.contentdef welcome():'''欢迎界面'''os.system('cls')title = '''_____  _____ _____      _    _ _    _ ____  / ____|/ ____|_   _|    | |  | | |  | |  _ \ | (___ | |      | |______| |__| | |  | | |_) |\___ \| |      | |______|  __  | |  | |  _ < ____) | |____ _| |_     | |  | | |__| | |_) ||_____/ \_____|_____|    |_|  |_|\____/|____/'''print(title)if __name__ == '__main__':while True:welcome()request = input('请输入URL、PMID、DOI或者论文标题:')print('搜索中...')downUrl = search_article(request)if downUrl == '':print('未找到相关论文,请重新搜索!')else:print('论文链接:%s'%downUrl)print('下载中...')pdf = download_article(downUrl)with open('%s.pdf'%request, 'wb') as f:f.write(pdf)print('---下载完成---')time.sleep(0.8)

不出所料,代码一跑,我便轻松完成了师姐交给我的任务,不香嘛?

最后

在这里还是要推荐下我自己建的Python开发交流学习(qq)群:810735403,群里都是学Python开发的,如果你正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2021最新的Python进阶资料和高级开发教程,欢迎进阶中和想深入Python的小伙伴!

Python实现一个论文下载器相关推荐

  1. python下载论文_Python实现一个论文下载器的过程

    在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以帮助我们搜索相关论文并下载其原文.可以说,SCI-HUB造福了众多科研人员,用起来也是&q ...

  2. python批量下载文件只有1kb_详解如何用python实现一个简单下载器的服务端和客户端...

    话不多说,先看代码: 客户端: import socket def main(): #creat: download_client=socket.socket(socket.AF_INET,socke ...

  3. 如何用python创建一个下载网站-详解如何用python实现一个简单下载器的服务端和客户端...

    话不多说,先看代码: 客户端: import socket def main(): #creat: download_client=socket.socket(socket.AF_INET,socke ...

  4. 【kimol君的无聊小发明】—用python写论文下载器

    [kimol君的无聊小发明]-用python写论文下载器 前言 一.代码分析 1. 搜索论文 2. 下载论文 二.完整代码 写在最后 前言 某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~ 当我打 ...

  5. 【Python】实现一个小说下载器,可以打包成exe(附原码)

    前言 闲的无聊,现在没得什么好剧追(你们或许可以给我推荐推荐) 朋友都在看小说,那我就来用Python搞一个小说下载器吧 顺便打包一下 实现步骤 爬虫基本四个步骤: 采集一章小说内容 发送请求, 模拟 ...

  6. 【kimol君的无聊小发明】—用python写论文下载器(图形化界面)

    [kimol君的无聊小发明]-用python写论文下载器(图形化界面) 前言 一.使用说明 二.代码分析 1. 功能函数 2. 回调函数 3. 线程生成函数 4. 效果展示 写在最后 前言 某个夜深人 ...

  7. python tkinter下载器_下载小说还要去找网站?Python使用tkinter打造一个小说下载器...

    前言 今天教大家用户Python GUI编程--tkinter 打造一个小说下载器,想看什么小说,就下载什么小说 先看下效果图 Tkinter 是使用 python 进行窗口视窗设计的模块.Tkint ...

  8. python 小说下载工具_使用tkinter打造一个小说下载器,想看什么小说,就下什么...

    前言 今天教大家用户Python GUI编程--tkinter 打造一个小说下载器,想看什么小说,就下载什么小说 先看下效果图 Tkinter 是使用 python 进行窗口视窗设计的模块.Tkint ...

  9. python多进程断点续传分片下载器

    python多进程断点续传分片下载器 标签:python 下载器 多进程 因为爬虫要用到下载器,但是直接用urllib下载很慢,所以找了很久终于找到一个让我欣喜的下载器.他能够断点续传分片下载,极大提 ...

最新文章

  1. ROS系统——roslaunch发布4个realsense相机的4种方法
  2. CodeForces 362C
  3. mysql 查询多边形_mysql中判断一个点是否在多边形中
  4. ORACLE HANDBOOK系列之九:时间与时区(Time and Time Zone)
  5. python整数和浮点数相乘_python中整数除法和浮点数到整数转换之间的区别是什么原因?...
  6. prim算法和kruskal算法(C语言)
  7. Defuse the Bombs Gym - 102822D
  8. mac docker搭建开发环境
  9. Quartz学习总结(1)——Spring集成Quartz框架
  10. 《python可以这样学》第一章
  11. android9.0官方下载,安卓9.0系统安装包下载
  12. java实时百分比进度条_Java 进度条百分比简单算法,根据数据量计算
  13. 手机系统S40 S60 是什么意思?
  14. ASPEN.HYSYS.V7.1,Thermoflow软件分享下载
  15. 强制删除“无法删除文件/文件夹”方法全集合
  16. 看看别人家的神仙公司
  17. Enovia add xxx.mql模板
  18. NLP之语言词素Morpheme(形态学)
  19. DBA日-周-月工作职责
  20. 该项目不在XXX中。请确认该项目的位置,然后重试。之解决办法

热门文章

  1. 机器深度学习的过程中盛传着7 个误解,我们来一一揭开
  2. 在ABAP的SQL语句中写Oracle Hints
  3. SSH服务端配置、优化加速、安全防护
  4. ConcurrentHashMap的扩容方法transfer源码详解
  5. Oracle的全文检索技术(转)
  6. 图文编排之HTML身份介绍浮动(图片换成自己的就行啦)
  7. 【算法训练营】 - ⑩ 并查集与图
  8. PhotoshopCS6常用快捷键
  9. 德国技术工人工资高吗
  10. idea crlf是什么意思