无规则采集器列表算法(haipproxy多月实现代理IP池的思路与方法)

优采云 发布时间: 2021-09-27 06:03

  无规则采集器列表算法(haipproxy多月实现代理IP池的思路与方法)

  实现分布式代理IP池花了两个多月的时间。目标是为*敏*感*词*分布式爬虫提供高可用性和低延迟的代理。它是开源和免费的。在实现过程中有一些想法。这个问题的日志虽然16年了,但还是忍不住来上课,和各种大佬交流。

  Kaito的回答给了我很多启发。在haipproxy实现的初期,大部分功能都是根据他的回答一步步实现的。站在巨人的肩膀上,我也有自己的一些想法。例如,代理 IP 源。除了百度和谷歌,另外两个非常重要的来源是类似项目的引用和代理IP站点的好友链接。它们也是一个非常重要的来源。haipproxy统计了墙内外的代理IP来源,累计30+。

  当IP源较多时,如何将其实现为编码?如果设计不好,那么只有代理IP的捕获就要写很多代码,变成了手工任务。haipproxy实现代理IP捕获的思路是:抽象出网站页面结构相似的共性,然后写规则复用代码。因为很多网站还是采用表格布局的形式,代码复用会很容易。然后对于动态爬取的网站,使用scrapy-splash进行渲染,然后将共性抽象出来,复用代码。

  代理爬取代码完成后,由于IP源网站会定时更新代理,所以我们需要定时爬取。定时任务也有一定的特殊性。一般不同网站的IP源的更新间隔是不同的,所以最好的办法是保持定时任务和对应网站的更新间隔一致。好处是:(1)不会错过每次更新的代理源(2)不会因为频繁访问而对其正常运行造成太大压力网站(3)当服务器资源有限时)到时候不会有大量的任务堆积。

  通过以上过程,我们已经能够在30分钟内采集获取上千个代理IP。但是我们都知道免费代理IP的可用性很低。如何在资源高度不可用的情况下获得一个质量不错的代理IP,本身就是一件非常具有挑战性和有趣的事情。haipproxy 的方法类似于 Kaito 提到的方法。它会定期验证Redis中的代理IP。验证的三个维度:(1)匿名(2)稳定性(3)响应速度。匿名可以通过访问自己搭建的web认证服务器来实现。为了减少验证压力,haipproxy在解析代理网站页面时会丢弃大部分透明IP,为了保证真实IP的匿名性,检查它是否是匿名的。稳定性可以通过一定的算法来计算。由于篇幅原因,这里就不详细写了。有兴趣的可以看看这个文章。响应速度也可以通过写一个profilemiddleware中间件来获得。

  在上一步中,我们完成了一个代理IP从被捕获到入库的第一次验证。有朋友应该也知道,同一个代理IP对应不同的网站,其代理效果可能完全不同。因此,有必要为特定站点维护一个验证器。那么验证器的细节应该如何实现呢?大体思路如下:(1)如果通过代理IP返回非Timeout错误,那么十有八九是代理服务器的相关端口被关闭了,此时应该丢弃代理直接就可以了,学校不要再检查了。检查一下。如果是Timeout错误,那么就递减,再检查下一轮计时任务(2)checked网站 应该是特定站点的稳定页面。根据返回的内容判断IP是否可用。比如知乎、微博等网站,如果代理IP本来就被它屏蔽了,但是网站还是会回复200状态码。同样,我们需要记录或更新对应代理的响应速度和每次验证的最新验证时间。

  通过上一步,我们已经完成了具体的验证器。这时候我们只需要用特定的开发语言编写客户端代码就可以得到代理IP。Kaito使用squid作为二级代理的方法很有启发性和可行性,haipproxy已经实现了。但是经过深入使用,发现了几个问题:(1)squid可能成为请求瓶颈(2)squid对代理IP的具体使用没有感知和反馈,所以haipproxy是目前实现的基于Python的代理调用客户端py_cli,客户端采用了一些策略来保证代理IP的高可用和低延迟,具体方法如下:

  根据配置,从存储代理分数、代理速度、最近验证时间的队列中选择满足配置参数要求的代理,然后计算它们的交集,这样可以合理保证上述各种标准. 当通过上述选择方法选择的代理数量不足时,将放宽选择要求,将速度和最新验证时间相交,然后将成功率结合起来。如果代理数量不够,则会降低要求,并合并满足最新验证时间和成功率的集合。

  当爬虫客户端调用py_cli时,代理客户端会先调用refresh()方法。如果代理客户端实例的可用代理数量不够,则通过上一步的算法扩展IP池。如果数量足够,那么会根据代理的调度策略选择合适的IP使用。

  在代理客户端实例中调用代理池的代理IP也需要一个策略。haiproxy 目前实现了两种代理调度策略。(1)轮询策略。代理池是一个队列结构。每次使用一个IP从组长开始,如果IP请求成功,就会放在队列的末尾。如果是不成功,需要调用代理客户端的proxy_feedback()方法反馈结果,这种策略的优点是IP负载比较均衡,缺点是IP质量参差不齐,有的响应时间很快,有的响应时间很慢,而优质的免费代理IP的生命周期可能很短,所以不能充分利用。(2)贪婪策略。使用这种策略时,爬虫需要记录每次请求的响应时间,每次使用后调用`proxy_feedback。()`方法判断下一次请求是否会继续使用代理IP。如果使用代理IP的响应时间低于某个设定值,则一直使用,直到从代理池中删除。如果时间高于这个值,它会将 IP 放在队列的末尾。综上所述,策略是低质量IP轮询,始终使用高质量IP。它会将 IP 放在队列的末尾。综上所述,策略是低质量IP轮询,始终使用高质量IP。它会将 IP 放在队列的末尾。综上所述,策略是低质量IP轮询,始终使用高质量IP。

  以上就是从高可用资源中实现高可用代理IP池的思路。

  另外,为了爬虫的效率和定时器的高可用,haipproxy基于scrapy和redis实现了分布式爬虫和定时任务调度器。

  说了这么多,代理池的作用是什么?以下是3月3日以知乎为目标站点的单机爬取测试结果

  

  可以看出,在单机情况下,使用并发爬取可以达到1w/小时的请求量。

  项目和测试代码地址

  可以探索的东西很多,比如流量控制,按城市过滤(爬虫登录状态下有用),持续优化高可用策略。所以,希望志同道合的朋友一起加入,一起优化,我一个人孤单。也希望看到这个回答或者使用这个项目觉得有帮助的同学可以给star一些鼓励。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线