一、背景

爬虫服务请求量大,为了应对反爬措施,增加爬虫的爬取效率和代理IP使用率,需要设计一个IP代理池,满足以下需求:

  • 定时任务获取第三方代理
  • 及时剔除IP代理池中失效的IP
  • 业务隔离IP
    • 若IP未失效,但对某个业务来说,IP被封,需要针对业务,隔离此IP
  • 均衡使用IP
    • 避免IP使用频率不均问题

通常选用的地上那方外部代理有:蚂蚁代理、阿布云、讯代理(不建议使用)。这里以讯代理为例。

说说讯代理

实际环境测试过,代理质量差,价格不低,客服态度不好。笔者以公司的名义提需求,价钱好商量,对方直截了当回复,没这功能,也做不了,爱买不买,呵呵。所以真心不建议使用

1.1 调用代理API

调用混拨代理API,返回结果

{
"ERRORCODE":"0",
"RESULT":[
{"port":"43617","ip":"222.85.5.118"},
{"port":"43569","ip":"180.122.20.108"},
{"port":"20443","ip":"221.230.254.73"}
]}

二、一些知识点

2.1 代理IP是如何产生的?

ASDL拨号,是一种上网方式,每拨一次号,就会产生一个新的IP。而第三方的IP厂商,通常会买很多拨号VPS服务器,定时拨号来产生新的IP,提供给需要代理的客户。

三、需求1:及时剔除IP代理池中失效的IP

3.1 超过有效时间,自动失效

每个IP都有固定的有效时间(拨号时间)。IP失效的原理,IP通过ASDL拨号产生,当ASDL重新拨号,则旧IP失效,新IP产生。如3分钟拨一次号,或3-10分钟拨一次号,为了保证IP的使用率,通常以最长的失效时间(如有效期3-10分钟,选10分钟作为失效时间)。

使用Redis存储Key-Value,失效时间为最长有效时间。Key为IP+端口。Value为任意固定值。

3.2 检测失效

检测时间点

  • 获取到IP时,放入代理池之前
  • 在代理池中

通常IP的真正有效时间不是固定的,比如说的有效时间是3分钟,真实有效时间可能低于3分钟。这里就需要有一个机制来单独检测IP是否有效。

通常的做法是,IP池中的每一个IP都要定时访问一个固定的测试链接,访问失效则从队列中剔除。

如何选择固定的链接,有下列几种要求:

  • 测试链接的网站要尽可能地稳定
  • 返回的内容要尽可能的小
  • 网站最好不要有反爬措施

测试链接

测试链接的一个比较好的方案是,自己提供一个CDN链接,链接指向一个只有200字符串的txt文本。

最好提供两个CDN链接,同时请求,只要有一个能请求通,就判断为IP有效。防止一处CDN挂掉,导致所有代理IP被判定为失效。

3.3 伪代码

获取代理时


请求API,解析获取代理列表:
每个代理:
if(isEffectiveIp(ip)){
addIpPool(ip);
}

IP代理池中检查


获取当前代理池中所有IP:
if(!isEffectiveIp(ip)){
removeIp(ip);
}

四、需求2:业务隔离IP

4.1 IP隔离判定

错误记录队列

这里IP调用服务就需要做成一个单独的服务,其他业务服务都调用该IP服务。每次调用的时候需要上报IP,IP可用或不可用,同时附带业务名(如business-1)。

IP服务端维持一个队列记录,记录业务与IP的错误次数,Key为业务名-IP,Value为错误次数,设置一个标准值,若连续错误N次,则将此IP放到失效队列。

失效队列

失效队列中,使用set存储,name为业务名称,value为失效IP

调用IP服务

业务每次调用IP,首先获取失效队列中的IP列表,然后请求时附带IP列表作为参数,请求不包含失效IP的任意IP。

五、需求3:均衡使用IP

使用zset维持,使用时间戳作为score,zset会以score从小到大排列。

当一个IP被使用,则设置score为当前时间戳,则IP会排到队尾。

每次获取IP时,都从队头的前N个IP中,选择一个。

【解决方案】IP代理池设计与解决方案的更多相关文章

  1. 记一次企业级爬虫系统升级改造(六):基于Redis实现免费的IP代理池

    前言: 首先表示抱歉,春节后一直较忙,未及时更新该系列文章. 近期,由于监控的站源越来越多,就偶有站源做了反爬机制,造成我们的SupportYun系统小爬虫服务时常被封IP,不能进行数据采集. 这时候 ...

  2. ip代理池的爬虫编写、验证和维护

    打算法比赛有点累,比赛之余写点小项目来提升一下工程能力.顺便陶冶一下情操 本来是想买一个服务器写个博客或者是弄个什么FQ的东西 最后刷知乎看到有一个很有意思的项目,就是维护一个「高可用低延迟的高匿IP ...

  3. Scrapy加Redis加IP代理池实现音乐爬虫

    音乐爬虫 关注公众号"轻松学编程"了解更多. 目的:爬取歌名,歌手,歌词,歌曲url. 一.创建爬虫项目 创建一个文件夹,进入文件夹,打开cmd窗口,输入: scrapy star ...

  4. 开源IP代理池续——整体重构

    开源IP代理池 继上一篇开源项目IPProxys的使用之后,大家在github,我的公众号和博客上提出了很多建议.经过两周时间的努力,基本完成了开源IP代理池IPProxyPool的重构任务,业余时间 ...

  5. 爬取西刺ip代理池

    好久没更新博客啦~,今天来更新一篇利用爬虫爬取西刺的代理池的小代码 先说下需求,我们都是用python写一段小代码去爬取自己所需要的信息,这是可取的,但是,有一些网站呢,对我们的网络爬虫做了一些限制, ...

  6. scrapy_随机ip代理池

    什么是ip代理? 我们电脑访问网站,其实是访问远程的服务器,通过ip地址识别是那个机器访问了服务器,服务器就知道数据该返回给哪台机器,我们生活中所用的网络是局域网,ip是运营商随机分配的,是一种直接访 ...

  7. Python爬虫之ip代理池

    可能在学习爬虫的时候,遇到很多的反爬的手段,封ip 就是其中之一. 对于封IP的网站.需要很多的代理IP,去买代理IP,对于初学者觉得没有必要,每个卖代理IP的网站有的提供了免费IP,可是又很少,写了 ...

  8. 5 使用ip代理池爬取糗事百科

    从09年读本科开始学计算机以来,一直在迷茫中度过,很想学些东西,做些事情,却往往陷进一些技术细节而蹉跎时光.直到最近几个月,才明白程序员的意义并不是要搞清楚所有代码细节,而是要有更宏高的方向,要有更专 ...

  9. python开源IP代理池--IPProxys

    今天博客开始继续更新,谢谢大家对我的关注和支持.这几天一直是在写一个ip代理池的开源项目.通过前几篇的博客,我们可以了解到突破反爬虫机制的一个重要举措就是代理ip.拥有庞大稳定的ip代理,在爬虫工作中 ...

随机推荐

  1. Python Web 程序使用 uWSGI 部署

    Python Web 程序使用 uWSGI 部署 WSGI是什么? WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway ...

  2. conda升级TensorFlow

    1.打开Anaconda prompt,查看tensorflow各个版本 anaconda search -t conda tensorflow 2.选择自己系统的版本:运行以下命令 anaconda ...

  3. 织梦dede:channelartlist调用排除指定typeid栏目

    在使用 dede:channelartlist 自动调用栏目内容时,经常会遇到某些栏目不需要调用,比如“关于我们”.“联系地址”等无持续更新的栏目.要想在 dede:channelartlist 调用 ...

  4. javascript之ECMAScript:语法的操作标准

    一.如何书写一个javascript代码 javascript代码需要写在javascript标签中才会生效,而javascript标签可以写在任何地方,但考虑到规范化及页面的加载问题,最好是写在bo ...

  5. vue + jenkins 自动部署到指定的目录

    1. 首先选择自由风的构建方式 2. 我的源码在gitlab上,在源码管理下,提供仓库URL和凭证,以及gitlab的分支 3. 在构建环境下选择提供Node &npm bin/folder ...

  6. python高级特性-sorted()

    1.数字排序 >>> sorted([1,-12,13,-4],key=abs) [1, -4, -12, 13] 2.字符串排序 按ASCII排序 默认情况下,对字符串排序,是按照 ...

  7. 【线上监控】日志上报bug处理方式总结

    说明:若直接在网站看觉得字体太小,可以下载下来后放大看会更加清晰.不会失真. 目前总结到此,后期有改动,再次补充与总结

  8. java中使用redis --- Set集合的简单应用

    1.java代码 public class RedisTest01 { public static void main(String[] args){ // connect redis server ...

  9. vs2017 c# 控制台 输出中文显示问号 ; vs2017 c# 控制台 输出中文显示乱码

    问题: 解决: 在main方法最前面加一句就OK了! Console.OutputEncoding = Encoding.GetEncoding("gbk"); 或者 Consol ...

  10. cpu 或 内存 偏高的分析套路

    参考资料: https://mp.weixin.qq.com/s/fb9YxJr-yDdYQ86RE47y1w 1)通过针对此软件专业的分析工具或命令,找到占用cpu高的函数,2)通过调用栈(或源码搜 ...