Frage

So schrieb ich dieses kurzes Skript (richtiges Wort?), Um die Comic-Bilder von explosm.net Comics zum Download, weil ich etwas-vor kurzem davon erfuhr, und ich will ... lege es auf meinem iPhone ... 3G.

Es funktioniert gut, und alle. urllib2 für immer die Homepage html und urllib für image.retrieve ()

Warum ich dies auf SO geschrieben: Wie optimiere ich diesen Code? Würde REGEX (reguläre Ausdrücke) macht es schneller? Ist es eine Internet-Beschränkung? Schlechter Algorithmus ...?

Alle Verbesserungen in der Geschwindigkeit oder allgemeine Code Ästhetik würde stark "Antworten" geschätzt werden.

Danke.

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

By the way, dieser Python ist 2.5 Code, nicht 3,0 sondern Sie darauf wetten, ich habe alle Funktionen von Python 3.0 stark studiert und spielten mit vor oder direkt nach Neujahr (nach dem College Apps - YAY! ^ - ^)

War es hilfreich?

Lösung

Ich würde vorschlagen, Scrapy für Ihre Seite Abrufen und Schöne Suppe für die Analyse. Dies würde Ihr Code viel einfacher machen.

Ob Sie Ihren vorhandenen Code ändern möchten, die zu diesen Alternativen funktioniert, ist Ihnen überlassen. Wenn nicht, dann würden reguläre Ausdrücke wahrscheinlich Code etwas vereinfachen. Ich bin mir nicht sicher, welche Auswirkungen es auf die Leistung haben.

Andere Tipps

refactormycode kann eine geeignetere Website sein für diese „lassen Sie uns diesen Code verbessern“ Art der Diskussionen.

Ich schlage vor, mit BeautifulSoup die Analyse zu tun, wäre es Ihr Code viel simplifly .

Aber da du schon habe es auf diese Weise vielleicht arbeiten Sie nicht wollen, es zu berühren, bis es (Seite Formatänderungen) bricht.

urllib2 verwendet Anrufe zu blockieren, und das ist der Hauptgrund für die Leistung. Sie sollten eine nicht-blockierende Bibliothek (wie scrapy) verwenden oder mehrere Threads für die Wiedergewinnung verwendet werden. Ich habe noch nie scrapy verwendet (so kann ich auf dieser Option nicht sagen), aber in Python threading ist einfach und unkompliziert.

Hat das gleiche heute mit Bash. Es ist wirklich einfach, aber hat gut funktioniert.

Ich habe zunächst zwei Verzeichnisse, in denen ich die Dateien setzen:

mkdir -p html/archived
mkdir png

Dann arbeitete mit zwei Schritten. Zuerst sehen Sie alle Seiten:

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

2., für jede Seite, die htmlm Schrott und das Bild abzurufen:

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

Das Ergebnis ist hier: Cyanide_and_happiness__up_to_2017-11-24.zip

Beachten Sie, dass ich nicht viel kümmern uns um einen möglichen Ausfall, aber das Zählen 4606 Dateien, wie es scheint meistens OK.

Ich sparte auch alles als png. Sie sind wahrscheinlich jpg, und ich merke, 185 0 große Dateien, aber ... fühlen sich frei, um ihn zu kümmern, ich will einfach nicht:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top