잡동사니

반응형

질문

 

관심있는 DOI 논문 목록이 탁월합니다.이 목록에 따라 모든 논문을 다운로드하고 싶습니다.

나는 그들의 문서에서 권장하는대로 요청으로 그것을 시도했다. 그러나 내가 얻는 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")

 

답변1

 

귀하의 문제는 r.iter_content의 청크에 대한 return True 입니다. 이 줄을 사용하면 chunk_size 크기의 PDF 청크 하나만 작성하게됩니다.

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")

 

 

 

 

 

출처 : https://stackoverflow.com/questions/59202176/python-download-papers-from-sciencedirect-by-doi-with-requests

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band