Python 요청 모듈로 PDF 파일 다운로드 및 저장
웹 사이트에서 PDF 파일을 다운로드하여 디스크에 저장하려고합니다. 내 시도가 인코딩 오류로 실패하거나 빈 PDF가 생성됩니다.
In [1]: import requests
In [2]: url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf'
In [3]: response = requests.get(url)
In [4]: with open('/tmp/metadata.pdf', 'wb') as f:
...: f.write(response.text)
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
<ipython-input-4-4be915a4f032> in <module>()
1 with open('/tmp/metadata.pdf', 'wb') as f:
----> 2 f.write(response.text)
3
UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-14: ordinal not in range(128)
In [5]: import codecs
In [6]: with codecs.open('/tmp/metadata.pdf', 'wb', encoding='utf8') as f:
...: f.write(response.text)
...:
어떤 종류의 코덱 문제라는 것을 알고 있지만 작동하지 않는 것 같습니다.
response.content
이 경우에 사용해야합니다 .
with open('/tmp/metadata.pdf', 'wb') as f:
f.write(response.content)
에서 문서 :
텍스트가 아닌 요청의 경우 응답 본문에 바이트로 액세스 할 수도 있습니다.
>>> r.content b'[{"repository":{"open_issues":0,"url":"https://github.com/...
즉 response.text
, 출력을 문자열 객체로 반환하고 텍스트 파일을 다운로드 할 때 사용 합니다 . HTML 파일 등
그리고 response.content
출력을 bytes 객체로 반환하고 바이너리 파일을 다운로드 할 때 사용 합니다 . PDF 파일, 오디오 파일, 이미지 등
response.raw
대신 사용할 수도 있습니다 . 그러나 다운로드하려는 파일이 큰 경우 사용하십시오. 다음은 문서에서도 찾을 수있는 기본 예입니다.
import requests
url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf'
r = requests.get(url, stream=True)
with open('/tmp/metadata.pdf', 'wb') as fd:
for chunk in r.iter_content(chunk_size):
fd.write(chunk)
chunk_size
사용하려는 청크 크기입니다. 로 설정하면 2000
요청이 해당 파일을 첫 번째 2000
바이트로 다운로드하고 파일 에 쓰고 완료하지 않는 한 반복해서 수행합니다.
따라서 RAM을 절약 할 수 있습니다. 하지만 response.content
이 경우 파일이 작기 때문에 대신 사용하는 것이 좋습니다. 보시다시피 사용 response.raw
은 복잡합니다.
관련 :
Python 3에서는 pathlib가 가장 쉬운 방법이라는 것을 알았습니다. 요청의 response.content 는 pathlib의 _write_bytes_와 멋지게 결합됩니다.
from pathlib import Path
import requests
filename = Path('metadata.pdf')
url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf'
response = requests.get(url)
filename.write_bytes(response.content)
나는 초보자입니다. 내 솔루션이 잘못된 경우 언제든지 수정 및 / 또는 알려주십시오. 나도 새로운 것을 배울 수 있습니다.
내 솔루션 :
파일을 저장할 위치 에 따라 downloadPath를 변경하십시오 . 절대 경로를 사용하여 자유롭게 사용하십시오.
아래를 downloadFile.py로 저장하십시오.
용법: python downloadFile.py url-of-the-file-to-download new-file-name.extension
확장자를 추가하는 것을 잊지 마십시오!
사용 예 : python downloadFile.py http://www.google.co.uk google.html
import requests
import sys
import os
def downloadFile(url, fileName):
with open(fileName, "wb") as file:
response = requests.get(url)
file.write(response.content)
scriptPath = sys.path[0]
downloadPath = os.path.join(scriptPath, '../Downloads/')
url = sys.argv[1]
fileName = sys.argv[2]
print('path of the script: ' + scriptPath)
print('downloading file to: ' + downloadPath)
downloadFile(url, downloadPath + fileName)
print('file downloaded...')
print('exiting program...')
폴더에 쓰기에 대한 Kevin 답변과 관련하여 tmp
다음과 같아야합니다.
with open('./tmp/metadata.pdf', 'wb') as f:
f.write(response.content)
그는 .
당신의 폴더 tmp
가 이미 생성되었을 것입니다.
참고URL : https://stackoverflow.com/questions/34503412/download-and-save-pdf-file-with-python-requests-module
'IT박스' 카테고리의 다른 글
assert가 많이 사용되지 않는 이유는 무엇입니까? (0) | 2020.12.12 |
---|---|
Go, go get, go install, 로컬 패키지 및 버전 제어 (0) | 2020.12.12 |
base 64 문자열을 각도 (2+)로 인코딩 및 디코딩 (0) | 2020.12.11 |
C ++의 64 비트 ntohl ()? (0) | 2020.12.11 |
라텍스에서 pgf / tikz 그래픽의 글꼴 크기를 제어하는 방법은 무엇입니까? (0) | 2020.12.11 |