dtcms Android GraphQL 协程 Vue全家桶 firebase authentication canvas vuejs2 GMU photoshop视频教程全集下载 oracle添加索引 input边框颜色 python数据库 python输出 python的安装 java入门新手教程 学习java基础 java中class java框架学习 linuxsleep linux密码忘记 php抓取网页数据 keytool下载 黑市商人 远程桌面管理软件 显示器面板类型 python电子书 pr怎么放大视频画面 js字符转数字 有线网卡驱动下载 苹果手机验机软件 解压tar 压枪软件 现代操作系统 php保留两位小数 祸星龙 ps错误16 机械键盘光轴 唯品会客服在哪
当前位置: 首页 > 学习教程  > python

python自动下载论文_教你如何利用Python批量下载论文

2021/2/6 22:23:52 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

❝微信公众号:「Python干货铺子」关注即可开启快乐学习Python和Matlab的大门,您还在犹豫什么~❞前言❝某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~ 当我打开文件夹以回顾往事之余,惊现许多看似杂乱的无聊代码。…

微信公众号:「Python干货铺子」

关注即可开启快乐学习Python和Matlab的大门,您还在犹豫什么~

前言

某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~ 当我打开文件夹以回顾往事之余,惊现许多看似杂乱的无聊代码。我拍腿正坐,一个想法油然而生:“生活已然很无聊,不如再无聊些叭”。于是,我决定开一个专题,便称之为kimol君的无聊小发明。妙......啊~~~

「一点点题外话」:首先跟大家伙道个歉,由于kimol君最近一直忙着毕业的相关事情,所以更新比较慢,心中深感惭愧(手动捂脸)~

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

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

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

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

288c668d392200d5acb9796669672c10.png

在这里插入图片描述

一、代码分析

代码分析的详细思路跟以往依旧如此雷同,逃不过的还是:抓包分析->模拟请求->代码整合。由于一会儿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)

不出所料,代码一跑,我便轻松完成了师姐交给我的任务,不香嘛?

写在最后

当然,我的代码仅供参考,小伙伴们完全可以根据自己的需要进行相应的调整和改动,这样才能更多地发挥其价值。如果小伙伴有好的建议或者点子,强烈欢迎在后台留言哦~

我是kimol君,咋们下次再会~

f52b76fbbe891bc56dd675e1887e74c3.png创作不易,大侠请留步… 动起可爱的双手,来波点赞关注再走呗 (๑◕ܫ←๑)

相关资源:批量下载PDF,python源码

本文链接: http://www.dtmao.cc/news_show_2000071.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?