当请求同时运行时,Scrapy会覆盖结果吗?

时间:2017-01-29 19:37:32

标签: web-scraping 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。

1 个答案:

答案 0 :(得分: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 Request元组密钥为每个蜘蛛保留多个cookie会话。默认情况下,它使用单个cookie jar(会话),但您可以传递标识符以使用不同的cookie。