托管网络爬虫的最佳解决方案是什么?

11

我有一个爬虫程序,用于抓取几个不同域名的新文章/内容。总共有成千上万的页面数量,并且每天都会添加大量新的内容。因此,为了能够爬行所有这些内容,我需要我的爬虫程序全天候运行。

目前,我将爬虫脚本托管在与爬虫正在添加内容的站点相同的服务器上,并且我只能在晚上运行cronjob来运行脚本,因为当我运行脚本时,网站基本上会停止工作,因为负载过大。换句话说,这是一个相当糟糕的解决方案。

因此,我想知道对于这种解决方案,我的最佳选择是什么?

  • 是否可以从同一主机继续运行爬虫程序,但以某种方式平衡负载,以使脚本不会导致网站崩溃?

  • 我应该寻找什么类型的主机/服务器来托管爬虫程序?除了正常的Web主机之外,还需要其他规格吗?

  • 爬虫程序保存它抓取的图像。如果我将我的爬虫程序托管在辅助服务器上,如何将我的图像保存在站点的服务器上?我想我不希望uploads文件夹具有CHMOD 777权限,并允许任何人在我的服务器上放置文件。

1个回答

12

我决定选择亚马逊网络服务(Amazon Web Services)来托管我的爬虫,因为他们不仅提供SQS队列,还有自动伸缩的实例。此外,他们还提供了S3用于存储所有的图像。

我还决定将我的整个爬虫重写为Python,而不是PHP,以更轻松地利用队列等功能,并保持应用程序始终运行,而不使用cronjobs。

所以我做了什么,以及它意味着什么:

  1. 我为我的爬虫设置了一个弹性Beanstalk应用程序,该应用程序设置为“Worker”,并监听我存储需要爬取的所有域名的SQS。 SQS是一个“队列”,我可以在其中保存每个需要爬取的域名,爬虫将侦听队列并一次获取一个域名,直到队列完成。 不需要“cronjobs”或类似的东西,只要队列中有数据,它就会将其发送到爬虫。 这意味着爬虫始终保持100%的运行时间,24/7。

  2. 该应用程序已设置为自动扩展,这意味着当队列中有太多域时,它将设置第二个、第三个、第四个等实例/爬虫以加速处理。 我认为这对于任何想要设置爬虫的人来说都是非常重要的。

  3. 所有图像都保存在S3实例上。 这意味着图像未保存在爬虫服务器上,可以轻松地获取和处理。

结果非常好。 当我运行cronjobs每15分钟的PHP爬虫时,我每小时可以爬取约600个网址。 现在,我可以毫不费力地每小时爬取10,000多个网址,甚至更多,这取决于我如何设置自动扩展。


在#1中,您表示您的爬虫侦听SQS并在队列中爬行域。您的应用程序如何决定何时添加需要爬行的新域或重新添加域? - Kevin
嗨,凯文。 在我的情况下,我想爬取一个特定的域名,所以我每周只加载他们的网站地图一次,然后将大约70,000个页面添加到队列中。如果这对你的情况不起作用,你可以让你的爬虫也找到它正在爬行的每个页面上的所有链接,并将其添加到队列中(如果之前没有被爬过)。您还可以检查每个链接,以查看它是否是外向链接或内部链接。 - Marcus Lind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接