我在其他問題中使用了以下問題,但是這次我的問題是關於服務器性能問題。所以,我決定提出一個新問題。抓取時遠程服務器性能問題
我嘗試運行下面的蜘蛛。它只需要通過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
謝謝!
你指的是什麼「我的服務器」?您是在WSGI應用程序內部運行此代碼還是其他內容?如果是這樣,顯而易見的事情就是在本地解釋器中運行相同的代碼,以便將與服務器相關的任何內容都排除在外。如果問題仍然存在,你有答案,對吧? – abarnert
無論如何,許多Web服務器故意扼殺過度激進的客戶端,因爲(a)他們已經獲得了他們希望您使用的正確的Web服務,(b)他們不希望您在不看到所有信息的情況下閱讀所有信息廣告,(c)他們不希望任何人獲得他們所有的信息,因爲這是他們的實際價值所在,和/或(d)他們不想爲所有帶寬付費。(許多較小的網站使用託管提供商自動調節,但在這種情況下,它基本上是(d)。) – abarnert
@abarnert:我只是從筆記本電腦和互聯網連接運行蜘蛛,所以談論「我的服務器」可能只是我不完全理解正在發生什麼。對於那個很抱歉。 – Mace