Я очищаю 23770 веб-страниц с довольно простым скребком с помощью scrapy
. Я совершенно новичок в scrapy и даже python, но сумел написать паука, который выполняет эту работу. Это, однако, очень медленно (требуется около 28 часов для сканирования 23770 страниц).Ускорьте скребок в Интернете
Я просмотрел веб-страницу scrapy
и списки рассылки и stackoverflow
, но я не могу найти общие рекомендации для написания быстрых сканеров, понятных для новичков. Может быть, моя проблема не в самом паук, а в том, как я ее запускаю. Все предложения приветствуются!
Я перечислил свой код ниже, если это необходимо.
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
Спасибо!
Первое, что вы можете сделать, это использовать потоки (см. Соответствующую информацию в стандартном библиотечном документе) для запуска, скажем, 5/10 загрузок одновременно, что, очевидно, может привести к большому времени выполнения улучшение. Помимо этого, я не вижу никакого простого способа ускорить это, так как ваш код кажется простым. – michaelmeyer
@doukremt: Спасибо! Я просмотрел документацию, и это кажется довольно простым для того, для чего мне это нужно. Правильно ли понятно, что для каждого соединения я должен называть 'thread.start_new_thread (parse)'? Или я просто получаю два соединения, каждый из которых очищает все страницы 23770? – Mace
scrapy - фактически асинхронный, поэтому он фактически загружает параллельно (вы можете установить, сколько одновременных запросов оно делает). –