Scrapy将变量和URL一起发送给蜘蛛

时间:2016-02-26 06:32:22

标签: python scrapy web-crawler bots scrapy-spider

我使用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发送给我的蜘蛛?

1 个答案:

答案 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']