Scrapy:CrawlSpider规则process_links vs process_request vs下载中间件

时间:2013-04-16 14:55:10

标签: python web-crawler scrapy

这不是“我如何使用这些?”以及“我何时/为什么要使用这些?”类型问题。

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

Scrapy CrawlSpider documentation中,规则接受两个callables process_linksprocess_request(以下引用的文档以便于参考)。

默认情况下,Scrapy会过滤重复的网址,但我希望对请求进行额外的过滤,因为我会获得包含多个链接到它们的不同网址的网页副本。比如,

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

但是,这些网址在查询字符串中会有一个类似的元素 - 上面显示的是id

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

问题:

  1. 为什么process_request能够更好地适应这项任务?
  2. 如果没有,您能举例说明process_request何时更适用?
  3. 下载中间件是否比process_linksprocess_request更合适?如果是这样,您能举例说明何时process_linksprocess_request是更好的解决方案?
  4. 文档引用:

      

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

         

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

1 个答案:

答案 0 :(得分:9)

  1. 不,process_links是您更好的选择,因为您只是过滤网址,并且会节省在Request中创建process_request只是为了丢弃它的开销

  2. process_request非常有用,如果你想在发送它之前按一下Request,比如说你想要添加meta参数或者添加或删除头。

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