說在前頭
有段時間沒更新了,期間發(fā)生了很多事瞻坝,這里就不一一贅述,有一個要說一下杏瞻, 之前我放在github上的springbootquick代碼結(jié)構(gòu)我重新整理了一下所刀,因為我覺得branch的方式去完善每個小功能不太直觀,索性找個時間全都整理在了一起捞挥,方便大家觀看
項目地址為https://github.com/vector4wang/spring-boot-quick 里面有些是我工作中用到的浮创,有些是我在平時玩玩積累的,如果對你有幫助砌函,點個星斩披,fork一下溜族,我會感激不盡,如果有問題垦沉,請及時溝通我煌抒,我會在第一時間改正,我的原則是“交流乡话、互助摧玫、提升”~
今天就我之前寫的一個小蟲子說一下代碼里的隨機應變耳奕,以下觀點均數(shù)個人看法绑青,如有雷同純屬巧合,如果你對我的看法有意見歡迎拍磚屋群,如果覺得我的理解有點意思闸婴,那有勞,點個贊分享一下芍躏,我定感激不盡邪乍,好的,言歸正傳对竣!
起因
世充日踧月迫庇楞,力盡計窮,懸首面縛否纬,翹足可待吕晌。建德遠來助虐,糧運阻絕临燃,此是天喪之時睛驳。請固武牢,屯軍氾水膜廊,隨機應變乏沸,則易為克殄 ---舊唐書·郭孝恪傳(指隨著情況的變化靈活機動地應付)
之前寫的領英爬蟲目標數(shù)據(jù)比較隨意,即抓取一段時間之后爪瓜,后面得到的數(shù)據(jù)都是老外的蹬跃,這不是我想要的,于是上級給了一個辦法铆铆, “通過百度搜索去抓”炬转,即在百度搜索某一個姓氏或常用名,通過百度返回的列表再依次去領英里去抓算灸,如圖
后來驗證這是可行的扼劈,其實這里也是一個“隨機應變”的情景,這條路走不通立馬換條路菲驴,而且是可行的荐吵。
問題到這看似沒有問題,但是用過百度的都知道,當你點擊某一結(jié)果的時候先煎,百度這邊需要做一個重定向處理贼涩,即重新指定url,例如你點擊百度鏈接
http://www.baidu.com/link?url=6pwgxIUI8VfssEgJKHAHjdHBD_55cW5E72arpGIV9lZoAxLsaqV3do9p9O01kuzb3s3FlJKImEFkFsvWkDWL8a
,經(jīng)過重定向后就變成了http://cn.linkedin.com/in/johnsonwangnz
,這一點htmlunit做的很好薯蝎,自動獲取重定向的頁面遥倦,但是在防爬蟲這一塊,領英做的很好占锯,這一點列一下我知道的限制
- ip限制 一個ip對領英產(chǎn)生大量非人類行為的請求袒哥,他會對這個ip登錄的賬號做一個人機驗證,比12306還好玩消略,大家可以試試堡称,手動偷笑~
- 請求限制 當產(chǎn)生大量請求是,它會對請求直接拒絕~
- 賬號限制 同一個ip或者ip所在的網(wǎng)段注冊多個領英賬號的時候艺演,賬號會出現(xiàn)各種繁瑣的驗證却紧,沒驗證的直接禁掉!Lコ贰晓殊!
目前我知道的就這幾條。
好伤提,因為是代碼巫俺,請求的速度非常快飘弧,一秒通過百度指向領英跳轉(zhuǎn)達到幾十個识藤,幾分鐘后代碼就報錯了,如下
這啥啊次伶,999感冒靈沖劑啊!!!查了下code碼痴昧,原來是“訪問被拒絕”,我得出的結(jié)果是領英那邊檢查出了大量的個人頁面的請求冠王,速度很快非人類所能達到赶撰,于是就禁止數(shù)據(jù)返回。
我心想這下完蛋了柱彻,這條路難道也走不通:滥取!哟楷!急的我抓耳撓腮~瘤载,然后我起身轉(zhuǎn)了一圈,喝了點水卖擅,突然靈光一閃鸣奔,“我想要的就是個人中心的鏈接啊墨技,我可以先拿到這些鏈接存起來作為種子url,然后再將以前的爬蟲改造一下挎狸,通過這些url去抓翱弁簟!”
于是锨匆,我將這些錯誤catch住崭别,通過簡單的正則來判斷是否為擁有個人中心的鏈接地址,如下:
final Pattern r = Pattern.compile("in/[\\u4e00-\\u9fa5-0-9-a-z-A-z%]*");
Matcher m = r.matcher(e.getMessage());
String seed = "";
if (m.find()) {
seed = m.group();
seed = seed.substring(3, seed.length());
}
System.out.println(seed);
結(jié)果為
沒錯恐锣,白色就是種子url窗轩,最后在直接訪問http://www.linkedin.com/in/jingshi-wang-056b6245/ 就可以獲取這個人一些職業(yè)信息啦~~~
最終的是醬紫
為什么領英爬蟲還要回寫種子DB怖亭,因為要將抓過的url打個標記抓過了成洗,整體就這么簡單印机。
現(xiàn)在種子抓了100多萬了匀奏,領英這塊抓了8萬多鞭衩,現(xiàn)在暫停了,因為帳號這塊的問題還沒有解決~~~娃善,啊哈哈哈哈
后記
代碼我放在了github上论衍,點我,其實這里并不是說代碼的這一塊的,而是如何對代碼反饋出來的結(jié)果做出靈活的應對以致快速總結(jié)出解決方案聚磺,這不就是對代碼的“隨機應變”嗎~~
歡迎大家瀏覽我的個人博客http://vector4wang.tk