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生成随机验证码的两种方法
Dec 22 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
Dec 31 Python
图解Python变量与赋值
Apr 03 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
Feb 18 Python
Django REST framework内置路由用法
Jul 26 Python
python 提取文件指定列的方法示例
Aug 07 Python
python读写文件write和flush的实现方式
Feb 21 Python
windows下Pycharm安装opencv的多种方法
Mar 05 Python
python实现密码强度校验
Mar 18 Python
pytorch加载自己的图像数据集实例
Jul 07 Python
PyTorch中的torch.cat简单介绍
Mar 17 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
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
php获取文件类型和文件信息的方法
2015/07/10 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
jQuery实现放大镜效果实例代码
2016/03/17 Javascript
微信小程序 navigation API实例详解
2016/10/02 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
js实现筛选功能
2020/11/24 Javascript
python显示生日是星期几的方法
2015/05/27 Python
Python的re模块正则表达式操作
2016/05/25 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
Python反射用法实例简析
2017/12/22 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
应届毕业生个人自我评价
2013/09/20 职场文书
财务出纳员岗位职责
2013/11/26 职场文书
12岁生日感言
2014/01/21 职场文书
个人作风建设自查报告
2014/10/22 职场文书
碧霞祠导游词
2015/02/09 职场文书
军训结束新闻稿
2015/07/17 职场文书
新郎结婚感言
2015/07/31 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis