es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Rascar un sitio web utilizando Python o wget – problema pendiente de respuesta

Estoy tratando de descargar más de 300k archivos HTML del mismo servidor. Tengo las URL en un archivo de texto o lista. Mi primer intento fue usar python urllib/requests, pero fue increíblemente lento y se atascaba después de unos pocos enlaces (10-20). Ejemplo de código:

for i, url in enumerate(url_list):
    urllib.request.urlretrieve(url, "./pages/"+str(i))

Después probé simplemente usando wget así:

wget -i links_file.txt -U netscape

Wget funciona muy bien y descarga entre 1-5k archivos sin problemas y parece muy rápido, pero luego se atasca en archivos aleatorios (?):

Connecting to <website>... connected. HTTP request sent, awaiting response...

Ahora puedo ver en qué URL se atascó y simplemente detener la ejecución y volver a comenzar desde el mismo punto y funciona perfectamente bien de nuevo para otras 1-5k descargas. Como no puedo hacer esto manualmente cada vez que se detiene hasta que finalmente tenga los 300k archivos, me preguntaba si hay alguna manera de detener wget automáticamente si espera una respuesta durante demasiado tiempo y luego intenta de nuevo? ¿O hay alguna otra/mejor manera de descargar tantos archivos HTML automáticamente?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás teniendo problemas para descargar los archivos HTML utilizando urllib y wget. Es posible detener wget automáticamente si espera una respuesta por demasiado tiempo y luego intenta de nuevo. Puedes usar la opción --tries para establecer el número de intentos para wget:

    wget --tries = 5 -i archivo_de_enlaces.txt -U netscape
    

    Esto hará que wget intente descargar hasta 5 veces si encuentra un error. También puedes usar la opción --waitretry para establecer el tiempo de espera entre intentos:

    wget --waitretry = 30 --tries = 5-i archivo_de_enlaces.txt -U netscape
    

    Esto hará que wget espere 30 segundos entre intentos. También puedes usar la opción --timeout para establecer el tiempo de espera de una respuesta antes de darse por vencido:

    wget --timeout = 60 --waitretry = 30 --tries = 5-i archivo_de_enlaces.txt -U netscape
    

    Esto hará que wget espere hasta 60 segundos por una respuesta antes de darse por vencido e intentar de nuevo.

Comments are closed.