requests from and python scripting download urllib
Cyanide_and_happiness__up_to_2017-11-24.zip

from - python wget



Descargar de EXPLOSM.net Comics Script (5)

Sugeriría usar Scrapy para su búsqueda de página y Beautiful Soup para el análisis sintáctico. Esto haría que tu código sea mucho más simple.

Si usted desea cambiar su código existente que funciona para estas alternativas depende de usted. De lo contrario, las expresiones regulares probablemente simplificarían un poco tu código. No estoy seguro de qué efecto tendría en el rendimiento.

Así que escribí este guión corto (¿palabra correcta?) Para descargar las imágenes de historietas de explosm.net porque hace poco descubrí algo sobre él y quiero ... ponerlo en mi iPhone ... 3G.

Funciona bien y todo. urllib2 para obtener la página web html y urllib para image.retrieve ()

Por qué publiqué esto en SO: ¿cómo optimizo este código? ¿REGEX (expresiones regulares) lo haría más rápido? ¿Es una limitación de internet? Mal algoritmo ...?

Cualquier mejora en la velocidad o en la estética general del código sería muy apreciada como "respuestas".

Gracias.

--------------------------------CÓDIGO----------------- -----------------

import urllib, urllib2 def LinkConvert(string_link): for eachLetter in string_link: if eachLetter == " ": string_link = string_link[:string_link.find(eachLetter)] + "%20" + string_link[string_link.find(eachLetter)+1:] return string_link start = 82 end = 1506 matchingStart = """<img alt="Cyanide and Happiness, a daily webcomic" src="http://www.explosm.net/db/files/Comics/""" matchingEnd = """></""" link = "http://www.explosm.net/comics/" for pageNum in range(start,start+7): req = urllib2.Request(link+`pageNum`) response = urllib2.urlopen(req) page = response.read() istart1 = page.find(matchingStart) iend1 = page.find(matchingEnd, istart1) newString1 = page[istart1 : iend1] istart2 = newString1.find("src=")+4 iend2 = len(newString1) final = newString1[istart2 +1 : iend2 -1] final = LinkConvert(final) try: image = urllib.URLopener() image.retrieve(final, `pageNum` + ".jpg") except: print "Uh-oh! " + `pageNum` + " was not downloaded!" print `pageNum` + " completed..."

Por cierto, este es el código de Python 2.5, no el 3.0, pero puedes apostar que tengo todas las características de PYthon 3.0 estudiadas y reproducidas antes o después del Año Nuevo (después de College Apps - ¡YAY! ^ - ^)


Sugiero usar BeautifulSoup para hacer el análisis sintáctico, simplificaría mucho tu código.

Pero como ya lo hizo funcionar de esta manera, tal vez no querrá tocarlo hasta que se rompa (el formato de la página cambia).


urllib2 usa llamadas de bloqueo, y esa es la razón principal del rendimiento. Debe usar una biblioteca que no sea de bloqueo (como scrapy) o usar varios hilos para la recuperación. Nunca he usado scrapy (así que no puedo decir con esa opción), pero enhebrar en python es realmente fácil y directo.


refactormycode puede ser un sitio web más apropiado para estas discusiones tipo "vamos a mejorar este código".


Hizo lo mismo hoy usando Bash. Es realmente básico, pero funcionó bien.

Primero creé dos directorios, donde puse los archivos:

mkdir -p html/archived mkdir png

Entonces, trabajó con dos pasos. Primero, explore todas las páginas:

START=15 END=4783 for ((i=START;i<=END;i++)); do echo $i wget http://explosm.net/comics/$i/ -O html/$i.html done #Remove 404 find html -name ''*.html'' -size 0 -print0 | xargs -0 rm

Segundo, para cada página, deseche el htmlm y recupere la imagen:

#!/bin/bash for filename in ./html/*.html; do i=`echo $filename | cut -d ''"'' -f 4 | cut -d ''/'' -f3 | cut -d ''.'' -f1` echo "$filename => $i" wget -c "$(grep ''<meta property="og:image" content='' ${filename} | cut -d ''"'' -f 4)" -O ./png/${i}.png mv $filename ./html/archived/ done

El resultado está aquí: Cyanide_and_happiness__up_to_2017-11-24.zip

Tenga en cuenta que no me importó mucho un posible error, pero al contar 4606 archivos, parece que está bien.

También guardé todo como png. Probablemente sean jpg, y noto 185 archivos del tamaño de 0, pero ... siéntete libre de preocuparte por eso, simplemente no lo haré :)