Python實(shí)現(xiàn)一個(gè)論文下載器的過程
在科研學(xué)習(xí)的過程中,我們難免需要查詢相關(guān)的文獻(xiàn)資料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以幫助我們搜索相關(guān)論文并下載其原文??梢哉f,SCI-HUB造福了眾多科研人員,用起來也是“美滋滋”。
然而,當(dāng)師姐告訴我:“xx,可以幫我下載幾篇文獻(xiàn)嘛?”。樂心助人的我自當(dāng)是滿口答應(yīng)了,心想:“這種小事就交給我叭~”
于是乎,我收到了一個(gè)excel文檔,66篇論文的列表安靜地趟在里面(此刻心中碎碎念:“這尼瑪,是幾篇嘛...”)。我粗略算了一下,復(fù)制、粘貼、下載,一套流程走下來,每篇論文少說也得30秒,66篇的話....啊,這不能忍!
很顯然,一篇一篇的下載,不是我的風(fēng)格所以,我決定寫一個(gè)論文下載器助我前行。
一、代碼分析
代碼分析的詳細(xì)思路跟以往依舊如此雷同,逃不過的還是:抓包分析->模擬請求->代碼整合。由于一會兒kimol君還得去搬磚,今天就不詳細(xì)展開了。
1. 搜索論文
通過論文的URL、PMID、DOI號或者論文標(biāo)題等搜索到對應(yīng)的論文,并通過bs4庫找出PDF原文的鏈接地址,代碼如下:
def search_article(artName): ''' 搜索論文 --------------- 輸入:論文名 --------------- 輸出:搜索結(jié)果(如果沒有返回"",否則返回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. 下載論文
得到了論文的鏈接地址之后,只需要通過requests發(fā)送一個(gè)請求,即可將其下載:
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é)果(如果沒有返回"",否則返回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('請輸入U(xiǎn)RL、PMID、DOI或者論文標(biāo)題:') print('搜索中...') downUrl = search_article(request) if downUrl == '': print('未找到相關(guān)論文,請重新搜索!') 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ān)python論文下載器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一行python實(shí)現(xiàn)樹形結(jié)構(gòu)的方法
今天小編就為大家分享一篇一行python實(shí)現(xiàn)樹形結(jié)構(gòu)的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08po+selenium+unittest自動(dòng)化測試項(xiàng)目實(shí)戰(zhàn)
本文主要介紹了po+selenium+unittest自動(dòng)化測試項(xiàng)目實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12對python3 sort sorted 函數(shù)的應(yīng)用詳解
今天小編就為大家分享一篇對python3 sort sorted 函數(shù)的應(yīng)用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python異常處理try語句應(yīng)用技巧實(shí)例探究
異常處理在Python中是至關(guān)重要的,try-except是用于捕獲和處理異常的核心機(jī)制之一,本文就帶大家深入了解如何使用try-except,處理各種異常情況2024-01-01Python全棧之進(jìn)程和守護(hù)進(jìn)程
這篇文章主要為大家介紹了Python進(jìn)程和守護(hù)進(jìn)程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12Python容錯(cuò)的前綴樹實(shí)現(xiàn)中文糾錯(cuò)
本文使用 Python 實(shí)現(xiàn)了前綴樹,并且支持編輯距離容錯(cuò)的查詢。文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07python項(xiàng)目打包成exe和安裝包的方法步驟
本文主要介紹了python項(xiàng)目打包成exe和安裝包的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03