如何實現(xiàn)多線程調(diào)用API獲取IP
最近有朋友問:你家的API一定要有提取間隔嗎,不可以無限制的調(diào)用嗎?客服答:您好,為了保證IP池的穩(wěn)定,不可以無限制的調(diào)用API呢。
用戶朋友又說:這不科學(xué)呀,我的爬蟲要多線程使用IP發(fā)送請求的,不然效率太低了。客服答:您可以在本地搭建一個IP池,通過API獲取IP,存入本地IP池,通過本地API可以多線程獲取IP的。
用戶朋友:怎么搭建本地IP池啊,不太會啊??头哼@個其實和你們爬取網(wǎng)上的免費(fèi)代理IP的原理是差不多的,我給個思路,寫代碼對您這樣的爬蟲高手來說應(yīng)該不是問題。
基本框圖如下:本地代理IP池可以由四部分組成:分別是ProxyGetter、DB、Schedule、ProxyApi。
一、ProxyGetter: 代理獲取接口,這個可以在官網(wǎng)后臺生成,比如短效優(yōu)質(zhì)代理的最低套餐是單提5個IP,每調(diào)用一次API就會返回5個最新代理IP,將其放入DB。
二、DB用于存放代理IP,目前支持SSDB和Redis(推薦SSDB)。至于為什么選擇SSDB,個人覺得SSDB是個不錯的Redis替代方案,安裝起來也很簡單。
三、Schedule計劃任務(wù),定時去檢測DB中的代理可用性,刪除不可用的代理。同時也會主動通過ProxyGetter去獲取最新代理放入DB。
四、ProxyApi代理池的外部接口,由Flask實現(xiàn),功能是給爬蟲提供與代理池交互的接口。基本框架就是這樣了,接下來就是編寫代碼了,這里簡單的介紹下代碼模塊,具體的代碼就要您自己去編寫了。
A、Apiapi接口相關(guān)代碼,目前api是由Flask實現(xiàn),代碼也非常簡單??蛻舳苏埱髠鹘oFlask,F(xiàn)lask調(diào)用‘ProxyManager’中的實現(xiàn),包括‘get/delete/refresh/get_all’;
B、DB數(shù)據(jù)庫相關(guān)代碼,目前數(shù)據(jù)庫是支持SSDB/Redis。代碼用工廠模式實現(xiàn),方便日后擴(kuò)展其他類型數(shù)據(jù)庫;
C、Manager ‘get/delete/refresh/get_all’等接口的具體實現(xiàn)類,目前代理池只負(fù)責(zé)管理proxy,日后可能會有更多功能,比如代理和爬蟲的綁定,代理和賬號的綁定等等;
D、Schedule 定時任務(wù)相關(guān)代碼,現(xiàn)在只是實現(xiàn)定時去刷新代理,并驗證可用代理,采用多進(jìn)程方式?;厩闆r就是這樣了,有了框架思路,相信寫代碼也不是什么難事。
本地IP池搭建好了,就可以多線程無限制的調(diào)用本地API獲取IP使用了。