Ich kratze 23770 Webseiten mit einem ziemlich einfachen Web Schaber mit scrapy
. Ich bin ziemlich neu bei Scrapy und sogar Python, habe es aber geschafft, eine Spinne zu schreiben, die diese Aufgabe erfüllt. Es ist jedoch sehr langsam (es dauert ca. 28 Stunden, um die 23770 Seiten zu crawlen).Beschleunigen Sie Web Schaber
Ich habe auf die scrapy
Webseite und die Mailinglisten und stackoverflow
geschaut, aber ich kann nicht scheinen, allgemeine Empfehlungen zum Schreiben von schnellen Crawlern zu finden, die für Anfänger verständlich sind. Vielleicht ist mein Problem nicht die Spinne selbst, sondern die Art, wie ich sie betreibe. Alle Vorschläge willkommen!
Ich habe meinen Code unten aufgeführt, wenn es benötigt wird.
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item, Field
import re
class Sale(Item):
Adresse = Field()
Pris = Field()
Salgsdato = Field()
SalgsType = Field()
KvmPris = Field()
Rum = Field()
Postnummer = Field()
Boligtype = Field()
Kvm = Field()
Bygget = Field()
class HouseSpider(BaseSpider):
name = 'House'
allowed_domains = ["http://boliga.dk/"]
start_urls = ['http://www.boliga.dk/salg/resultater?so=1&type=Villa&type=Ejerlejlighed&type=R%%C3%%A6kkehus&kom=&amt=&fraPostnr=&tilPostnr=&iPostnr=&gade=&min=&max=&byggetMin=&byggetMax=&minRooms=&maxRooms=&minSize=&maxSize=&minsaledate=1992&maxsaledate=today&kode=&p=%d' %n for n in xrange(1, 23770, 1)]
def parse(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select("id('searchresult')/tr")
items = []
for site in sites:
item = Sale()
item['Adresse'] = site.select("td[1]/a[1]/text()").extract()
item['Pris'] = site.select("td[2]/text()").extract()
item['Salgsdato'] = site.select("td[3]/text()").extract()
Temp = site.select("td[4]/text()").extract()
Temp = Temp[0]
m = re.search('\r\n\t\t\t\t\t(.+?)\r\n\t\t\t\t', Temp)
if m:
found = m.group(1)
item['SalgsType'] = found
else:
item['SalgsType'] = Temp
item['KvmPris'] = site.select("td[5]/text()").extract()
item['Rum'] = site.select("td[6]/text()").extract()
item['Postnummer'] = site.select("td[7]/text()").extract()
item['Boligtype'] = site.select("td[8]/text()").extract()
item['Kvm'] = site.select("td[9]/text()").extract()
item['Bygget'] = site.select("td[10]/text()").extract()
items.append(item)
return items
Vielen Dank!
Das erste, was Sie tun können, ist die Verwendung von Threads (siehe die entsprechenden Informationen im Dokument der Standardbibliothek), um beispielsweise 5/10 Downloads gleichzeitig auszuführen, was offensichtlich zu einer großen Ausführungszeit führen kann Verbesserung. Abgesehen davon sehe ich keine einfache Möglichkeit, die Dinge zu beschleunigen, da Ihr Code einfach zu sein scheint. – michaelmeyer
@doukremt: Danke! Ich habe mir die Dokumentation angeschaut und es scheint ziemlich einfach zu sein, wofür ich sie brauche. Ist es richtig verstanden, dass ich für jede Verbindung 'thread.start_new_thread (parse)' aufrufen soll? Oder bekomme ich nur zwei Verbindungen, die alle 23770 Seiten scrapen? – Mace
scrapy ist eigentlich asynchron, also wird es tatsächlich parallel heruntergeladen (Sie können einstellen, wie viele gleichzeitige Anfragen es machen). –