gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:54:57 26 4
gpt4 key购买 nike

我创建了一个蜘蛛,它应该抓取多个网站,我需要为 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)
]

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

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

最佳答案

我假设您正在使用CrawlSpider。默认情况下,CrawlSpider 规则适用于您的蜘蛛正在抓取的所有页面(无论域)。

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

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

另一种选择是子类化 CrawlSpider 并根据您的需求进行自定义:

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

关于python - Scrapy:为每个start_url动态生成规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37640023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com