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

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

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

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

一、代码分析

代码分析的详细思路跟以往依旧如此雷同,逃不过的还是:抓包分析->模拟请求->代码整合。由于一会儿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.text

soup = BeautifulSoup(html, "html.parser")

iframe = soup.find(id="pdf")

if iframe == None: # 未找到相应文章

return ""

else:

downUrl = iframe["src"]

if "http" not in downUrl:

downUrl = "https:"+downUrl

return 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 BeautifulSoup

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.text

soup = BeautifulSoup(html, "html.parser")

iframe = soup.find(id="pdf")

if iframe == None: # 未找到相应文章

return ""

else:

downUrl = iframe["src"]

if "http" not in downUrl:

downUrl = "https:"+downUrl

return downUrl

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

def 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实现一个论文下载器的过程的文章就介绍到这了,更多相关python论文下载器内容请搜索云海天教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持云海天教程!

python下载论文_Python实现一个论文下载器的过程相关推荐

  1. python课程论文_python结课论文_python论文_工程伦理结课论文文库

    关于python爬虫的实验论文怎么写 叙述和描写为主,但往往兼有抒情和议论,是一种形式多样,笔墨灵活的文体,也是最广泛的文体.论文写作,是把自己的亲身感受和经历通过生动.形象的语言,描述给读者.论文. ...

  2. python教程app下载地址_Python爬取APP下载链接的实现方法

    首先是准备工作 Python 2.7.11:下载python 其中python2和python3目前同步发行,我这里使用的是python2作为环境.Pycharm是一款比较高效的Python IDE, ...

  3. python专属壁纸_Python开发专属壁纸下载与轮换程序

    本人对于壁纸一直偏佛系,不爱特意去找一堆壁纸.因此用Python简单地搞了一个自动下载壁纸,定时随机轮换的功能来自娱自乐,顺便分享给大家. 原文链接:查看 准备 下载安装Python3 官网下载即可, ...

  4. Python:用tkinter制做一个音乐下载小软件

    人生苦短,我用Python 平常我们下载的歌曲,都是各种妖魔鬼怪的格式横行,想下载下来用一下都不行,还只能在它的播放器内听,这谁受得了~ 学Python是用来干嘛的? 当然是解决问题咯~ 于是我直接写 ...

  5. python 批量下载知网(cnki)论文_Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记...

    ‍Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记‍ 由于需要也是为了督促自己学习新的东西,我原本想要尝试着写一个爬虫程序,能够在cnki上自动得将论文进行批量 ...

  6. python 批量下载知网(cnki)论文_Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记 顶...

    ‍Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记‍ 由于需要也是为了督促自己学习新的东西,我原本想要尝试着写一个爬虫程序,能够在cnki上自动得将论文进行批量 ...

  7. python requests下载图片_Python requests库如何下载一个图片资源

    原文地址https://blog.csdn.net/u011541946/article/details/77700074 前面一篇文章介绍了response对象的一些常用API,也已经提到,我们的重 ...

  8. python主题壁纸_Python教你如何下载你喜欢的桌面壁纸

    相关知识 1.URL处理模块(库) import urllib.request as req 2.创建一个表示远程url的类文件对象 req.urlopen(' ') 3.导入re包(正规表达式包) ...

  9. 用python画写轮眼_Python爬虫入门-图片下载(写轮眼--Lyon)

    Python小白最近入了爬虫的坑,但是一直到前天为止我会的只会简单的爬取网页上的文本信息,比如什么 豆瓣上的书评 ,知乎上红人的关注者 --一些很简单的爬虫.就在昨天我无聊闲暇在逛知乎偶然发现Lyon ...

最新文章

  1. linux C 多线程编程
  2. Java反射机制实例解析
  3. JavaScript之Style属性学习
  4. 易宝典文章——用ISA 2006标准版发布Exchange 2010的OWA系列之外网客户端
  5. 7、ShardingSphere 之 Sharding-Proxy
  6. JavaScript V8引擎编译
  7. 接口传值后不起作用_聊一聊 API 接口测试
  8. scATAC-seq建库原理,质控方法和新R包Signac的使用
  9. c# oldb连接_(转)C#连接OleDBConnection数据库的操作
  10. python小课文件_[Python]小甲鱼Python视频第030课(文件系统:介绍一个高大上的东西)课后题及参考解答...
  11. 【模拟信号】基于matlab标准调幅信号产生+解调【含Matlab源码 984期】
  12. 绿盟漏洞扫描工具_IDC盘点2020上半年中国安全市场绿盟科技再获响应和编排能力认可...
  13. 新会计准则与旧版内容的不同比较
  14. 大众点评字体反爬解析
  15. 自然语言处理系统NLP之拼写纠错
  16. 浊音、清音、爆破音音频分析
  17. 〖Python自动化办公篇⑤〗- 文件自动化管理 - 清理重复的文件与批量修改文件名
  18. 节省处理HPC数据泛滥开支的可用工具
  19. Dx 10 与 Dx 9 的一些技术区别
  20. 集群搭建系列(八)Kafka

热门文章

  1. 达摩院 2020 预测:感知智能的“天花板”和认知智能的“野望”
  2. 玩转容器,首先你得登上青云梯
  3. 软件核心研发迎来又一春!
  4. 我如何不再是一个可怕的“10 倍经理”?
  5. 任正非:鸿蒙最快1年可媲美iOS;首例Apple Card用户遭盗刷;Firefox 69.0.3 发布 | 极客头条...
  6. 吊打 IE、Firefox,谷歌 Chrome 十年封神记
  7. 软件正在吞噬整个世界?!
  8. 直击平昌!2天40位大咖的平昌区块链论坛精华都在这了!
  9. 微软力挺 Go,宣布参与 Athens 项目和 GopherSource
  10. @程序员,技术债你还清了吗?