如何实现多线程调用API获取IP
最近有朋友问:你家的API一定要有提取间隔吗,不可以无限制的调用吗?客服答:您好,为了保证IP池的稳定,不可以无限制的调用API呢。
用户朋友又说:这不科学呀,我的爬虫要多线程使用IP发送请求的,不然效率太低了。客服答:您可以在本地搭建一个IP池,通过API获取IP,存入本地IP池,通过本地API可以多线程获取IP的。
用户朋友:怎么搭建本地IP池啊,不太会啊。客服:这个其实和你们爬取网上的免费代理IP的原理是差不多的,我给个思路,写代码对您这样的爬虫高手来说应该不是问题。
基本框图如下:本地代理IP池可以由四部分组成:分别是ProxyGetter、DB、Schedule、ProxyApi。
一、ProxyGetter: 代理获取接口,这个可以在官网后台生成,比如短效优质代理的最低套餐是单提5个IP,每调用一次API就会返回5个最新代理IP,将其放入DB。
二、DB用于存放代理IP,目前支持SSDB和Redis(推荐SSDB)。至于为什么选择SSDB,个人觉得SSDB是个不错的Redis替代方案,安装起来也很简单。
三、Schedule计划任务,定时去检测DB中的代理可用性,删除不可用的代理。同时也会主动通过ProxyGetter去获取最新代理放入DB。
四、ProxyApi代理池的外部接口,由Flask实现,功能是给爬虫提供与代理池交互的接口。基本框架就是这样了,接下来就是编写代码了,这里简单的介绍下代码模块,具体的代码就要您自己去编写了。
A、Apiapi接口相关代码,目前api是由Flask实现,代码也非常简单。客户端请求传给Flask,Flask调用‘ProxyManager’中的实现,包括‘get/delete/refresh/get_all’;
B、DB数据库相关代码,目前数据库是支持SSDB/Redis。代码用工厂模式实现,方便日后扩展其他类型数据库;
C、Manager ‘get/delete/refresh/get_all’等接口的具体实现类,目前代理池只负责管理proxy,日后可能会有更多功能,比如代理和爬虫的绑定,代理和账号的绑定等等;
D、Schedule 定时任务相关代码,现在只是实现定时去刷新代理,并验证可用代理,采用多进程方式。基本情况就是这样了,有了框架思路,相信写代码也不是什么难事。
本地IP池搭建好了,就可以多线程无限制的调用本地API获取IP使用了。