如何實現多線程調用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使用了。