5

这不是“我如何使用这些?” 以及更多“我何时/为什么要使用这些?” 键入问题。

编辑:这个问题与这个问题几乎重复,它建议使用下载中间件来过滤此类请求。在下面更新了我的问题以反映这一点。

Scrapy CrawlSpider 文档中,规则接受两个可调用对象,process_linksprocess_request(下面引用的文档以便于参考)。

默认情况下,Scrapy 过滤重复的 URL,但我希望对请求进行额外的过滤,因为我得到了具有多个不同URL 链接到它们的页面的重复。像,

URL1 = "http://example.com/somePage.php?id=XYZ&otherParam=fluffyKittens"
URL2 = "http://example.com/somePage.php?id=XYZ&otherParam=scruffyPuppies"

但是,这些 URL 将在查询字符串中具有类似的元素 - 如上所示,它是id.

我认为使用process_links我的蜘蛛的可调用来过滤重复请求是有意义的。

问题:

  1. 有什么理由process_request可以更好地完成这项任务吗?
  2. 如果不是,您能否举例说明何时process_request更适用?
  3. process_links下载中间件是否比两者更合适process_request?如果是这样,您能否举例说明何时process_linksprocess_request将是更好的解决方案?

文档引用:

process_links 是一个可调用的或一个字符串(在这种情况下,将使用来自具有该名称的蜘蛛对象的方法),它将为使用指定的链接提取器从每个响应中提取的每个链接列表调用。这主要用于过滤目的。

process_request 是一个可调用的,或者是一个字符串(在这种情况下,将使用来自具有该名称的蜘蛛对象的方法)将在此规则提取的每个请求中调用,并且必须返回一个请求或 None (过滤掉请求)。

4

1 回答 1

9
  1. 不,process_links这里是您更好的选择,因为您只是在过滤 url,并且将节省必须创建Requestinprocess_request以丢弃它的开销。

  2. process_request如果您想在发送它之前稍微按摩Request一下,例如如果您想添加一个meta参数或者可能添加或删除标题,那么它很有用。

  3. 您不需要任何中间件,因为您需要的功能直接内置在Rule. 如果process_links没有内置到规则中,那么您将需要创建自己的中间件。

于 2013-04-16T15:07:22.447 回答