관심있는 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")
귀하의 문제는 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")