他の質問で以下の問題を使用したことがありますが、今回はサーバーのパフォーマンスに関する質問です。それで、私は新しい質問をすることにしました。
下のスパイダーを実行してみます。2478 ページを通過するだけで済みますが、それでもパフォーマンスの問題があります。最初は、次の設定でデータをスクレイピングするのに約 2.5 時間かかりました。
LOG_ENABLED = True
CONCURRENT_REQUESTS_PER_DOMAIN = 2
RETRY_TIMES = 20
DOWNLOAD_DELAY = 5
私には非常に遅いようです。スパイダーを高速化するために設定しHTTPCACHE_ENABLED = True
ましたが、最初の 100 ページの後、スパイダーは「500 内部サーバー エラー」のみを返し、ブラウザーで Web ページを表示することさえできませんでした。
このエラーが発生する理由について何か考えはありますか? そして、この問題を回避するにはどうすればよいですか?
私のコードは次のとおりです。
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&type=Fritidshus&type=Landejendom&type=Andet&kom=&amt=&fraPostnr=&tilPostnr=&iPostnr=&gade=&min=&max=&byggetMin=&byggetMax=&minRooms=&maxRooms=&minSize=&maxSize=&minsaledate=1993&maxsaledate=1994&kode=&p=%d' %n for n in xrange(1, 2479, 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
ありがとう!