我创建了一个蜘蛛,该蜘蛛应该可以爬网多个网站,并且需要为start_url列表中的每个URL定义不同的规则。
start_urls = [
"http://URL1.com/foo"
"http://URL2.com/bar"
]
rules = [
Rule (LinkExtractor(restrict_xpaths=("//" + xpathString+"/a")), callback="parse_object", follow=True)
]
规则中唯一需要更改的是limit_xpath的xpath字符串。我已经想出了一个可以从任何网站动态获取我想要的xpath的功能。我以为我可以获取蜘蛛将要抓取的当前URL并将其传递给函数,然后将生成的xpath传递给规则。
不幸的是,我一直在搜索,似乎这是不可能的,因为scrapy利用调度程序并从一开始就编译了所有的start_urls和规则。有什么解决方法可以实现我的目标?
我认为您正在使用CrawlSpider
。默认情况下,CrawlSpider
rules
适用于您的Spider抓取的所有页面(无论哪个域)。
如果您要在起始URL中抓取多个域,并且希望为每个域使用不同的规则,则将无法告诉scrapy哪些规则适用于哪个域。(我的意思是,开箱即用)
您可以一次使用1个起始URL(以及特定于域的规则,在初始化时动态构建)来运行您的Spider。并在平行运行多个蜘蛛。
另一个选择是CrawlSpider
根据您的需要对它进行子类化和自定义:
rules
使用域作为键将其作为dict进行构建,而值则是要应用于该域的规则列表。参见_compile_rules
方法。_requests_to_follow
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句