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

Cat*_*oes 4 python web-crawler scrapy

这不是"我该如何使用这些?" 以及"我何时/为何使用这些?" 类型问题.

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

Scrapy CrawlSpider文档中,规则接受两个callables 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"
Run Code Online (Sandbox Code Playgroud)

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

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

问题:

  1. 有什么理由process_request可以更好地适应这项任务吗?
  2. 如果没有,你能提供一个何时process_request更适用的例子?
  3. 是一个下载中间件比任何更合适process_links还是process_request?如果是这样,您能提供何时process_linksprocess_request将会是更好的解决方案的示例?

文件报价:

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

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

Ste*_*oth 9

  1. 不,process_links是你在这里更好的选择,如你只是过滤URL,并保存其创建的开销Requestprocess_request刚刚丢弃它.

  2. process_request如果你想Request在发送它之前稍微按摩一下,比如你想要添加一个meta参数或者添加或删除标题,这是很有用的.

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