2017-01-29 36 views
0

我一直在運行的Scrapy刮刀,並注意到它返回重複的結果。換句話說,它是從另一個項目分配項目的結果。當請求同時運行時,Scrapy會覆蓋結果嗎?

我的設置文件有CONCURRENT_REQUESTS = 100,並且不設置DOWNLOAD_DELAY

這是我的蜘蛛代碼:

def start_requests(self): 
    settings = get_project_settings() 
    ids = settings.get('IDS', None) 
    for i, id in enumerate(ids): 
     yield FormRequest(
      url=self._FORM_URL, 
      formdata={ 'id': id }, 
      meta={'id': id}, 
     ) 

def parse(self, response): 
    addr_xpath = '//div[@class="w80p left floatRight"]//text()' 
    addresses = response.xpath(addr_xpath).extract() 
    if not addresses: 
     raise DropItem("Can't find address") 

    item = MyItem() 
    item['address'] = ', '.join(addresses) 
    return item 

這是我的項目代碼:

class MyItem(scrapy.Item): 
    id = scrapy.Field() 
    address = scrapy.Field() 

我的一些項目具有不同的ID,但相同的地址,即使網頁我爲不同的ID返回不同的地址。我認爲結果會並行返回,並意外地相互覆蓋。

我在做什麼錯?我正在使用Scrapy v0.24.6和Twisted v16.6.0。

+0

爲什麼要使用scrapy v0.24.6?這就像現在5歲。在[最新PyPI上的版本是1.3(https://pypi.python.org/pypi/Scrapy/1.3.0) – Granitosaurus

回答

0

它可能發生,因爲cookie的會話。在一個蜘蛛使用多個cookie會話,你需要使用cookiejar元參數,在您的要求:

for i, url in enumerate(urls): 
    yield scrapy.Request(url, meta={'cookiejar': i}, 
         callback=self.parse_page) 

Multiple cookie sessions per spider

沒有爲使用cookiejar保持每蜘蛛多個cookie會話的支持請求元鍵。默認情況下,它使用一個cookie jar(會話),但是你可以傳遞一個標識符來使用不同的標識符。