
800819103
在線客服,實時響應
qq群
在線客服,實時響應
客服電話
13318873961
爬蟲需要的IP量比較大,特別是爬去大量的數據,而且有一些網站的反爬蟲機制比較嚴格,或許需要更優質的IP,這時候可以嘗試構建代理IP池,那么如何構建代理IP池?
代理IP池的構建并不難,難得是控制IP的質量與數量。通過IP是從免費的網站上獲取,這類IP質量低,可用率低;或者通過購買代理IP,質量跟數量都可以控制,缺點就是花錢;又或者通過搭建服務器,IP穩定、質量高,問題是成本過高。
本文的代理IP池是通過爬蟲事先從多個免費網站上獲取代理IP之后,再做檢查判斷IP是否可用,可用的話就存放到MongoDB中,最后展示到前端的頁面上。
一、獲取可用Proxy
獲取代理的核心代碼是ProxyManager,它采用RxJava2來實現,主要做了以下幾件事:
1.創建ParallelFlowable,針對每一個提供免費代理IP的頁面并行地抓取。
Flowable.fromIterable(ProxyPool.proxyMap.keySet()) .parallel()
2.針對每一個頁面進行抓取,返回List
map(new Function<String, List>() { @Override public List apply(String s) throws Exception { try { return new ProxyPageCallable(s).call(); } catch (Exception e) { e.printStackTrace(); } return null; } })
3.對每一個頁面獲取的代理IP列表進行校驗,判斷是否可用
flatMap(new Function<List, Publisher>() { @Override public Publisher apply(List proxies) throws Exception { if (proxies == null) return null; List result = proxies .stream() .parallel() .filter(new Predicate() { @Override public boolean test(Proxy proxy) { HttpHost httpHost = new HttpHost(proxy.getIp(), proxy.getPort(), proxy.getType()); return HttpManager.get().checkProxy(httpHost); } }).collect(Collectors.toList()); return Flowable.fromIterable(result); } })
4.依次保存到proxyList
subscribe(new Consumer() { @Override public void accept(Proxy proxy) throws Exception { log.debug("Result Proxy = "+proxy.getType()+"://"+proxy.getIp()+":"+proxy.getPort()); proxy.setLastSuccessfulTime(new Date().getTime()); ProxyPool.proxyList.add(proxy); } });
5.附上完整的流程圖
二、定時任務
每隔幾個小時跑一次定時任務,在抓取完任務之后先刪除舊的數據,然后再把新的數據插入到MongoDB中。
三、展示到前端
整個項目使用Spring Boot搭建,運行起來之后本地訪問地址。
預覽效果如下:
在使用前,還可以再做一次檢測,只要雙擊某個代理IP即可。
檢測某個代理.jpeg
在第二次檢測時,對于已經失效的IP會被ProxyPool刪除。
如何構建代理IP池?上文介紹了爬去免費IP建IP池,其實在做爬蟲時,自己維護一個可用的代理IP池是很有必要的事情,如果是企業或者是想追求更高穩定性的IP池,即使不選用服務器構建,也可以購買代理IP構建IP池的。