首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:通过DOI请求从ScienceDirect下载论文

Python:通过DOI请求从ScienceDirect下载论文
EN

Stack Overflow用户
提问于 2019-12-06 03:36:16
回答 1查看 695关注 0票数 1

我有一份我感兴趣的论文清单。根据这个列表,我想下载所有的论文。

我试着按照他们的文档中的建议,按请求来做。但是我得到的pdf文件是损坏的。它们只有一些KB大小。我多次将chunk_size从无更改到1024x1024,并且我已经阅读了很多帖子。什么都没有用。

请问,你的想法是什么?

代码语言:javascript
复制
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")
EN

回答 1

Stack Overflow用户

发布于 2019-12-06 03:44:18

我认为您的问题是for chunk in r.iter_content中的return True。有了这行代码,您将只编写chunk_size大小的PDF中的一块。

您还应该使用with打开文件;按原样,您永远不会关闭文件句柄。

代码语言:javascript
复制
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")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59202176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档