Estoy intentando descargar un archivo PDF de un sitio web y guardarlo en el disco. Mis intentos fallan con errores de codificación o dan como resultado archivos PDF en blanco.
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)
...:
Sé que es un problema de códec de algún tipo, pero parece que no puedo hacer que funcione.
En Python 3, encuentro que pathlib es la forma más fácil de hacer esto. Request's response.content se casa muy bien con write_bytes de 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)
fuente
544
y el archivo está roto, ¿alguna idea?Puede utilizar urllib:
import urllib.request urllib.request.urlretrieve(url, "filename.pdf")
fuente
urlretrieve
se basa en la configuración global para determinar los encabezados de las solicitudes, por lo que no es adecuado para algunos casos de uso.Generalmente, esto debería funcionar en Python3:
import urllib.request .. urllib.request.get(url)
Recuerde que urllib y urllib2 no funcionan correctamente después de Python2.
Si en algunos casos misteriosos las solicitudes no funcionan (sucedió conmigo), también puede intentar usar
Relacionado:
Aquí hay una explicación / solución decente para encontrar y descargar todos los archivos pdf en una página web:
https://medium.com/@dementorwriter/notesdownloader-use-web-scraping-to-download-all-pdfs-with-python-511ea9f55e48
fuente
Tenga en cuenta que soy un principiante. Si mi solución es incorrecta, no dude en corregirla y / o informarme. También puedo aprender algo nuevo.
Mi solución:
Cambie la ruta de descarga en consecuencia con el lugar donde desea que se guarde su archivo. Siéntase libre de usar la ruta absoluta también para su uso.
Guarde lo siguiente como downloadFile.py.
Uso:
python downloadFile.py url-of-the-file-to-download new-file-name.extension
¡Recuerde agregar una extensión!
Uso de ejemplo:
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...')
fuente
con respecto a la respuesta de Kevin para escribir en una carpeta
tmp
, debería ser así:with open('./tmp/metadata.pdf', 'wb') as f: f.write(response.content)
se olvidó
.
antes de la dirección y, por supuesto, su carpeta yatmp
debería haber sido creadafuente
tmp
, fue como en la pregunta de OP. 2- el/tmp
directorio es el tmp en sistemas Unix, ubicado en/tmp
, no.