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中使用语句导入模块或包的机制研究
Mar 30 Python
Python实现队列的方法
May 26 Python
Python面向对象编程基础解析(一)
Oct 26 Python
Python实现进程同步和通信的方法
Jan 02 Python
python根据unicode判断语言类型实例代码
Jan 17 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 Python
python实现数独游戏 java简单实现数独游戏
Mar 30 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
Jul 09 Python
利用python实现短信和电话提醒功能的例子
Aug 08 Python
Python datetime包函数简单介绍
Aug 28 Python
让Django的BooleanField支持字符串形式的输入方式
May 20 Python
python实现图片转字符画
Feb 19 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
Yii2 RESTful中api的使用及开发实例详解
2016/07/06 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
JavaScript实现MIPS乘法模拟的方法
2015/04/17 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
ionic实现滑动的三种方式
2016/08/27 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
2017/08/25 Javascript
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
js前端对于大量数据的展示方式及处理方法
2020/12/02 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS NE
2014/05/22 DOTA
[37:37]DAC2018 4.4 淘汰赛 Optic vs Mineski 第二场
2018/04/05 DOTA
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
Python实现的密码强度检测器示例
2017/08/23 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
Fanatics官网:运动服装、球衣、运动装备
2020/10/12 全球购物
大学毕业生简单自荐信
2013/11/05 职场文书
公司周年庆典邀请函
2014/01/12 职场文书
学生会离职感言
2014/02/11 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
高三霸气励志标语
2014/06/24 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
运动会通讯稿200字
2015/07/20 职场文书
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python