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é :)