2008-12-27 10 views
1

J'ai donc écrit ce court script (mot correct?) Pour télécharger les images comiques des bandes dessinées explosm.net parce que je l'ai découvert récemment et je veux ... mets-le sur mon iPhone ... 3G.Télécharger à partir de EXPLOSM.net Comics Script [Python]

Cela fonctionne très bien et tout. urllib2 pour obtenir la page Web html et urllib pour image.retrieve()

Pourquoi j'ai posté ceci sur SO: comment optimiser ce code? REGEX (expressions régulières) le rendrait-il plus rapide? Est-ce une limitation d'Internet? Mauvais algorithme ...?

Toute amélioration de la vitesse ou esthétique code général seraient grandement appréciés « réponses ».

Merci.

-------------------------------- CODE ----------- -----------------------

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..." 

Soit dit en passant, ce code est en Python 2.5, 3.0, mais je parie que vous tous les caractéristiques de PYTHON 3.0 grandement étudié et joué avec avant ou juste après le Nouvel an (après College Apps - YAY^- ^)

+0

Pas vraiment une question, puisque rien n'est cassé. S'il vous plaît poster ceci à votre propre page de blog au lieu d'ici. –

+0

Je suis surpris qu'il n'y ait pas d'outil pré-existant pour le téléchargement par lots webcomic. – biozinc

Répondre

7

Je suggère d'utiliser Scrapy pour l'extraction de vos pages et Beautiful Soup pour l'analyse syntaxique. Cela rendrait votre code beaucoup plus simple.

Si vous voulez changer votre code existant qui fonctionne à ces alternatives est à vous. Si ce n'est pas le cas, les expressions régulières simplifieront probablement votre code. Je ne suis pas sûr de l'effet que cela aurait sur la performance.

0

Je suggère d'utiliser BeautifulSoup pour faire l'analyse syntaxique, il Simplifly votre code beaucoup.

Mais puisque vous l'avez déjà fait fonctionner peut-être que vous ne voudrez pas le toucher jusqu'à ce qu'il casse (changements de format de page).

3

refactormycode peut être un site Web plus approprié pour ces discussions «améliorons ce code».

0

urllib2 utilise des appels bloquants, et c'est la principale raison de la performance. Vous devez utiliser une bibliothèque non bloquante (telle que scrapy) ou utiliser plusieurs threads pour la récupération. Je n'ai jamais utilisé scrapy (donc je ne peux pas dire sur cette option), mais le filetage en python est vraiment simple et facile.

0

A fait la même chose aujourd'hui en utilisant Bash. C'est vraiment basique, mais ça a bien marché.

J'ai d'abord créé deux répertoires, où je mets les fichiers:

mkdir -p html/archived 
mkdir png 

Ensuite, travaillé avec deux étapes.Tout d'abord, parcourir toutes les pages:

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 

2e, pour chaque page, supprimer la htmlm et récupérer l'image:

#!/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 

Le résultat est ici: Cyanide_and_happiness__up_to_2017-11-24.zip

Notez que je n » Je m'inquiète beaucoup d'un échec potentiel, mais en comptant 4606 fichiers, cela semble plutôt OK.

J'ai également tout enregistré comme png. Ils sont probablement jpg, et je remarque 185 fichiers de taille 0, mais ... n'hésitez pas à vous en soucier, je ne le ferai pas :)

Questions connexes