如何平衡网络爬行的负载



假设以下方案 - 我有1000个不同的IP地址和50个URL(网页(。我需要牢记某些约束的这些网页 -

  1. 每个URL必须通过500个不同的IP地址访问。(即每个URL的500次访问(
  2. IP地址只能访问一次URL一次。例如:1.1.1.1不能多次使用http://example.com
  3. 在整个爬行中,IPS之间的负载应尽可能平衡。1.1.1.1不应爬行100次,而其他一些IP仅进行了4-5次爬网,因为这不是平衡

我目前正在记录MySQL表中的每个爬网条目。因此,如果1.1.1.1访问了http://example.comhttp://test.com,则表中将有2个条目

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

我的负载策略是 - 在每次爬网之前,找到到目前为止完成的最少爬网的IP并使用该IP

但是,我觉得这不是很优化,因为我必须执行分组查询以获取计数,然后每次爬行,然后每次对它们进行排序。

哪些更好的处理方法是什么?

PS :为了加快爬行的速度,我也使用多个线程

我会考虑使用IP地址列表,然后将其提供给Itertools.cycle((。然后,您只需将每个URL提供给您从itertool.cycle((获得的下一个500个IP地址。

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

最新更新