我的查询适用于CrawlSpider
我理解链接提取器rules
是一个静态变量,
我可以在运行时更改rules
,例如
@classmethod
def set_rules(cls,rules):
cls.rules = rules
通过
self.set_rules(rules)
这是CrawlSpider
的可接受做法吗?如果没有,请建议适当的方法
我的用例,
我正在使用scrapy来抓取特定网站的某些类别A,B,C .... Z.每个类别有1000个链接,分布在10页以上
当scrapy点击某个“太旧”类别的链接时。我希望抓取工具仅仅针对该类别停止跟踪/抓取10页的其余部分,因此我需要动态规则更改。
请指出正确的方向。
谢谢!
答案 0 :(得分:1)
我建议您编写自己的自定义下载中间件。这些将允许您过滤掉那些您不想再提出的请求。
有关Scrapy架构概述的更多详细信息,请访问:http://doc.scrapy.org/en/master/topics/architecture.html
关于下载中间件以及如何编写自定义中间件:http://doc.scrapy.org/en/master/topics/downloader-middleware.html
答案 1 :(得分:1)
蜘蛛中的规则并不意味着动态更改。它们是在CrawlSpider的实例化时编译的。您可以随时更改spider.rules
并重新运行spider._compile_rules()
,但我建议不要这样做。
规则为Crawler创建一组指令以排队爬网(即,它排队Requests
)。这些请求在发送之前不会被重新访问和重新评估,因为规则没有被设计和#34;改变。因此,即使您确实动态地更改了规则,您仍然可能最终会发出一堆您并不打算发出的请求,并且仍会抓取您并不意味着的大量内容。
例如,如果您的目标页面已设置为"类别A"包含指向"类别A"的第1到10页的链接,然后Scrapy将对所有这10个页面的请求进行排队。如果第2页的条目过于陈旧,那么更改规则将无效因为第3-10页的请求已经排队等待。
正如@ imx51所说,编写一个Downloader Middleware会好得多。这些将能够删除您不想再发出的每个请求,因为它们会在下载之前触发每个请求。