Python, subprocesos múltiples, captura páginas web, descarga páginas web

Quiero descargar por lotes páginas web en un sitio. Hay enlaces de 5000000 urls en mi archivo ‘urls.txt’. Se trata de unos 300M. ¿Cómo hacer que los subprocesos múltiples vinculen estas URL y descarguen estas páginas web? o ¿Cómo lotes descargar estas páginas web?

mis ideas:

with open('urls.txt','r') as f: for el in f: ##fetch these urls 

o torcido?

¿Hay una buena solución para ello?

Si esto no es parte de un progtwig más grande, entonces no es buena idea usar una herramienta existente para lograrlo. Si un wget de invocación de bucle de shell resuelve su problema, será mucho más fácil que cualquier cosa que implique un desarrollo de software más personalizado.

Sin embargo, si necesita obtener estos recursos como parte de un progtwig más grande, entonces hacerlo con shell puede no ser lo ideal. En este caso, recomiendo encarecidamente Twisted, lo que facilitará la realización de muchas solicitudes en paralelo.

Hace unos años escribí un ejemplo de cómo hacer esto. Echa un vistazo a http://jcalderone.livejournal.com/24285.html .

Definitivamente, descargar 5M páginas web de una sola vez no es una buena idea, ya que maximizará muchas cosas, incluido el ancho de banda de su red y los descriptores de archivos de su sistema operativo. Yo iría en lotes de 100-1000. Puede usar urllib.urlopen para obtener un socket y luego simplemente leer () en varios subprocesos. Es posible que pueda utilizar select.select. Si es así, continúe y descargue los 1000 a la vez y distribuya cada identificador de archivo que seleccione retornos para decir 10 hilos de trabajadores. Si la selección no funciona, entonces limite sus lotes a 100 descargas y use un hilo por descarga. Ciertamente, no debes iniciar más de 100 subprocesos ya que tu sistema operativo podría explotar o al menos ir un poco lento.

Primero analice su archivo y coloque las URL en una cola, luego genere 5-10 subprocesos de trabajo para sacar las URL de la cola y descargarlas. La cola es tu amiga con esto.

Una secuencia de comandos wget es probablemente la más simple, pero si está buscando una solución de rastreo con python twisted, eche un vistazo a scrapy