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

2024-06-03 00:12:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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。 我想我只需获取spider将要抓取的当前URL并将其传递给函数,然后将得到的xpath传递给规则。在

不幸的是,我一直在搜索,这似乎是不可能的,因为scrapy利用了一个调度器,从一开始就编译了所有的start_url和规则。有没有什么解决办法可以达到我想要做的?在


Tags: 函数comhttp列表定义foo网站规则
2条回答

我假设您正在使用CrawlSpider。 默认情况下,CrawlSpiderrules应用于蜘蛛正在爬行的所有页面(无论是哪个域)。在

如果你在起始url中抓取多个域,并且希望每个域有不同的规则,你就不能告诉scrapy哪些规则适用于哪个域。(我是说,它不是现成的)

您可以一次使用1个起始URL运行spider(以及在初始化时动态构建的特定于域的规则)。同时运行多个蜘蛛。在

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

  • 使用域作为键将rules构建为dict, 值是应用于该域的规则列表。请参见^{}方法。在
  • 并根据响应的域应用不同的规则。见^{}

您可以重写parse方法。此方法将获得一个包含完整html内容的scrapy response对象。您可以在上面运行xpath。您还可以从响应对象检索url,并根据url运行自定义xpath。在

请在此处签出文档:http://doc.scrapy.org/en/latest/topics/request-response.html

相关问题 更多 >