Java爬蟲Jsoup+httpclient獲取動態生成的數據
前面我們詳細講了一下Jsoup發現這玩意其實也就那樣,只要是可以訪問到的靜態資源頁面都可以直接用他來獲取你所需要的數據,詳情情跳轉-Jsoup爬蟲詳解,但是很多時候網站為了防止數據被惡意爬取做了很多遮掩,比如說加密啊動態加載啊,這無形中給我們寫的爬蟲程序造成了很大的困擾,那麼我們如何來突破這個梗獲取我們急需的數據呢,
下面我們來詳細講解一下如何獲取
String startPage="https://item.jd.com/11476104681.html"; Document document = Jsoup.connect(startPage).userAgent ("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36").get();
這時其實已經獲取到了整個頁面的數據,但是商品價格是通過回調函數獲取後再填充上去的,所以這就要求我們寫爬蟲的開發者要很有耐心的去尋找價格數據的回調接口,我們直接訪問這個接口就可以直接獲取這個價格,下面是演示:
通過這張截圖可以看到他傳過來的只是一個靜態資源頁面根本沒有價格參數,那麼價格怎麼來的呢,繼續找發現這個接口:
你會發現在這個接口是很多參數拼接上去的,那麼我們要做的就是分析是不是所有的參數都有用
https://p.3.cn/prices/mgets?callback=jQuery9734926&type=1&area=1&pdtk= pduid=14930020970791835891856&pdpin=jd_6738608ee8eed&pdbp=0&skuIds=J_11476104681&source=item-pc
可以試著刪除一些參數發現最終這個接口需要的參數其實很簡單:
https://p.3.cn/prices/mgets?callback=jQuery9734926&type=1&area=1&skuIds=J_11476104681&source=item-pc
看到這裡是不是很激動了,你其實可以換一些其他的JD商品ID一樣能獲取到當前價格和最高價格已經那什麼價格我也不清楚,我們需要做的只是寫一個Httpclient模擬請求這個接口
String doGet = HttpUtils.doGet("https://p.3.cn/prices/mgets?callback=jQuery9734926&type=1&area=1&skuIds=J_"+"11476104681"+"&source=item-pc", null); System.out.println(doGet);
結果是這樣:
jQuery9734926([{"id":"J_11476104681","p":"880.00","m":"980.00","op":"980.00"}]);
至於後面的你直接解析下JSON字符串那麼你要的數據就GET到了。
注意一下
這是對回調請求到的數據進行的再請求獲取,這只是對前面動態獲取商品價格的一個補充,這種情況是價格本身通過主鏈接沒有帶到頁面上而是加載過程中異步請求填充的,還有的時候是數據帶過來了但是有相關的JS進行了相關處理我們還是獲取不到,這個時候我們就得通過其他手段來獲取這個數據,後面會講解
將這些Jsoup和httpclient整合成一個爬蟲模板完全可以完成你一些基本的爬取數據的操作,至於怎麼整合就看個人喜好了。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!