Python实现一个论文下载器的过程


Posted in Python onJanuary 18, 2021

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

Python实现一个论文下载器的过程

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

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

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

Python实现一个论文下载器的过程

一、代码分析

代码分析的详细思路跟以往依旧如此雷同,逃不过的还是:抓包分析->模拟请求->代码整合。由于一会儿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创建XML文档
Mar 01 Python
python制作花瓣网美女图片爬虫
Oct 28 Python
Python实现模拟登录网易邮箱的方法示例
Jul 05 Python
python调用百度语音识别实现大音频文件语音识别功能
Aug 30 Python
解决安装pycharm后不能执行python脚本的问题
Jan 19 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
python获取引用对象的个数方式
Dec 20 Python
pytorch:torch.mm()和torch.matmul()的使用
Dec 27 Python
Python利用全连接神经网络求解MNIST问题详解
Jan 14 Python
Python基础之字符串操作常用函数集合
Feb 09 Python
python如何写出表白程序
Jun 01 Python
python RSA加密的示例
Dec 09 Python
利用python为PostgreSQL的表自动添加分区
Jan 18 #Python
如何查看python关键字
Jan 17 #Python
Python日志打印里logging.getLogger源码分析详解
Jan 17 #Python
Python中的面向接口编程示例详解
Jan 17 #Python
Python学习之time模块的基本使用
Jan 17 #Python
python中re模块知识点总结
Jan 17 #Python
史上最详细的Python打包成exe文件教程
Jan 17 #Python
You might like
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
使用vuex较为优雅的实现一个购物车功能的示例代码
2019/12/09 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
Python中使用partial改变方法默认参数实例
2015/04/28 Python
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
Linux下将Python的Django项目部署到Apache服务器
2015/12/24 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
2019/04/05 Python
判断Threading.start新线程是否执行完毕的实例
2020/05/02 Python
CSS3 渐变(Gradients)之CSS3 径向渐变
2016/07/08 HTML / CSS
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
彩色的非洲教学反思
2014/02/18 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
公司离职证明标准样本
2014/10/05 职场文书
转让协议书
2015/01/27 职场文书
学校通报表扬范文
2015/05/04 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
Java输出Hello World完美过程解析
2021/06/13 Java/Android
浅谈Python响应式类库RxPy
2021/06/14 Python