这不是“我如何使用这些?”以及“我何时/为什么要使用这些?”类型问题。
编辑:此问题几乎与this question重复,建议使用下载中间件来过滤此类请求。更新了我的问题以反映这一点。
在Scrapy CrawlSpider documentation中,规则接受两个callables process_links
和process_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
可调用来过滤掉重复的请求是有意义的。
问题:
process_request
能够更好地适应这项任务?process_request
何时更适用?process_links
或process_request
更合适?如果是这样,您能举例说明何时process_links
或process_request
是更好的解决方案?文档引用:
process_links是一个可调用的或一个字符串(在这种情况下是一个方法来自 将使用具有该名称的蜘蛛对象) 对于使用每个响应从每个响应中提取的每个链接列表 指定link_extractor。这主要用于过滤目的。
process_request是可调用的或字符串(在这种情况下是一个方法) 将使用具有该名称的蜘蛛对象) 调用此规则提取的每个请求,并且必须返回一个 请求或无(过滤掉请求)。
答案 0 :(得分:9)
不,process_links
是您更好的选择,因为您只是过滤网址,并且会节省在Request
中创建process_request
只是为了丢弃它的开销
process_request
非常有用,如果你想在发送它之前按一下Request
,比如说你想要添加meta
参数或者添加或删除头。
您不需要任何中间件,因为您需要的功能直接构建在Rule
中。如果process_links
没有内置到规则中,那么您需要创建自己的中间件。