Tengo una pequeña utilidad que utilizo para descargar un archivo MP3 de un sitio web en un horario y luego construye / actualiza un archivo XML de podcast que he agregado a iTunes.
El procesamiento de texto que crea / actualiza el archivo XML se escribe en Python. Sin embargo, uso wget dentro de un .bat
archivo de Windows para descargar el archivo MP3 real. Preferiría tener toda la utilidad escrita en Python.
Luché por encontrar una manera de descargar realmente el archivo en Python, por eso recurrí a usarlo wget
.
Entonces, ¿cómo descargo el archivo usando Python?
wget
. Entre otras cosas,wget
(1) conserva las marcas de tiempo (2) determina automáticamente el nombre del archivo desde la url, agregando.1
(etc.) si el archivo ya existe (3) tiene muchas otras opciones, algunas de las cuales puede haber puesto en su.wgetrc
. Si desea alguno de esos, debe implementarlos usted mismo en Python, pero es más simple invocarlowget
desde Python.import urllib.request; s = urllib.request.urlopen('http://example.com/').read().decode()
Respuestas:
En Python 2, use urllib2 que viene con la biblioteca estándar.
Esta es la forma más básica de usar la biblioteca, menos cualquier manejo de errores. También puede hacer cosas más complejas, como cambiar los encabezados. La documentación se puede encontrar aquí.
fuente
urllib2.quote
Uno más, usando
urlretrieve
:(para uso en Python 3+
import urllib.request
yurllib.request.urlretrieve
)Otro más, con una "barra de progreso"
fuente
if not os.path.isfile(file_name):
para evitar sobrescribir podcasts! útil cuando se ejecuta como un cronjob con las URL encontradas en un archivo .htmlEn 2012, use la biblioteca de solicitudes de Python
Puedes correr
pip install requests
para conseguirlo.Las solicitudes tienen muchas ventajas sobre las alternativas porque la API es mucho más simple. Esto es especialmente cierto si tiene que hacer autenticación. urllib y urllib2 son bastante poco intuitivos y dolorosos en este caso.
2015-12-30
La gente ha expresado admiración por la barra de progreso. Es genial, claro. Hay varias soluciones disponibles ahora, que incluyen
tqdm
:Esta es esencialmente la implementación que @kvance describió hace 30 meses.
fuente
r.text
para texto o contenido Unicode. Devuelto como unicode.r.content
: Para contenido binario. Devuelto como bytes. Lea sobre esto aquí: docs.python-requests.org/en/latest/user/quickstartEl
wb
enopen('test.mp3','wb')
abre un archivo (y borra cualquier archivo existente) en modo binario para que pueda guardar los datos con él en lugar de sólo texto.fuente
file.read
ese es el número de bytes a leer. Ver: gist.github.com/hughdbrown/c145b8385a2afa6570e2shutil.copyfileobj(mp3file, output)
lugar.Python 3
urllib.request.urlopen
urllib.request.urlretrieve
Nota: De acuerdo con la documentación,
urllib.request.urlretrieve
es una "interfaz heredada" y "podría quedar obsoleta en el futuro" (gracias Gerrit )Python 2
urllib2.urlopen
(gracias Corey )urllib.urlretrieve
(gracias PabloG )fuente
urllib.request.urlretrieve
arriba, lo llevará a ese enlace exacto. ¡Salud!urllib.request.urlretrieve
está documentado como una "interfaz heredada" y "podría quedar obsoleto en el futuro".use el módulo wget:
fuente
Una versión mejorada del código PabloG para Python 2/3:
fuente
La
Python 2 & Python 3
forma simple pero compatible viene con lasix
biblioteca:fuente
fuente
Escribió la biblioteca de wget en Python puro solo para este propósito. Se bombea
urlretrieve
con estas características partir de la versión 2.0.fuente
-o
a-O
para evitar confusiones, ya que está en GNU wget. O al menos ambas opciones deben ser válidas.wget.py
un reemplazo en el lugar de verdadwget
. El-o
ya se comporta de manera diferente, es compatible decurl
esta manera. ¿Una nota en la documentación ayudaría a resolver el problema? ¿O es la característica esencial para que una utilidad con dicho nombre sea compatible con la línea de comandos?Las siguientes son las llamadas más utilizadas para descargar archivos en python:
urllib.urlretrieve ('url_to_file', file_name)
urllib2.urlopen('url_to_file')
requests.get(url)
wget.download('url', file_name)
Nota:
urlopen
yurlretrieve
se encuentra que funcionan relativamente mal con la descarga de archivos grandes (tamaño> 500 MB).requests.get
almacena el archivo en la memoria hasta que se complete la descarga.fuente
Estoy de acuerdo con Corey, urllib2 es más completo que urllib y probablemente debería ser el módulo utilizado si quieres hacer cosas más complejas, pero para que las respuestas sean más completas, urllib es un módulo más simple si solo quieres lo básico:
Funcionará bien O, si no desea tratar con el objeto "respuesta", puede llamar a read () directamente:
fuente
En python3 puedes usar urllib3 y shutil libraires. Descárguelos usando pip o pip3 (dependiendo de si python3 es predeterminado o no)
Luego ejecuta este código
Tenga en cuenta que descarga
urllib3
pero usaurllib
en el códigofuente
También puede obtener comentarios sobre el progreso con urlretrieve:
fuente
Si tiene instalado wget, puede usar parallel_sync.
pip install parallel_sync
Doc: https://pythonhosted.org/parallel_sync/pages/examples.html
Esto es bastante poderoso. Puede descargar archivos en paralelo, volver a intentarlo en caso de falla e incluso puede descargar archivos en una máquina remota.
fuente
Si la velocidad es importante para usted, hice una pequeña prueba de rendimiento para los módulos
urllib
ywget
, en lowget
que respecta , probé una vez con la barra de estado y una vez sin ella. Tomé tres archivos diferentes de 500 MB para probar (diferentes archivos, para eliminar la posibilidad de que haya algo de almacenamiento en caché debajo del capó). Probado en máquina debian, con python2.Primero, estos son los resultados (son similares en diferentes ejecuciones):
La forma en que realicé la prueba es usando el decorador de "perfil". Este es el código completo:
urllib
parece ser el más rápidofuente
En aras de la integridad, también es posible llamar a cualquier programa para recuperar archivos utilizando el
subprocess
paquete. Los programas dedicados a recuperar archivos son más potentes que las funciones de Pythonurlretrieve
. Por ejemplo,wget
puede descargar directorios de forma recursiva (-R
), puede lidiar con FTP, redireccionamientos, servidores proxy HTTP, puede evitar volver a descargar archivos existentes (-nc
) yaria2
puede realizar descargas de conexiones múltiples que potencialmente pueden acelerar sus descargas.En Jupyter Notebook, también se pueden llamar programas directamente con la
!
sintaxis:fuente
El código fuente puede ser:
fuente
Puede usar PycURL en Python 2 y 3.
fuente
Escribí lo siguiente, que funciona en Python 2 o Python 3.
Notas:
fuente
Esto puede ser un poco tarde, ¡pero vi el código de pabloG y no pude evitar agregar un sistema os. ('cls') para que se vea IMPRESIONANTE! Echale un vistazo :
Si se ejecuta en un entorno que no sea Windows, deberá usar algo distinto de 'cls'. En MAC OS X y Linux debería estar 'claro'.
fuente
cls
no hace nada en mi OS X ni en un servidor Ubuntu mío. Alguna aclaración podría ser buena.clear
para Linux, o incluso mejor reemplazar la línea de impresión en lugar de borrar toda la salida de la línea de comando.os.system()
) que inicia un subproceso para borrar la pantalla usando un comando específico de la plataforma (cls
). ¿Cómo tiene esto que cualquier upvotes ?? Totalmente inútil "respuesta" en mi humilde opinión.urlretrieve y request.get son simples, sin embargo, la realidad no lo es. He obtenido datos para un par de sitios, incluidos texto e imágenes, los dos anteriores probablemente resuelven la mayoría de las tareas. pero para una solución más universal sugiero el uso de urlopen. Como está incluido en la biblioteca estándar de Python 3, su código podría ejecutarse en cualquier máquina que ejecute Python 3 sin preinstalar el paquete del sitio
Esta respuesta proporciona una solución a HTTP 403 Prohibido al descargar archivos a través de http utilizando Python. He intentado solo solicitudes y módulos urllib, el otro módulo puede proporcionar algo mejor, pero este es el que usé para resolver la mayoría de los problemas.
fuente
Respuesta tardía, pero para
python>=3.6
que pueda usar:Instalar
dload
con:fuente
Quería descargar todos los archivos de una página web. Lo intenté
wget
pero estaba fallando, así que decidí por la ruta de Python y encontré este hilo.Después de leerlo, hice una pequeña aplicación de línea de comandos
soupget
, ampliando las excelentes respuestas de PabloG y Stan y agregando algunas opciones útiles.Utiliza BeatifulSoup para recopilar todas las URL de la página y luego descargar las que tengan las extensiones deseadas. Finalmente, puede descargar varios archivos en paralelo.
Aquí está:
Un ejemplo de su uso es:
Y un ejemplo real si quieres verlo en acción:
fuente