sourcecode

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

codebag 2023. 7. 27. 21:57
반응형

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출력을 바이트 개체로 반환하고 이진 파일을 다운로드할 때 사용합니다.PDF 파일, 오디오 파일, 이미지 등.


대신 사용할 수도 있습니다.그러나 다운로드하려는 파일이 클 때 사용합니다.다음은 문서에서 확인할 수 있는 기본 예제입니다.

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)

urllib를 사용할 수 있습니다.

import urllib.request
urllib.request.urlretrieve(url, "filename.pdf")

저는 초보자입니다.내 해결책이 잘못되었다면 언제든지 수정하거나 알려주시기 바랍니다.저도 새로운 것을 배울지도 모릅니다.

내 솔루션:

파일을 저장할 위치에 따라 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...')

일반적으로 이것은 Python3에서 작동해야 합니다.

import urllib.request 
..
urllib.request.get(url)

Python2 이후에는 urllib와 urllib2가 제대로 작동하지 않는다는 것을 기억하세요.

일부 의문스러운 경우 요청이 작동하지 않는 경우(나에게 발생한 경우) 사용해 볼 수도 있습니다.

wget.download(url)

관련:

웹 페이지에서 모든 PDF 파일을 찾아 다운로드할 수 있는 적절한 설명/솔루션은 다음과 같습니다.

https://medium.com/ @dementorwriter/notes 다운로더-use-with-with-with-with-with-with-with-511ea9f55e48.

폴더에 쓸 케빈의 답변에 관하여.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

반응형