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网络爬虫采集联想词示例
Feb 11 Python
python操作xml文件详细介绍
Jun 09 Python
Python中AND、OR的一个使用小技巧
Feb 18 Python
python使用Flask框架获取用户IP地址的方法
Mar 21 Python
详解在Python程序中自定义异常的方法
Oct 16 Python
教你用Python创建微信聊天机器人
Mar 31 Python
对python中if语句的真假判断实例详解
Feb 18 Python
详解Python中pandas的安装操作说明(傻瓜版)
Apr 08 Python
Python中@property的理解和使用示例
Jun 11 Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 Python
详解Python 中的容器 collections
Aug 17 Python
PyQt5 QThread倒计时功能的实现代码
Apr 02 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自动识别字符集并完成转码详解
2013/08/02 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
2013/08/23 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
2015/02/28 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
JS获得多个同name 的input输入框的值的实现方法
2017/01/09 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
用Node编写RESTful API接口的示例代码
2018/07/04 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
Python中针对函数处理的特殊方法
2014/03/06 Python
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
python生成器与迭代器详解
2019/01/01 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
python ubplot使用方法解析
2020/01/10 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
如何用SQL语句进行模糊查找
2015/09/25 面试题
自荐信怎么写好
2013/11/11 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
养成教育工作总结
2015/08/13 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle
table不让td文字溢出操作方法
2022/12/24 HTML / CSS