一蠢护、簡(jiǎn)介
爬蟲的目標(biāo)網(wǎng)站一般都會(huì)針對(duì)爬蟲做一些防御措施堤结,其中最常見的手段之一就是過濾掉操作頻率過高的IP。比如一些內(nèi)容社區(qū)肉拓,文章閱讀量的計(jì)算方式與IP相關(guān)聯(lián)后频,一個(gè)IP閱讀一篇文章后閱讀量增加了1,接下來半個(gè)小時(shí)內(nèi)去點(diǎn)擊閱讀量都不會(huì)再增加的。假如你有一萬個(gè)IP卑惜,不斷切換IP去訪問膏执,這時(shí)候的閱讀量是會(huì)持續(xù)增加,不受半小時(shí)的時(shí)間間隔限制的露久。但是這一萬個(gè)IP去哪里找呢更米?本文介紹的IP池-Strawboat就能提供這一萬個(gè)IP。
Github地址:https://github.com/autumn-projects/strawboat
二毫痕、使用方式
1征峦、Jar包引入
- maven構(gòu)建工具可按以下方式引入
<dependency>
<groupId>com.oscroll</groupId>
<artifactId>strawboat</artifactId>
<version>1.0.1</version>
</dependency>
- 其他構(gòu)建工具或者直接下載Jar包-maven中央倉(cāng)庫(kù)
2、快速使用
// 創(chuàng)建默認(rèn)的IP池
ScheduledPool pool = new ScheduledPool();
// 在線程中啟動(dòng)IP池
new Thread(pool::execute).start();
// 從IP池中取出IP
new Thread(() -> {
for (; ; ) {
IP ip = pool.take();
// do something..
}
}).start();
其中ScheduledPool是阻塞隊(duì)列的一個(gè)裝飾類镇草,也就是說pool.take()方法在執(zhí)行時(shí)眶痰,如果pool中沒有IP,會(huì)一直阻塞梯啤。
三竖伯、進(jìn)階用法
1、實(shí)現(xiàn)原理
Strawboat主要聲明了Provider
與Filter
兩個(gè)接口因宇。Provider
接口用于提供IP七婴,Filter
接口用于過濾IP,對(duì)于這兩個(gè)接口察滑,項(xiàng)目中都有默認(rèn)的實(shí)現(xiàn)方式打厘。然后通過一個(gè)確定的規(guī)則將Provider
與Filter
結(jié)合起來。
Provider接口
Provider
中提供了一個(gè)getIPList()方法贺辰,每次調(diào)用返回一組IP户盯。
Strawboat默認(rèn)提供了以下網(wǎng)站的免費(fèi)代理IP:
- 西刺代理
- 快代理
- 云代理
- 89免費(fèi)代理
Filter接口
Provider
中提供了一個(gè)filter()方法,來驗(yàn)證當(dāng)前IP是否可用饲化。默認(rèn)通過代理IP訪問百度的返回結(jié)果來判斷該IP是否有效莽鸭。
IP池實(shí)現(xiàn)
IP池默認(rèn)使用以上Provider
與Filter
的具體實(shí)現(xiàn),循環(huán)獲取每個(gè)網(wǎng)站的IP并對(duì)其進(jìn)行過濾吃靠,如果IP有效則加入隊(duì)列硫眨。
2、拓展與自定義
在ScheduledPool
初始化時(shí)可以指定選用的Provider
與Filter
巢块。
public ScheduledPool(List<Provider> providerList, List<Filter> filterList) {
this.providerList = providerList;
this.filterList = filterList;
}
用戶可以選用已有的Provider
礁阁,或者實(shí)現(xiàn)Provider
接口,將自定義的IP獲取方式放入IP池中族奢,同理Filter
的實(shí)現(xiàn)方式也是如此姥闭。
四、結(jié)束語
當(dāng)前版本為Strawboat的第一個(gè)版本(strawboat-1.0.1)越走,包含了IP池應(yīng)有的功能泣栈,用戶也能根據(jù)自己的需求進(jìn)行拓展。只是功能上還比較單一弥姻,這一點(diǎn)在以后的版本中會(huì)進(jìn)行拓展南片。