0

他の質問で以下の問題を使用したことがありますが、今回はサーバーのパフォーマンスに関する質問です。それで、私は新しい質問をすることにしました。

下のスパイダーを実行してみます。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

ありがとう!

4

1 に答える 1

0

最初は、次の設定でデータをスクレイピングするのに約 2.5 時間かかりました。

LOG_ENABLED = True CONCURRENT_REQUESTS_PER_DOMAIN = 2 RETRY_TIMES = 20 DOWNLOAD_DELAY = 5

同じサイトから連続したページをダウンロードする前に、5 秒待つように要求しています。というDOWNLOAD_DELAYことです。実際には 2.5 秒から 7.5 秒の間のランダムな時間待機し、2 つの同時リクエストが処理中であることもあります... しかし、この方法で 2478 ページをダウンロードする場合の期待値は 5 * 2477 = 12385 秒 = 3 です。 26:25。

設定HTTPCACHE_ENABLEDが違いを生む場合、どうやらすでに 3.5 時間前に実行しており、そのほとんどが同じキャッシュ ディレクトリにまだ存在しているようです。BaseSpider(ページの静的リストをフィードし、Requestからオブジェクトを返さないため、物事を壊して同じページを繰り返しダウンロードさせることはできませんparse。)


しかし、これをデバッグする簡単な方法は、すべてのコードを邪魔にならないようにすることです。curlアドレスのリストを生成し、またはwgetまたは何かを使用してそれらをダウンロードしてみてください。

これを試したところ、リクエスト間に 10 秒の遅延があったとしても、ほぼすべてのリクエストで 500 エラーを返すのに 20 秒ほどかかり、そのうちのいくつかはまったく応答しませんでした。それは確かにサーバーの問題のように思えます。したがって、サーバー管理者に連絡することを除いて、それについてできることは何もありません。

于 2013-06-11T21:52:52.537 に答える