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 ZipFile模块详解
Nov 01 Python
Python KMeans聚类问题分析
Feb 23 Python
python实现微信防撤回神器
Apr 29 Python
java中的控制结构(if,循环)详解
Jun 26 Python
Python Web程序搭建简单的Web服务器
Jul 31 Python
python解释器spython使用及原理解析
Aug 24 Python
python 遍历pd.Series的index和value
Nov 26 Python
python实现名片管理器的示例代码
Dec 17 Python
基于keras 模型、结构、权重保存的实现
Jan 24 Python
如何提高python 中for循环的效率
Apr 15 Python
Python2与Python3关于字符串编码处理的差别总结
Sep 07 Python
python SOCKET编程基础入门
Feb 27 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积分兑换接口实例
2015/02/09 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
jquery maxlength使用说明
2011/09/09 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
js的三种继承方式详解
2017/01/21 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
Angular5中状态管理的实现
2018/09/03 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
vue中npm包全局安装和局部安装过程
2019/09/03 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
在vue中使用console.log无效的解决
2020/08/09 Javascript
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
python操作ie登陆土豆网的方法
2015/05/09 Python
Python实现栈的方法
2015/05/26 Python
python 中的divmod数字处理函数浅析
2017/10/17 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
python zip()函数的使用示例
2020/09/23 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
大学生暑期实践感言
2014/02/26 职场文书
环境建设实施方案
2014/03/14 职场文书
毕业生找工作自荐书
2014/06/30 职场文书
早会开场白台词大全
2015/06/01 职场文书
呐喊读书笔记
2015/06/30 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书
Java 在线考试云平台的实现
2021/11/23 Java/Android