Sto raschiando 23770 pagine Web con un raschietto per web piuttosto semplice utilizzando scrapy
. Sono abbastanza nuovo di scrapy e persino python, ma sono riuscito a scrivere un ragno che fa il lavoro. È, tuttavia, molto lento (ci vogliono circa 28 ore per eseguire la scansione delle 23770 pagine).Rasaerba per rasatura rapida
Ho guardato la pagina web scrapy
e le mailing list e stackoverflow
, ma non riesco a trovare raccomandazioni generiche per la scrittura di crawler veloci comprensibili per i principianti. Forse il mio problema non è lo spider in sé, ma il modo in cui lo eseguo. Tutti i suggerimenti sono benvenuti!
Ho elencato il mio codice qui sotto, se necessario.
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
Grazie!
La prima cosa che puoi fare a questo proposito è usare i thread (vedi le informazioni rilevanti nel doc della libreria standard), per eseguire, ad esempio, 5/10 download allo stesso tempo, il che può ovviamente comportare un grande tempo di esecuzione miglioramento. Oltre a questo, non vedo alcun modo semplice per accelerare le cose, come il tuo codice sembra semplice. – michaelmeyer
@doukremt: Grazie! Ho esaminato la documentazione e sembra abbastanza semplice per quello che mi serve. È correttamente inteso che per ogni connessione dovrei chiamare 'thread.start_new_thread (parse)'? O otterrò solo due connessioni ciascuna raschiando tutte le 23770 pagine? – Mace
scrapy è in realtà asincrono, quindi viene scaricato in parallelo (puoi impostare quante richieste simultanee fa). –