最近工作上需要一些企業(yè)的詳細(xì)的數(shù)據(jù)线得,工商信息啦饶唤,基本信息啦,還有一些關(guān)系圖(投資關(guān)系贯钩、人物圖譜)之類的,然后我來負(fù)責(zé)從企查查上弄些數(shù)據(jù)。
強(qiáng)調(diào):下面只是快速實(shí)現(xiàn)數(shù)據(jù)抓取的思路角雷,沒有詳細(xì)的代碼祸穷,同時也拒絕伸手黨。
現(xiàn)實(shí)中勺三,一些工商信息網(wǎng)站會被無數(shù)的爬蟲“騷擾”雷滚,所以網(wǎng)站的反爬蟲策略也是越來越高,就拿企查查來說吗坚,基本的信息是直接可訪問的祈远,但是像人物圖譜和企業(yè)圖譜這些內(nèi)容還是需要登錄的,
特別是人物圖譜商源,非VIP會員车份,一天也只能看兩次
企查查的登錄也是做了很多限制
比如圖片驗(yàn)證碼啊,數(shù)字驗(yàn)證碼啊牡彻,還有驗(yàn)證碼異常出現(xiàn)刷新按鈕啊等等(之前在做的過程中發(fā)現(xiàn)的沒有及時截圖)
但是有了
selenium
這些都不是問題~接下來按照如下思維導(dǎo)圖做一個抓取的分析(代碼想了許久還是不貼出來了)登錄
滑塊驗(yàn)證
首先出場的是滑塊驗(yàn)證扫沼,這個可以使用Selenium中的Actions.clickAndHold()來破防,打開瀏覽器Element面板庄吼,邊滑動滑塊邊觀察Html
使用java和selenium模擬滑動滑塊
WebElement dragger = driver.findElement(By.cssSelector("#nc_1_n1z"));
Actions action = new Actions(driver);
action.clickAndHold(dragger).build().perform();
for (int i = 0; i < target; i++) {
try {
action.moveByOffset(offset, 0).perform();
} catch (Exception e) {
e.printStackTrace();
}
}
target 和 offset 的值自己去口算一下~
圖片型驗(yàn)證碼
不知為何渐行,我每次用代碼模擬滑塊的時候頁面都會彈出圖片型驗(yàn)證碼技矮,而人工滑動卻不要,這讓我很費(fèi)解殊轴。
一般像圖片型驗(yàn)證碼和數(shù)字型驗(yàn)證碼有的人可能會自己去研究算法來解決衰倦,什么機(jī)器學(xué)習(xí)啦,深度學(xué)習(xí)啦等等旁理。這里不要這么高深的樊零,統(tǒng)統(tǒng)用打碼平臺,用法和價格自行百度孽文,可以這樣理解:你通過Http的方式提交圖片和要求驻襟,平臺會返回給你相應(yīng)的結(jié)果。如數(shù)字啦芋哭、文字的坐標(biāo)啦沉衣、多個文字的坐標(biāo)等等。
仔細(xì)分析下面的截圖所對應(yīng)的的Element
我們可以看出驗(yàn)證要求在青色橫條中减牺,而目標(biāo)文字在下面的方塊中豌习,這是兩個不同的Element存谎,而打碼平臺的要求是給他一張完整的圖片,這個當(dāng)時我想都沒想肥隆,立即決定使用selenium截圖的方式將橫條和方塊分別保存下來既荚,然后通過代碼將其拼接為一張圖片,最后將一整張圖提交給打碼平臺。如下
然后平臺會返回給你一個坐標(biāo)如(x,y)栋艳,剛剛提到了方塊圖他是單獨(dú)的一個Element恰聘,所以目標(biāo)y還要減去橫條的高度即(x,y-34),這個時候你以為搞定了?NoNoNo!通過瀏覽器的定位元素吸占,可以看到
方塊所在的Elemnt 有個樣式
margin-left
晴叨,所以我們還要減去這個值,即最終的最標(biāo)為(x + 2, y - 34)為什么是2而不是10矾屯,這個是因?yàn)槲覈L試了很多次兼蕊,發(fā)現(xiàn)2才可以。问拘。遍略。好了接下來就是根據(jù)坐標(biāo)去點(diǎn)擊,要用到這個方法:
Actions action = new Actions(driver);
action.moveToElement(bodyImgEle, x + 2, y - 34).click().perform();
這里注意下骤坐,moveToElement是以element的左上角為原點(diǎn)绪杏,往右是X,往下是Y
數(shù)字驗(yàn)證碼
這樣的就很普通了蕾久,我們依然交給打碼平臺,通過使用返回的“MV9C”來通過此驗(yàn)證拌夏。
異常刷新
(這個也沒有截圖)出現(xiàn)這種情況我猜測是企查查檢測到你這邊頻繁的登錄或驗(yàn)證僧著,形式就是滑動條上出現(xiàn)了“刷新”超鏈接,這個只要定為到“刷新”Element障簿,點(diǎn)擊一下就ok盹愚,如下
WebElement err = reloadElement.findElement(By.cssSelector("#dom_id_one > div > span > a"));
err.click();
注意:登錄的過程中每一個驗(yàn)證都可能有失敗的情況,所以每個處理最好加上一個循環(huán)站故,直到驗(yàn)證通過再跳出循環(huán)進(jìn)入下一步操作
抓取數(shù)據(jù)
這里重點(diǎn)講企業(yè)詳情頁
對于企查查來說只要登錄這塊搞定了皆怕,其他數(shù)據(jù)不是問題,就是簡單的分析下每個數(shù)據(jù)的請求地址西篓,然后用selenium模擬請求就行了愈腾。
人物圖譜
URL:http://www.qichacha.com/company_opercorview?name=馬化騰&personId=p03cf330a686332cfe9cb8f36a8f3ab8&keyno=f1c5372005e04ba99175d5fd3db7b8fc
投資圖譜
URL:http://www.qichacha.com/company_relation?keyNo=f1c5372005e04ba99175d5fd3db7b8fc&name=深圳市騰訊計算機(jī)系統(tǒng)有限公司
很直觀的就能看到請求地址,然后將返回的JSON字符串處理一下岂津,就得到了你想要的數(shù)據(jù)
這里不做太多的贅述虱黄。
總結(jié)
總的來講企查查的網(wǎng)站相對于天眼查還是比較容易突破的,只要把登錄這塊完美處理好吮成,其他就是解析上的問題了橱乱。
話說企查查并沒有對訪問IP做限制處理鸳君,只是如果用一個賬號訪問次數(shù)太多之后谬俄,中間也會出現(xiàn)滑塊認(rèn)證杂曲,但是不要擔(dān)心昼钻,你可以把登錄那塊的驗(yàn)證邏輯直接搬過來即可魔种,你敢信析二?
爬蟲不是我的主要工作,我只是對數(shù)據(jù)抓取這塊比較感興趣节预,還有在工作中有些數(shù)據(jù)需要抓取叶摄,所以我也就擔(dān)當(dāng)了半個爬蟲的角色,最近自己在使用jsoup寫一個簡易爬蟲框架(參照webmagic)安拟,有興趣得可持續(xù)關(guān)注我蛤吓,如果有必要的話,我會寫一些爬蟲教程糠赦,讓小白變大白(●—●)綽綽有余
CSDN:http://blog.csdn.net/qqhjqs?viewmode=list
博客:http://vector4wang.tk/
簡書:http://www.reibang.com/u/223a1314e818
Github:https://github.com/vector4wang