Java爬蟲(chóng)Jsoup+httpclient獲取動(dòng)態(tài)生成的數(shù)據(jù)
Java爬蟲(chóng)Jsoup+httpclient獲取動(dòng)態(tài)生成的數(shù)據(jù)
前面我們?cè)敿?xì)講了一下Jsoup發(fā)現(xiàn)這玩意其實(shí)也就那樣,只要是可以訪問(wèn)到的靜態(tài)資源頁(yè)面都可以直接用他來(lái)獲取你所需要的數(shù)據(jù),詳情情跳轉(zhuǎn)-Jsoup爬蟲(chóng)詳解,但是很多時(shí)候網(wǎng)站為了防止數(shù)據(jù)被惡意爬取做了很多遮掩,比如說(shuō)加密啊動(dòng)態(tài)加載啊,這無(wú)形中給我們寫(xiě)的爬蟲(chóng)程序造成了很大的困擾,那么我們?nèi)绾蝸?lái)突破這個(gè)梗獲取我們急需的數(shù)據(jù)呢,
下面我們來(lái)詳細(xì)講解一下如何獲取
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();
這時(shí)其實(shí)已經(jīng)獲取到了整個(gè)頁(yè)面的數(shù)據(jù),但是商品價(jià)格是通過(guò)回調(diào)函數(shù)獲取后再填充上去的,所以這就要求我們寫(xiě)爬蟲(chóng)的開(kāi)發(fā)者要很有耐心的去尋找價(jià)格數(shù)據(jù)的回調(diào)接口,我們直接訪問(wèn)這個(gè)接口就可以直接獲取這個(gè)價(jià)格,下面是演示:

通過(guò)這張截圖可以看到他傳過(guò)來(lái)的只是一個(gè)靜態(tài)資源頁(yè)面根本沒(méi)有價(jià)格參數(shù),那么價(jià)格怎么來(lái)的呢,繼續(xù)找發(fā)現(xiàn)這個(gè)接口:


你會(huì)發(fā)現(xiàn)在這個(gè)接口是很多參數(shù)拼接上去的,那么我們要做的就是分析是不是所有的參數(shù)都有用
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
可以試著刪除一些參數(shù)發(fā)現(xiàn)最終這個(gè)接口需要的參數(shù)其實(shí)很簡(jiǎn)單:
https://p.3.cn/prices/mgets?callback=jQuery9734926&type=1&area=1&skuIds=J_11476104681&source=item-pc
看到這里是不是很激動(dòng)了,你其實(shí)可以換一些其他的JD商品ID一樣能獲取到當(dāng)前價(jià)格和最高價(jià)格已經(jīng)那什么價(jià)格我也不清楚,我們需要做的只是寫(xiě)一個(gè)Httpclient模擬請(qǐng)求這個(gè)接口
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);
結(jié)果是這樣:
jQuery9734926([{"id":"J_11476104681","p":"880.00","m":"980.00","op":"980.00"}]);
至于后面的你直接解析下JSON字符串那么你要的數(shù)據(jù)就GET到了。
注意一下
這是對(duì)回調(diào)請(qǐng)求到的數(shù)據(jù)進(jìn)行的再請(qǐng)求獲取,這只是對(duì)前面動(dòng)態(tài)獲取商品價(jià)格的一個(gè)補(bǔ)充,這種情況是價(jià)格本身通過(guò)主鏈接沒(méi)有帶到頁(yè)面上而是加載過(guò)程中異步請(qǐng)求填充的,還有的時(shí)候是數(shù)據(jù)帶過(guò)來(lái)了但是有相關(guān)的JS進(jìn)行了相關(guān)處理我們還是獲取不到,這個(gè)時(shí)候我們就得通過(guò)其他手段來(lái)獲取這個(gè)數(shù)據(jù),后面會(huì)講解
將這些Jsoup和httpclient整合成一個(gè)爬蟲(chóng)模板完全可以完成你一些基本的爬取數(shù)據(jù)的操作,至于怎么整合就看個(gè)人喜好了。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Springboot?JPA如何使用distinct返回對(duì)象
這篇文章主要介紹了Springboot?JPA如何使用distinct返回對(duì)象,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Java動(dòng)態(tài)數(shù)組Arraylist存放自定義數(shù)據(jù)類(lèi)型方式
這篇文章主要介紹了Java動(dòng)態(tài)數(shù)組Arraylist存放自定義數(shù)據(jù)類(lèi)型方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Spring實(shí)現(xiàn)處理跨域請(qǐng)求代碼詳解
這篇文章主要介紹了Spring實(shí)現(xiàn)處理跨域請(qǐng)求代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12
利用Spring?boot+LogBack+MDC實(shí)現(xiàn)鏈路追蹤
這篇文章主要介紹了利用Spring?boot+LogBack+MDC實(shí)現(xiàn)鏈路追蹤,MDC?可以看成是一個(gè)與當(dāng)前線程綁定的哈希表,可以往其中添加鍵值對(duì),下文詳細(xì)介紹需要的小伙伴可以參考一下2022-04-04

