Estou tentando baixar um arquivo PDF de um site e salvá-lo no disco. Minhas tentativas falham com erros de codificação ou resultam em PDFs em branco.
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)
...:
Eu sei que é algum tipo de problema de codec, mas não consigo fazê-lo funcionar.
No Python 3, acho que o pathlib é a maneira mais fácil de fazer isso. O response.content do Request combina muito bem com o write_bytes do pathlib.
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)
fonte
544
e o arquivo está quebrado, alguma ideia?Você pode usar o urllib:
import urllib.request urllib.request.urlretrieve(url, "filename.pdf")
fonte
urlretrieve
depende de configurações globais para determinar cabeçalhos de solicitação, tornando-o inadequado para alguns casos de uso.Geralmente, isso deve funcionar no Python3:
import urllib.request .. urllib.request.get(url)
Lembre-se de que urllib e urllib2 não funcionam corretamente após Python2.
Se em alguns casos misteriosos as solicitações não funcionarem (aconteceu comigo), você também pode tentar usar
Relacionado:
Aqui está uma explicação / solução decente para encontrar e baixar todos os arquivos PDF em uma página da web:
https://medium.com/@dementorwriter/notesdownloader-use-web-scraping-to-download-all-pdfs-with-python-511ea9f55e48
fonte
Observe que sou um iniciante. Se Minha solução estiver errada, sinta-se à vontade para corrigir e / ou me avise. Posso aprender algo novo também.
Minha solução:
Altere o downloadPath de acordo com o local onde deseja que o arquivo seja salvo. Sinta-se à vontade para usar o caminho absoluto também para seu uso.
Salve o abaixo como downloadFile.py.
Uso:
python downloadFile.py url-of-the-file-to-download new-file-name.extension
Lembre-se de adicionar uma extensão!
Exemplo de uso:
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...')
fonte
em relação à resposta de Kevin para escrever em uma pasta
tmp
, deve ser assim:with open('./tmp/metadata.pdf', 'wb') as f: f.write(response.content)
ele esqueceu
.
antes do endereço e claro que sua pastatmp
já deveria ter sido criadafonte
tmp
, foi como na pergunta da OP. 2- o/tmp
diretório é o tmp em sistemas Unix, localizado em/tmp
, no.