我正在使用Scrapy,我希望能够更好地控制爬虫。为此,我想根据我正在处理的当前URL设置规则。
例如,如果我在example.com/a
,我想应用LinkExtractor(restrict_xpaths='//div[@class="1"]')
的规则。如果我在example.com/b
,我想使用另一个规则和不同的链接提取器。
我如何做到这一点?
答案 0 :(得分:2)
我只是在单独的回调中对它们进行编码,而不是依赖于CrawlSpider规则。
def parse(self, response):
extractor = LinkExtractor(.. some default ..)
if 'example.com/a' in response.url:
extractor = LinkExtractor(restrict_xpaths='//div[@class="1"]')
for link in extractor.extract_links(response):
yield scrapy.Request(link.url, callback=self.whatever)
这比尝试在运行时更改规则要好,因为规则对于所有回调都应该是相同的。
在这种情况下,我刚刚使用了链接提取器,但是如果你想使用不同的规则,你可以做同样的事情,镜像相同的代码来处理规则in the loop shown from CrawlSpider._requests_to_follow。