Frage

Ich habe eine einigermaßen lange Liste von Websites, für die ich die Seiten der Landung (index.html oder gleichwertig) herunterladen möchte. Ich benutze derzeit Scrapy (viel Liebe zu den Jungs dahinter - das ist ein fabelhafter Rahmen). Scrapy ist bei dieser speziellen Aufgabe langsamer als ich möchte, und ich frage mich, ob WGet oder eine andere Alternative angesichts der einfachen Aufgabe schneller wäre. Irgendwelche Ideen?

(Hier ist, was ich mit Scrapy mache. Alles, was ich tun kann, um Scrapy für diese Aufgabe zu optimieren?)

Also habe ich eine Start -URLS -Liste wie

start_urls = [google.com yahoo.com aol.com

Und ich kratze den Text aus jeder Antwort und speichere diese in einem XML. Ich muss mich der Offsitemiddleware wenden, um mehrere Domänen zu ermöglichen.

Scrapy funktioniert wie erwartet, scheint aber langsam (ca. 1000 in einer Stunde oder 1 alle 4 Sekunden). Gibt es eine Möglichkeit, dies zu beschleunigen, indem die Anzahl der concurrent_requests_per_spider beim Ausführen einer einzelnen Spinne erhöht wird? Noch etwas?

War es hilfreich?

Lösung

Wenn Sie eine Möglichkeit haben möchten, mehrere Websites mit Python gleichzeitig herunterzuladen, können Sie dies mit den Standardbibliotheken wie folgt tun:

import threading
import urllib

maxthreads = 4

sites = ['google.com', 'yahoo.com', ] # etc.

class Download(threading.Thread):
   def run (self):
       global sites
       while sites:
           site = sites.pop()
           print "start", site
           urllib.urlretrieve('http://' + site, site)
           print "end  ", site

for x in xrange(min(maxthreads, len(sites))):
    Download().start()

Sie können auch auschecken httplib2 oder PycURL das Herunterladen für Sie anstelle von tun urllib.

Ich bin nicht genau klar, wie Sie den abgekratzten Text als XML aussehen sollen, aber Sie könnten verwenden xml.etree.ElementTree aus der Standardbibliothek oder Sie können installieren BeautifulSoup (was besser wäre, wenn es fehlerhaftes Markup umgeht).

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