【问题标题】:Scrapy send variable along with URL to spiderScrapy 将变量和 URL 一起发送给蜘蛛
【发布时间】:2016-02-26 06:32:21
【问题描述】:

我正在使用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。我并不总是为每个 url 提供正确的 guid。

我应该如何将 guid 发送给我的蜘蛛?

【问题讨论】:

  • 可能您将 guid 定义为共享变量(在 init 之外,在它之上)。由于异步并且只有一种方法来保存一个值。只是猜测
  • 我应该把它放在哪里? :)

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


【解决方案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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    相关资源
    最近更新 更多