scrapy CONCURRENT_REQUESTS 每个蜘蛛还是每个机器?
Are scrapy CONCURRENT_REQUESTS per spider or per machine?
设计架构的新手问题在这里:
我的目标
我想随着时间的推移跟踪多个 Twitter 个人资料。
我要构建的内容:
一个 SpiderMother
class 与一些数据库(持有 CrawlJobs)接口以产生和管理许多小蜘蛛,每个蜘蛛以不规则的时间间隔在 Twitter 上抓取 1 个用户页面(作业将根据一些算法)。
它们由 SpiderMother
作为子进程产生,并且根据爬网的成功,数据库作业被删除。这是一个好的架构吗?
我看到的问题:
假设我生成了 100 只蜘蛛,我的 CONCURRENT_REQUESTS
限制是 10 只,twitter.com 会立即被所有 100 只蜘蛛击中,还是它们会排成一排一个接一个地走?
大多数 scrapy 设置/运行时间配置将在 运行 期间为当前打开的蜘蛛隔离。默认的 scrapy 请求下载器也将只对每个蜘蛛起作用,所以如果你启动 100 个进程,你确实会看到 100 个并发请求。您有多个选项可以在全局范围内强制执行每个域的并发性,其中 none 非常简单:
- 每个域只使用一个蜘蛛 运行ning 并通过 redis 提供它(查看 scrapy-redis)。或者一次不要生成超过一只蜘蛛。
- 拥有固定的蜘蛛池或限制您从协调器生成的蜘蛛数量。将并发设置设置为 "desired_concurrency divided by number of spiders".
- 覆盖 scrapy 下载器 class 行为以在外部存储其值(例如在 redis 中)。
就我个人而言,我可能会选择第一个,如果受到单个进程规模的性能限制,则选择第二个。
设计架构的新手问题在这里:
我的目标 我想随着时间的推移跟踪多个 Twitter 个人资料。
我要构建的内容:
一个 SpiderMother
class 与一些数据库(持有 CrawlJobs)接口以产生和管理许多小蜘蛛,每个蜘蛛以不规则的时间间隔在 Twitter 上抓取 1 个用户页面(作业将根据一些算法)。
它们由 SpiderMother
作为子进程产生,并且根据爬网的成功,数据库作业被删除。这是一个好的架构吗?
我看到的问题:
假设我生成了 100 只蜘蛛,我的 CONCURRENT_REQUESTS
限制是 10 只,twitter.com 会立即被所有 100 只蜘蛛击中,还是它们会排成一排一个接一个地走?
大多数 scrapy 设置/运行时间配置将在 运行 期间为当前打开的蜘蛛隔离。默认的 scrapy 请求下载器也将只对每个蜘蛛起作用,所以如果你启动 100 个进程,你确实会看到 100 个并发请求。您有多个选项可以在全局范围内强制执行每个域的并发性,其中 none 非常简单:
- 每个域只使用一个蜘蛛 运行ning 并通过 redis 提供它(查看 scrapy-redis)。或者一次不要生成超过一只蜘蛛。
- 拥有固定的蜘蛛池或限制您从协调器生成的蜘蛛数量。将并发设置设置为 "desired_concurrency divided by number of spiders".
- 覆盖 scrapy 下载器 class 行为以在外部存储其值(例如在 redis 中)。
就我个人而言,我可能会选择第一个,如果受到单个进程规模的性能限制,则选择第二个。