Scrapy:为每个start_url动态生成规则

时间:2016-06-05 08:44:24

标签: python xpath scrapy

我创建了一个蜘蛛,它应该抓取多个网站,我需要为start_url列表中的每个网址定义不同的规则。

start_urls = [
    "http://URL1.com/foo"
    "http://URL2.com/bar"
]

rules = [
    Rule (LinkExtractor(restrict_xpaths=("//" + xpathString+"/a")), callback="parse_object", follow=True)
]

规则中唯一需要更改的是restrict_xpath的xpath字符串。我已经提出了一个函数,可以从任何网站动态获取我想要的xpath。 我想我可以获取蜘蛛将要抓取的当前URL并将其传递给该函数,然后将生成的xpath传递给规则。

不幸的是,我一直在搜索,似乎这是不可能的,因为scrapy使用调度程序并从一开始就编译所有start_urls和规则。是否有任何解决方法可以实现我想要做的事情?

2 个答案:

答案 0 :(得分:1)

我假设你正在使用CrawlSpider。 默认情况下,CrawlSpider rules适用于您的蜘蛛抓取的所有网页(无论是哪个域)。

如果您在起始网址中抓取多个域,并且希望每个域都有不同的规则,则无法告诉scrapy将哪些规则应用于哪个域。 (我的意思是,它没有开箱即用)

您可以一次运行1个起始URL的蜘蛛(以及特定于域的规则,在初始时动态构建)。并且在paralel中运行多个蜘蛛。

另一个选择是子类CrawlSpider并根据您的需要对其进行自定义:

  • 使用域作为键将rules构建为dict, 和值是要应用于该域的规则列表。请参阅_compile_rules方法。
  • 并根据响应的域应用不同的规则。请参阅_requests_to_follow

答案 1 :(得分:0)

您可以覆盖parse方法。此方法将获得具有完整html内容的scrapy响应对象。你可以在上面运行xpath。您还可以从响应对象中检索URL,并根据URL,运行自定义xpath。

请在此处查看文档:{​​{3}}