我一直在运行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 :(得分: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。