IT박스

Python 요청 모듈로 PDF 파일 다운로드 및 저장

itboxs 2020. 12. 11. 07:59
반응형

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

반응형