本篇博文將介紹如何通過Python的代碼實現(xiàn)快速下載指定DOI號對應(yīng)的文獻(xiàn),并且使用Sci-Hub作為下載庫。
一、庫函數(shù)準(zhǔn)備
在開始之前,我們需要先安裝一些必要的庫,包括:
- requests:發(fā)送HTTP請求并獲取響應(yīng)的庫;
- beautifulsoup4:用于解析HTML頁面;
- threading:用于實現(xiàn)多線程處理;
這些庫可以通過pip命令進(jìn)行安裝,具體命令如下:
pip install requests
pip install BeautifulSoup
pip install threading
除此之外,還需要在代碼所在目錄下創(chuàng)建一個名為“papers”的文件夾,用于保存下載下來的文獻(xiàn)。同時,需要準(zhǔn)備一個包含多個DOI號的txt文件,每個DOI號占一行。
二、實現(xiàn)步驟
整個下載過程大致可以分為以下幾個步驟:
- 讀取存儲有DOI號的txt文件;
- 構(gòu)造Sci-Hub鏈接并發(fā)送HTTP請求;
- 解析HTML頁面,獲取文獻(xiàn)下載鏈接;
- 下載文獻(xiàn)并保存到本地文件夾;
- 記錄下載成功或失敗的情況。
三、實現(xiàn)算法
代碼通過讀取txt文件中的doi號來拼接Sci-Hub的鏈接,然后解析得到文獻(xiàn)下載鏈接并進(jìn)行下載
定義了HTTP請求需要的請求頭;接著定義了一個download_paper()函數(shù),用于下載文獻(xiàn)并保存到本地,其中doi參數(shù)是需要下載的文獻(xiàn)的DOI號;在 download_paper() 函數(shù)內(nèi),我們首先根據(jù)DOI號構(gòu)造了Sci-Hub鏈接,并發(fā)送HTTP請求;然后通過解析HTML頁面,獲取到了文獻(xiàn)的下載鏈接,并使用requests庫下載文獻(xiàn)到本地,并將下載成功和失敗的信息輸出到控制臺或記錄到一個日志文件中;最后,我們打開存儲有DOI號的txt文件,并遍歷其中的每一行,調(diào)用download_paper()函數(shù)下載對應(yīng)的文獻(xiàn)。
需要注意的是,由于Sci-Hub常常會更換域名,因此在實際應(yīng)用中,我們需要通過瀏覽器訪問Sci-Hub,找到當(dāng)前可用的域名,并將其替換到上述代碼中的鏈接中。
四、加速下載
雖然上述代碼已經(jīng)可以完成文獻(xiàn)下載的任務(wù),但是由于單線程下載速度較慢,因此我們可以使用多線程來加速下載過程。具體來說,我們可以將需要下載文獻(xiàn)的DOI號作為參數(shù)傳遞給download_paper()函數(shù),并創(chuàng)建多個線程來并行下載文獻(xiàn)。下面是一種使用多線程下載文獻(xiàn)的代碼實現(xiàn)方式:文章來源:http://www.zghlxwxcb.cn/news/detail-471137.html
import requests
from bs4 import BeautifulSoup
import os
import threading
# 創(chuàng)建papers文件夾用于保存文獻(xiàn)
path = "C:/Users/ypzhao/Desktop/papers/"
if not os.path.exists(path):
os.mkdir(path)
# 請求頭
head = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36"
}
# 下載文獻(xiàn)的函數(shù)
def download_paper(doi):
# 拼接Sci-Hub鏈接
url = "https://www.sci-hub.ren/" + doi + "#"
try:
download_url = ""
# 發(fā)送HTTP請求并解析HTML頁面
r = requests.get(url, headers=head)
r.raise_for_status()
soup = BeautifulSoup(r.text, "html.parser")
# 解析得到文獻(xiàn)下載鏈接
if soup.iframe == None:
download_url = "https:" + soup.embed.attrs["src"]
else:
download_url = soup.iframe.attrs["src"]
# 下載文獻(xiàn)并保存到文件
print(doi + "\t正在下載\n下載鏈接為\t" + download_url)
download_r = requests.get(download_url, headers=head)
download_r.raise_for_status()
with open(path + doi.replace("/", "_") + ".pdf", "wb+") as temp:
temp.write(download_r.content)
print(doi + "\t文獻(xiàn)下載成功.\n")
# 下載失敗時記錄錯誤信息
except Exception as e:
with open("error.log", "a+") as error:
error.write(doi + "\t下載失敗!\n")
if download_url.startswith("https://"):
error.write("下載url鏈接為: " + download_url + "\n")
error.write(str(e) + "\n\n")
# 打開包含doi號的txt文件
with open(path + "doi.txt", "r", encoding="utf-8") as f:
# 遍歷讀取doi號,并啟動多線程下載文獻(xiàn)
threads = []
for line in f:
doi = line.strip()
t = threading.Thread(target=download_paper, args=(doi,))
threads.append(t)
# 啟動所有線程
for t in threads:
t.start()
# 等待所有線程完成
for t in threads:
t.join()
五、運行結(jié)果
文章來源地址http://www.zghlxwxcb.cn/news/detail-471137.html
到了這里,關(guān)于Python批量下載參考文獻(xiàn)|基于Python的Sci-Hub下載腳本|Python批量下載sci-hub文獻(xiàn)|如何使用sci-hub批量下載論文的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!