python - Python:通过 DOI 请求从 ScienceDirect 下载论文
问题描述
我有一个我感兴趣的论文 DOI 的 Excel 列表。基于此列表,我想下载所有论文。
按照他们的文档中的建议,我尝试按照要求进行操作。但是我得到的 pdf 文件已损坏。它们只是一些 KB 大。我将 chunk_size 从 None 更改为 1024*1024 几次,并且我已经阅读了很多帖子。没有什么帮助。
请问,你有什么想法?
import pandas as pd
import os
import requests
def get_pdf(doi, file_to_save_to):
url = 'http://api.elsevier.com/content/article/doi:'+doi+'?view=FULL'
headers = {
'X-ELS-APIKEY': "keykeykeykeykeykey",
'Accept': 'application/pdf'
}
r = requests.get(url, stream=True, headers=headers)
if r.status_code == 200:
for chunk in r.iter_content(chunk_size=1024*1024):
file_to_save_to.write(chunk)
return True
doi_list = pd.read_excel('list.xls')
doi_list.columns = ['DOIs']
count = 0
for doi in doi_list['DOIs']:
doi = doi.replace('DOI:','')
pdf = doi.replace('/','%')
if not os.path.exists(f'path/{pdf}.pdf'):
file = open(f'path/{pdf}.pdf', 'wb')
get_pdf(doi, file)
count += 1
print(f"Dowloaded: {count} of {len(doi_list['DOIs'])} articles")
解决方案
我认为你的问题是return True
在for chunk in r.iter_content
. 使用该行,您将只能编写大小为 PDF 的一大块chunk_size
。
您还应该使用with
;打开文件 照原样,您永远不会关闭文件句柄。
import pandas as pd
import os
import requests
HEADERS = {
'X-ELS-APIKEY': "keykeykeykeykeykey",
'Accept': 'application/pdf'
}
def get_pdf(doi, file_to_save_to):
url = f'http://api.elsevier.com/content/article/doi:{doi}?view=FULL'
with requests.get(url, stream=True, headers=HEADERS) as r:
if r.status_code == 200:
for chunk in r.iter_content(chunk_size=1024*1024):
file_to_save_to.write(chunk)
doi_list = pd.read_excel('list.xls')
doi_list.columns = ['DOIs']
count = 0
for doi in doi_list['DOIs']:
doi = doi.replace('DOI:','')
pdf = doi.replace('/','%')
if not os.path.exists(f'path/{pdf}.pdf'):
with open(f'path/{pdf}.pdf', 'wb') as file:
get_pdf(doi, file)
count += 1
print(f"Dowloaded: {count} of {len(doi_list['DOIs'])} articles")
推荐阅读
- ruby-on-rails - ROR:尝试使用“put”触发更新路由,但由于某种原因删除而不是
- wso2 - wso2 - 工作流管理 - 400 错误请求
- jenkins - jenkins如何在docker容器中调用柯南?错误执行脚本柯南失败
- javascript - 反应状态-> h2 标签不会显示更新状态,只是初始状态
- python - 句子分段规则未按预期工作
- powershell - Powershell查找所有节省的时间并保存为一个文件
- java - 了解埃拉托色尼筛算法的修改变体
- xamarin.forms - 安装后的 Xamarin Forms 事件
- sql - Postgres:如何更改数组中每个元素的 jsonb 值类型?
- html - 网络可用时从离线 HTML5 应用上传