0

我在其他问题中使用了以下问题,但这次我的问题是关于服务器性能的。所以,我决定问一个新问题。

我尝试在下面运行蜘蛛。它只需要浏览 2478 页,但我仍然有性能问题。最初,使用以下设置抓取数据大约需要 2.5 小时:

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

这对我来说似乎很慢。为了加速蜘蛛我然后设置HTTPCACHE_ENABLED = True但在前 100 页之后蜘蛛只返回“500 内部服务器错误”,我什至无法在浏览器中查看网页。

关于我为什么收到此错误的任何想法?我该怎么做才能避免这个问题?

我的代码如下:

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 秒之间的随机时间,有时它会有两个同时进行的请求,依此类推……但是以这种方式下载 2478 个页面的预期值是 5 * 2477 = 12385 秒 = 3: 26:25。

如果设置HTTPCACHE_ENABLED有所不同,显然您之前已经运行了 3.5 小时,并且其中大部分仍然存在于同一个缓存目录中。(您不能破坏事物并使其重复下载相同的页面,因为您提供BaseSpider的是静态页面列表,而不是Request从中返回任何对象parse。)


但是调试它的简单方法是将所有代码移开。生成地址列表并尝试使用curlwget或其他内容下载它们。

当我尝试这个时,即使请求之间有 10 秒的延迟,几乎所有请求都需要大约 20 秒才能返回 500 错误,其中一些根本没有响应。这对我来说肯定是服务器问题。因此,您无能为力,只能联系服务器管理员。

于 2013-06-11T21:52:52.537 回答