Springboot與Selenium合體變蜘蛛爬企查查

爆米花機槍手發表於2018-01-09

  最近工作上需要一些企業的詳細的資料,工商資訊啦,基本資訊啦,還有一些關係圖(投資關係、人物圖譜)之類的,然後我來負責從企查查上弄些資料。

強調:下面只是快速實現資料抓取的思路,沒有詳細的程式碼,同時也拒絕伸手黨。

  現實中,一些工商資訊網站會被無數的爬蟲“騷擾”,所以網站的反爬蟲策略也是越來越高,就拿企查查來說,基本的資訊是直接可訪問的,但是像人物圖譜企業圖譜這些內容還是需要登入的,
特別是人物圖譜,非VIP會員,一天也只能看兩次
3.png
企查查的登入也是做了很多限制
比如圖片驗證碼啊,數字驗證碼啊,還有驗證碼異常出現重新整理按鈕啊等等(之前在做的過程中發現的沒有及時截圖)
5.png
但是有了selenium這些都不是問題~接下來按照如下思維導圖做一個抓取的分析(程式碼想了許久還是不貼出來了)
企查查.png

登入

滑塊驗證

首先出場的是滑塊驗證,這個可以使用Selenium中的Actions.clickAndHold()來破防,開啟瀏覽器Element皮膚,邊滑動滑塊邊觀察Html
1.gif這說明滑塊不只是單純的移動到右側,還導致其他樣式改變,這也說明你不能直接通過修改Html的方式改變滑塊的位置來驗證 ,Ps:有的網站只要滑塊在最終的位置,就認為驗證通過了。
使用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 的值自己去口算一下~

圖片型驗證碼

不知為何,我每次用程式碼模擬滑塊的時候頁面都會彈出圖片型驗證碼,而人工滑動卻不要,這讓我很費解。
  一般像圖片型驗證碼和數字型驗證碼有的人可能會自己去研究演算法來解決,什麼機器學習啦,深度學習啦等等。這裡不要這麼高深的,統統用打碼平臺,用法和價格自行百度,可以這樣理解:你通過Http的方式提交圖片和要求,平臺會返回給你相應的結果。如數字啦、文字的座標啦、多個文字的座標等等。
仔細分析下面的截圖所對應的的Element
5.png
我們可以看出驗證要求在青色橫條中,而目標文字在下面的方塊中,這是兩個不同的Element,而打碼平臺的要求是給他一張完整的圖片,這個當時我想都沒想,立即決定使用selenium截圖的方式將橫條和方塊分別儲存下來,然後通過程式碼將其拼接為一張圖片,最後將一整張圖提交給打碼平臺。如下
waitProcessImg.png
然後平臺會返回給你一個座標如(x,y),剛剛提到了方塊圖他是單獨的一個Element,所以目標y還要減去橫條的高度即(x,y-34),這個時候你以為搞定了?NoNoNo!通過瀏覽器的定位元素,可以看到
QQ截圖20180109094227.png
方塊所在的Elemnt 有個樣式margin-left,所以我們還要減去這個值,即最終的最標為(x + 2, y - 34)為什麼是2而不是10,這個是因為我嘗試了很多次,發現2才可以。。。
好了接下來就是根據座標去點選,要用到這個方法:

Actions action = new Actions(driver);
action.moveToElement(bodyImgEle, x + 2, y - 34).click().perform();

這裡注意下,moveToElement是以element的左上角為原點,往右是X,往下是Y

數字驗證碼

(沒有截圖,只有程式碼截的圖)
微信截圖_20180109223914.png
這樣的就很普通了,我們依然交給打碼平臺,通過使用返回的“MV9C”來通過此驗證。

異常重新整理

(這個也沒有截圖)出現這種情況我猜測是企查查檢測到你這邊頻繁的登入或驗證,形式就是滑動條上出現了“重新整理”超連結,這個只要定為到“重新整理”Element,點選一下就ok,如下

WebElement err = reloadElement.findElement(By.cssSelector("#dom_id_one > div > span > a"));
err.click();

注意:登入的過程中每一個驗證都可能有失敗的情況,所以每個處理最好加上一個迴圈,直到驗證通過再跳出迴圈進入下一步操作

抓取資料

這裡重點講企業詳情頁
對於企查查來說只要登入這塊搞定了,其他資料不是問題,就是簡單的分析下每個資料的請求地址,然後用selenium模擬請求就行了。

人物圖譜

微信截圖_20180109225840.png

URL:http://www.qichacha.com/company_opercorview?name=馬化騰&personId=p03cf330a686332cfe9cb8f36a8f3ab8&keyno=f1c5372005e04ba99175d5fd3db7b8fc

投資圖譜

微信截圖_20180109225933.png

URL:http://www.qichacha.com/company_relation?keyNo=f1c5372005e04ba99175d5fd3db7b8fc&name=深圳市騰訊計算機系統有限公司

很直觀的就能看到請求地址,然後將返回的JSON字串處理一下,就得到了你想要的資料
這裡不做太多的贅述。

貼個控制檯的圖
微信截圖_20180109230911.png

總結

總的來講企查查的網站相對於天眼查還是比較容易突破的,只要把登入這塊完美處理好,其他就是解析上的問題了。
話說企查查並沒有對訪問IP做限制處理,只是如果用一個賬號訪問次數太多之後,中間也會出現滑塊認證,但是不要擔心,你可以把登入那塊的驗證邏輯直接搬過來即可,你敢信?

爬蟲不是我的主要工作,我只是對資料抓取這塊比較感興趣,還有在工作中有些資料需要抓取,所以我也就擔當了半個爬蟲的角色,最近自己在使用jsoup寫一個簡易爬蟲框架(參照webmagic),有興趣得可持續關注我,如果有必要的話,我會寫一些爬蟲教程,讓小白變大白(●—●)綽綽有餘

CSDN:http://blog.csdn.net/qqhjqs?viewmode=list
部落格:http://vector4wang.tk/
簡書:https://www.jianshu.com/u/223a1314e818
Github:https://github.com/vector4wang

相關文章