假设以下方案 - 我有1000个不同的IP地址和50个URL(网页(。我需要牢记某些约束的这些网页 -
- 每个URL必须通过500个不同的IP地址访问。(即每个URL的500次访问(
- IP地址只能访问一次URL一次。例如:
1.1.1.1
不能多次使用http://example.com
- 在整个爬行中,IPS之间的负载应尽可能平衡。
1.1.1.1
不应爬行100次,而其他一些IP仅进行了4-5次爬网,因为这不是平衡
我目前正在记录MySQL表中的每个爬网条目。因此,如果1.1.1.1
访问了http://example.com
和http://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。