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?
davy.ai
Parece que estás teniendo problemas para descargar los archivos HTML utilizando
urllib
ywget
. Es posible detenerwget
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 parawget
: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: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:Esto hará que
wget
espere hasta 60 segundos por una respuesta antes de darse por vencido e intentar de nuevo.