Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:根据请求从DOI的ScienceDirect下载论文_Python - Fatal编程技术网

Python:根据请求从DOI的ScienceDirect下载论文

Python:根据请求从DOI的ScienceDirect下载论文,python,Python,我有一份我感兴趣的论文目录。根据这份清单,我想下载所有的论文 我试着按照他们文档中的建议,按要求来做。但是我得到的pdf文件已经损坏了。它们只是有点大。我多次将chunk_大小从无更改为1024*1024,我已经阅读了很多帖子。没什么帮助 请问,你有什么想法 import pandas as pd import os import requests def get_pdf(doi, file_to_save_to): url = 'http://api.elsevier.com/co

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

我试着按照他们文档中的建议,按要求来做。但是我得到的pdf文件已经损坏了。它们只是有点大。我多次将chunk_大小从无更改为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")

我认为您的问题是r.iter_内容中chunk的返回为真。有了这一行,你将只写一块大小为chunk\u的PDF

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

作为pd进口熊猫 导入操作系统 导入请求 标题={ “X-ELS-APIKEY”:键, “接受”:“应用程序/pdf” } def get_pdfdoi,文件保存到: url=f'http://api.elsevier.com/content/article/doi:{doi}?视图=完整' 对于requests.geturl,stream=True,headers=headers作为r: 如果r.status_code==200: 对于r.iter\u contentchunk\u size=1024*1024中的块: 文件\u至\u保存\u至.writechunk doi_list=pd.read_excel'list.xls' doi_list.columns=['DOIs'] 计数=0 对于doi_列表中的doi['DOIs']: doi=doi。替换“doi:”, pdf=doi。替换“/”、“%” 如果不是os.path.existsf'path/{pdf}.pdf': 使用openf'path/{pdf}.pdf、'wb'作为文件: 获取pdfdoi,文件 计数+=1 printfDowloaded:{count}个{lendoi_列表['DOIs']}文章
谢谢你的意见!我改了,但是PDF还是有100KB大。因此,我只能看到第一页,而看不到文档的其余部分。@renrei您能以某种方式将更改与程序共享吗?@AlexanderCécile,它看起来与Kirk建议的完全一样one@renrei在重试之前,能否确认已删除所有现有文件?也许您需要使用with语句,或者刷新请求。我会更新代码示例您流式传输文件有什么特殊原因吗?