为网络爬虫存储URL边界和分发工作?
Storing URL frontier and distributing work for web crawler?
我想制作一个具有成本效益的分布式爬虫(即我可以向其添加额外的服务器以更快地处理 URLs),它专注于将整个单个站点作为服务进行爬网。它会抓取目标站点的每个 URL 并下载例如本网站在其他网站上直接引用的任何图像或文件(但不抓取除此之外的其他网站)。由于目标站点所有者会授予爬取其站点的权限,因此爬虫可能不太礼貌,例如每秒下载 20 页。
这个架构听起来合理吗?
作为工作人员的 AWS ECS2 实例可以根据需要终止或联机。
AWS RDS 数据库 运行 PostgreSQL 用于存储页面元数据。
URL边界(要抓取URLs),已见列表URLs,URL抓取深度等。存储在数据库中。
工作人员将轮询数据库以查找新工作,以及哪个工作人员正在处理数据库中存储的内容。
我会维护一个包含 URL 的数据库 table 以供查看哪些工作人员会在 URL 开始抓取时标记时间戳并完成。如果一名工人死亡,另一名工人将注意到工作未在超时期限内完成,从而接手该工作。
假设一个工作人员每秒可以抓取几百页,工作人员一次抓取大量 URL 进行处理以提高效率是有意义的。不过,我不确定是否有一种简单的方法可以限制每秒对单个主机进行的爬网次数。
当工作人员对链接进行排队时,这样做的数据库查询将避免对已经看到的链接进行排队。
我读过几篇关于您不应该(并且应该!)将 PostgreSQL 用作队列的文章...我在这里使用数据库作为队列的想法是它更具成本效益(AWS SQS听起来很昂贵,每百万个请求 0.50 美元),工作人员无论如何都需要将页面元数据写入数据库,因此它需要能够应对已经存在的吞吐量,并且(也许 MQ 系统可以做到这一点)它让我可以编写复杂的排队逻辑.
以上听起来行得通吗?我读过一些关于爬虫的文章,但大多数都没有明确说明工作人员如何沟通以及 URL 边界的存储位置,以便它对故障具有弹性。
关于你的边界我觉得你应该看看frontera or distributed-frontera from scrapinghub
Frontera 预先为您提供了很多功能,例如前沿链接的存储和评分。此外,它是用 Python 编写的,这使得以后的推理和编辑变得容易。
最后一点 -- 文档非常棒,让我在推理网络爬虫如何扩展方面抢先一步。
将 frontera 与 scrapyd 和自定义仪表板一起使用真是一种享受。目前部署在 Digital Ocean 上,但我们可以使用 frontera-distributed 和 EMR (HBASE) 轻松部署到 EC2 和 AWS。
你的建议应该可行。
我想制作一个具有成本效益的分布式爬虫(即我可以向其添加额外的服务器以更快地处理 URLs),它专注于将整个单个站点作为服务进行爬网。它会抓取目标站点的每个 URL 并下载例如本网站在其他网站上直接引用的任何图像或文件(但不抓取除此之外的其他网站)。由于目标站点所有者会授予爬取其站点的权限,因此爬虫可能不太礼貌,例如每秒下载 20 页。
这个架构听起来合理吗?
作为工作人员的 AWS ECS2 实例可以根据需要终止或联机。
AWS RDS 数据库 运行 PostgreSQL 用于存储页面元数据。
URL边界(要抓取URLs),已见列表URLs,URL抓取深度等。存储在数据库中。
工作人员将轮询数据库以查找新工作,以及哪个工作人员正在处理数据库中存储的内容。
我会维护一个包含 URL 的数据库 table 以供查看哪些工作人员会在 URL 开始抓取时标记时间戳并完成。如果一名工人死亡,另一名工人将注意到工作未在超时期限内完成,从而接手该工作。
假设一个工作人员每秒可以抓取几百页,工作人员一次抓取大量 URL 进行处理以提高效率是有意义的。不过,我不确定是否有一种简单的方法可以限制每秒对单个主机进行的爬网次数。
当工作人员对链接进行排队时,这样做的数据库查询将避免对已经看到的链接进行排队。
我读过几篇关于您不应该(并且应该!)将 PostgreSQL 用作队列的文章...我在这里使用数据库作为队列的想法是它更具成本效益(AWS SQS听起来很昂贵,每百万个请求 0.50 美元),工作人员无论如何都需要将页面元数据写入数据库,因此它需要能够应对已经存在的吞吐量,并且(也许 MQ 系统可以做到这一点)它让我可以编写复杂的排队逻辑.
以上听起来行得通吗?我读过一些关于爬虫的文章,但大多数都没有明确说明工作人员如何沟通以及 URL 边界的存储位置,以便它对故障具有弹性。
关于你的边界我觉得你应该看看frontera or distributed-frontera from scrapinghub
Frontera 预先为您提供了很多功能,例如前沿链接的存储和评分。此外,它是用 Python 编写的,这使得以后的推理和编辑变得容易。
最后一点 -- 文档非常棒,让我在推理网络爬虫如何扩展方面抢先一步。
将 frontera 与 scrapyd 和自定义仪表板一起使用真是一种享受。目前部署在 Digital Ocean 上,但我们可以使用 frontera-distributed 和 EMR (HBASE) 轻松部署到 EC2 和 AWS。
你的建议应该可行。