Python實(shí)現(xiàn)一個(gè)論文下載器的過(guò)程
在科研學(xué)習(xí)的過(guò)程中,我們難免需要查詢相關(guān)的文獻(xiàn)資料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以幫助我們搜索相關(guān)論文并下載其原文。可以說(shuō),SCI-HUB造福了眾多科研人員,用起來(lái)也是“美滋滋”。

然而,當(dāng)師姐告訴我:“xx,可以幫我下載幾篇文獻(xiàn)嘛?”。樂(lè)心助人的我自當(dāng)是滿口答應(yīng)了,心想:“這種小事就交給我叭~”
于是乎,我收到了一個(gè)excel文檔,66篇論文的列表安靜地趟在里面(此刻心中碎碎念:“這尼瑪,是幾篇嘛...”)。我粗略算了一下,復(fù)制、粘貼、下載,一套流程走下來(lái),每篇論文少說(shuō)也得30秒,66篇的話....啊,這不能忍!
很顯然,一篇一篇的下載,不是我的風(fēng)格所以,我決定寫(xiě)一個(gè)論文下載器助我前行。

一、代碼分析
代碼分析的詳細(xì)思路跟以往依舊如此雷同,逃不過(guò)的還是:抓包分析->模擬請(qǐng)求->代碼整合。由于一會(huì)兒kimol君還得去搬磚,今天就不詳細(xì)展開(kāi)了。
1. 搜索論文
通過(guò)論文的URL、PMID、DOI號(hào)或者論文標(biāo)題等搜索到對(duì)應(yīng)的論文,并通過(guò)bs4庫(kù)找出PDF原文的鏈接地址,代碼如下:
def search_article(artName):
'''
搜索論文
---------------
輸入:論文名
---------------
輸出:搜索結(jié)果(如果沒(méi)有返回"",否則返回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: # 未找到相應(yīng)文章
return ''
else:
downUrl = iframe['src']
if 'http' not in downUrl:
downUrl = 'https:'+downUrl
return downUrl
2. 下載論文
得到了論文的鏈接地址之后,只需要通過(guò)requests發(fā)送一個(gè)請(qǐng)求,即可將其下載:
def download_article(downUrl):
'''
根據(jù)論文鏈接下載文章
----------------------
輸入:論文鏈接
----------------------
輸出:PDF文件二進(jìn)制
'''
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
二、完整代碼
將上述兩個(gè)函數(shù)整合之后,我的完整代碼如下:
# -*- 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):
'''
搜索論文
---------------
輸入:論文名
---------------
輸出:搜索結(jié)果(如果沒(méi)有返回"",否則返回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: # 未找到相應(yīng)文章
return ''
else:
downUrl = iframe['src']
if 'http' not in downUrl:
downUrl = 'https:'+downUrl
return downUrl
def download_article(downUrl):
'''
根據(jù)論文鏈接下載文章
----------------------
輸入:論文鏈接
----------------------
輸出:PDF文件二進(jìn)制
'''
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('請(qǐng)輸入U(xiǎn)RL、PMID、DOI或者論文標(biāo)題:')
print('搜索中...')
downUrl = search_article(request)
if downUrl == '':
print('未找到相關(guān)論文,請(qǐng)重新搜索!')
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)
不出所料,代碼一跑,我便輕松完成了師姐交給我的任務(wù),不香嘛?
到此這篇關(guān)于Python實(shí)現(xiàn)一個(gè)論文下載器的過(guò)程的文章就介紹到這了,更多相關(guān)python論文下載器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django foreignkey(外鍵)的實(shí)現(xiàn)
這篇文章主要介紹了django foreignkey(外鍵)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python?PySpark案例實(shí)戰(zhàn)教程
PySpark是由Spark官方開(kāi)發(fā)的Python語(yǔ)言第三方庫(kù),Python開(kāi)發(fā)者可以使用pip程序快速的安裝PySpark并像其它三方庫(kù)那樣直接使用,本文給大家介紹Python?PySpark案例實(shí)戰(zhàn),感興趣的朋友一起看看吧2023-09-09
numpy concatenate數(shù)組拼接方法示例介紹
這篇文章主要介紹了numpy concatenate數(shù)組拼接方法示例介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
python實(shí)現(xiàn)銀行實(shí)戰(zhàn)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)銀行實(shí)戰(zhàn)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
Python設(shè)計(jì)模式之觀察者模式簡(jiǎn)單示例
這篇文章主要介紹了Python設(shè)計(jì)模式之觀察者模式,簡(jiǎn)單描述了觀察者模式的概念、原理,并結(jié)合實(shí)例形式分析了Python觀察者模式的相關(guān)定義與使用技巧,需要的朋友可以參考下2018-01-01
對(duì)TensorFlow中的variables_to_restore函數(shù)詳解
今天小編就為大家分享一篇對(duì)TensorFlow中的variables_to_restore函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Python基礎(chǔ)學(xué)習(xí)之深淺拷貝問(wèn)題及遞歸函數(shù)練習(xí)
在實(shí)際工作中,經(jīng)常涉及到數(shù)據(jù)的傳遞。這篇文章主要為大家介紹了Python的一些基礎(chǔ)學(xué)習(xí):深拷貝與淺拷貝問(wèn)題、遞歸函數(shù)的練習(xí),需要的朋友可以參考一下2021-12-12
python提取具有某種特定字符串的行數(shù)據(jù)方法
今天小編就為大家分享一篇python提取具有某種特定字符串的行數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
使用pandas對(duì)兩個(gè)dataframe進(jìn)行join的實(shí)例
今天小編就為大家分享一篇使用pandas對(duì)兩個(gè)dataframe進(jìn)行join的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06

