?? 所謂人之初性本善擦囊,爬蟲誕生之初也是善良的,但是隨著時(shí)代發(fā)展亩码,尤其大數(shù)據(jù)|機(jī)器學(xué)習(xí)等興起之后,爬蟲也像慢慢長(zhǎng)大的人一樣野瘦,有了 善意與惡意 之分(說(shuō)明:爬蟲技術(shù)無(wú)分善惡描沟,這里指技術(shù)利用,最好遵循reboot君子協(xié)議鞭光,至少不要把人家爬癱吧)吏廉。
1、善意爬蟲
??善意爬蟲最常見的莫過(guò)于各個(gè)大的搜索引擎廠家惰许,他們釋放數(shù)以億計(jì)的爬蟲每天孜孜不倦的穿梭于各個(gè)服務(wù)之間席覆,收錄我們的網(wǎng)站服務(wù)信息,以供用戶檢索查詢(雖然搜索出來(lái)大多數(shù)都是廣告)汹买,作為網(wǎng)站服務(wù)的運(yùn)營(yíng)商佩伤,每天都大開方便之門歡迎他們來(lái)爬,雖偶爾會(huì)造成服務(wù)器壓力卦睹,可以通過(guò)君子協(xié)議約束(如reboot文件)畦戒,這種爬蟲就可定義為善意的。
2结序、惡意爬蟲
??惡意的爬蟲就不那么友好了障斋,有的是小惡、有的是萬(wàn)惡徐鹤;常見的小惡:每年的畢業(yè)設(shè)計(jì)來(lái)臨之季垃环,有些做數(shù)據(jù)分析相關(guān)畢設(shè)的同學(xué),為了收集數(shù)據(jù)返敬,釋放了N多個(gè)小爬蟲在網(wǎng)上亂竄遂庄。最重要的是:同學(xué)收集好了數(shù)據(jù),記得關(guān)一下呀劲赠,交了畢設(shè)涛目,爬蟲也被拋到九宵云外秸谢,這些無(wú)人認(rèn)領(lǐng)的小爬蟲也就成了僵尸爬蟲,這種往往是小惡霹肝。
??常見的大惡:有沒有想過(guò)為啥搶不到火車票估蹄、為啥搶不到專家號(hào),因?yàn)槟愕氖植豢赡芸爝^(guò)爬蟲沫换;還有一些所謂大數(shù)據(jù)創(chuàng)業(yè)公司臭蚁,他們的大數(shù)據(jù)從哪來(lái)?爬蟲讯赏;這些收集來(lái)的數(shù)據(jù)其中就有很多敏感的個(gè)人信息數(shù)據(jù)垮兑,比如某些提供征信服務(wù)的小公司,比如某簡(jiǎn)歷大數(shù)據(jù)公司被“一鍋端”(網(wǎng)上可查)漱挎;這些涉及個(gè)人敏感數(shù)據(jù)非法收集的都是大惡了系枪,還有那些把別人服務(wù)器爬癱的等等。
3识樱、懲惡揚(yáng)善
??理清楚了善惡嗤无,就要懲惡揚(yáng)善了;在發(fā)賞善罰惡令之前怜庸,要先識(shí)別善惡当犯,辨惡通常的手法是:1、IP頻次識(shí)別 2割疾、UA判斷 3嚎卫、Referer判斷 4、參數(shù)hash驗(yàn)證 等手段宏榕,這里不是今天的重點(diǎn)(以后詳談識(shí)別防護(hù))拓诸。重點(diǎn)揚(yáng)善,就是如何識(shí)別善意爬蟲麻昼,要不花那么多錢做SEO不是打水漂了奠支。
4、JAVA識(shí)別善意爬蟲
??技術(shù)手段很簡(jiǎn)單抚芦,就是通過(guò)IP域名反查來(lái)實(shí)現(xiàn),window下通過(guò)nslookup倍谜、linux下通過(guò)host來(lái)反查,不扯淡叉抡,直接上代碼(DEMO)尔崔。
public class nslookup {
public static void main(String args[]) {
System.out.println(spiderBGMU("111.206.221.6"));
System.out.println(spider360("180.153.232.12"));
}
// 百度匹配 http://help.baidu.com/question?prod_id=99&class=476&id=2996
/*
* baidu.com baidu.jp 111.206.221.6 百度
* googlebot 66.249.67.254 谷歌
* msnbot-103-25-156-254.search.msn.com 103.25.156.254 必應(yīng)
* unknown-68-180-228-x.yahoo.com 68.180.228.254 雅虎
*/
private static boolean spiderBGMU(String ip) {
String command = "host"; // 默認(rèn)linux
Properties props = System.getProperties();
String osName = props.getProperty("os.name");
if (osName != null && osName.toLowerCase().contains("win")) {
command = "nslookup";
}
try {
Process p = Runtime.getRuntime().exec(command + " " + ip); // host
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String inline;
StringBuffer sb = new StringBuffer("");
while ((inline = br.readLine()) != null) {
sb.append(inline).append(" ");
}
br.close();
System.out.println("baidu>>>" + sb);
return sb.indexOf("baidu.com") > 0 || sb.indexOf("baidu.jp") > 0 || sb.indexOf("googlebot") > 0
|| sb.indexOf("msnbot") > 0 || sb.indexOf("yahoo.com") > 0;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
// 360匹配 http://www.so.com/help/spider_ip.html
// 這里實(shí)現(xiàn)非精確匹配,如果需要精確褥民,可以下載全量列表
private static boolean spider360(String ip) {
String item = " 180.153.232.*,180.153.234.*,180.153.236.*,180.163.220.*,42.236.101.*,42.236.102.*,42.236.103.*,42.236.10.*,42.236.12.*,42.236.13.*,42.236.14.*,42.236.15.*,42.236.16.*, 42.236.17.*,42.236.46.*,42.236.48.*, 42.236.49.*,42.236.50.*, 42.236.51.*,42.236.52.*,42.236.53.*,42.236.54.*,42.236.55.*,42.236.99.*";
System.out.println("360>>>" + objIP);
if (item.contains(objIP)) {
return true;
}
return false;
}
}