如何平衡网络爬行的负载

时间:2018-02-08 15:27:33

标签: mysql algorithm web-scraping architecture web-crawler

假设以下情况 - 我有1000个不同的IP地址和50个网址(网页)。我需要在考虑某些限制的情况下抓取这些网页 -

  1. 必须通过500个不同的IP地址访问每个网址。 (即每个网址500次访问)
  2. IP地址只能访问一次网址。例如:1.1.1.1不能用于多次点击网址http://example.com
  3. 在整个爬行过程中,ips中的负载应尽可能平衡。 <{1}}不应该爬行100次而其他一些ip只进行了4-5次爬行,因为这是不平衡的
  4. 我正在记录Mysql表中的每个抓取条目。因此,如果1.1.1.1访问了1.1.1.1http://example.com,则表格中会有2个条目

    http://test.com(1.1.1.1, http://example.com)

    我的负载均衡策略是这个 - 在每次抓取之前,找到目前为止抓取次数最少的IP并使用

    然而,我觉得这不是很优化,因为我必须执行分组查询来获取计数然后在我进行爬行之前对它们进行排序。

    处理此事的更好方法是什么?

    PS :为了加快抓取速度,我也使用了多个线程

1 个答案:

答案 0 :(得分:0)

我考虑使用IP地址列表并将其提供给itertools.cycle()。然后,您只需将每个URL分配给您从itertools.cycle()获得的下500个IP地址。

多线程的一种方法是从循环中获取输出并将其从一个线程推送到阻塞队列。然后,您可以拥有其他线程,每个线程都会获取一个URL并分发到您从队列中获得的下500个IP。