创建可扩展的分布式网络爬虫和刮板的好管道是什么?

What would be a good pipeline to create a scalable, distributed web crawler and scraper?

我想为药房产品网页构建一个半通用的爬虫和刮板。

我知道大多数网站都不相等,但我在列表中的大多数 URL 都遵循一种特定类型的逻辑:

  1. 比如用Microdata,JSON-ld等,我已经可以抓到某组网页了

  2. 通过使用存储在配置文件中的 XPath,我可以抓取和抓取其他一些网站。

  3. 其他方法对其他网站也适用,如果我已经可以从 80% 的数据中提取我需要的信息,我会对结果感到非常满意。

本质上我担心建立一个好的管道来解决与监控(处理突然改变其结构的网页)、可扩展性和性能.

我想到了以下管道(不考虑存储):

创建 2 个主蜘蛛。一种在给定域的情况下抓取网站的方法。它获取网页内的所有 URLs(当然服从 robots.txt)并将其放入队列系统中,该队列系统存储 scrape-readyURLs =45=]。然后,第二个爬虫获取队列中的最后一个 URL 并使用元数据、XPath 或任何其他方法提取它。然后,这又被放入另一个队列系统,最终将由一个模块处理,该模块将队列中的所有数据放入数据库(我仍然不知道它应该是 SQL 还是 NoSQL).

这个系统的优点是通过在提取和存储的主要进程之间放置队列,并行化和可扩展性变得可行。

我的逻辑有没有问题?我错过了什么?

非常感谢。

首先,这种方法会奏效;我和我的团队基于该结构构建了许多爬虫,它们非常高效。

就是说,如果您想要扩展,我会推荐一种稍微不同的方法。对于我自己的大型爬虫,我有一个3程序的方法。

  1. 有一个程序可以安排处理要下载的 URL。
  2. 有一个程序可以执行实际的下载
  3. 有一个程序可以从下载的页面中提取信息,并为处理计划的程序添加新链接。

另一个主要建议是,如果您完全使用 cURL,则需要使用 cURL 多接口和 FIFO 队列来处理从调度程序到下载程序的数据发送。

这种方法的优点是它将处理与下载分开。这允许您通过添加新服务器和并行操作来扩展爬虫。

在 Potent Pages,这是我们用于站点蜘蛛的架构,它可以同时处理数百个站点的下载。我们使用 MySQL 来保存数据(链接等),但随着规模的扩大,您需要进行大量优化。另外,如果您有很多数据库,phpmyadmin 就会开始崩溃,但是每个站点拥有一个数据库确实可以加快解析过程,因此您不必浏览数百万行数据。