我使用https://github.com/rolando/scrapy-redis创建一个从Redis列表中读取URL的蜘蛛。我遇到的问题是我想在每个URL的旁边发送一个唯一的ID。这样我就可以再次识别数据库中的条目。
我在redis中的列表如下所示: http://google.com[someuniqueid] http://example.com[anotheruniqueid]
默认情况下,Scrapy-redis只读取redis中的一个url,然后发送给蜘蛛。
我修改了内部:https://github.com/rolando/scrapy-redis/blob/master/scrapy_redis/spiders.py
并改变了这个功能:
def next_request(self):
"""Returns a request to be scheduled or none."""
url = self.server.lpop(self.redis_key)
if url:
mm = url.split("[")
self.guid = mm[1].replace("]", "")
return self.make_requests_from_url(mm[0])
这很有效,我可以通过调用我的蜘蛛来获取guid:
print self.guid
但问题是它似乎混淆了guid的问题。每个网址我都没有正确的guid。
我应该如何将guid发送给我的蜘蛛?
答案 0 :(得分:1)
这种情况发生的原因是scrapy是异步的,并且您将异步数据存储在对象变量中,因此您无法依赖它。几乎没有办法解决这个问题。最常见的是:
使用scrapy.Request
with meta={'guid': guid}
参数。
替换这一行:
return self.make_requests_from_url(mm[0])
使用:
return scrapy.Request(mm[0], meta={'guid': mm[1].replace("]", "")}
现在在您的parse()
中,您可以通过以下方式访问guid:
def parse(self, response):
guid = response.meta['guid']