Scrapy - 蜘蛛开始爬行后更改规则

时间:2015-08-13 05:44:26

标签: python scrapy

我的查询适用于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页的其余部分,因此我需要动态规则更改。

请指出正确的方向。

谢谢!

2 个答案:

答案 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会好得多。这些将能够删除您不想再发出的每个请求,因为它们会在下载之前触发每个请求。