Java抓取網頁資料(原網頁+Javascript返回資料)

來源:互聯網
上載者:User

標籤:

轉載請註明出處!

原文連結:http://blog.csdn.net/zgyulongfei/article/details/7909006


有時候因為種種原因,我們須要採集某個網站的資料,但因為不同網站對資料的顯示方式略有不同!

本文就用Java給大家示範怎樣抓取網站的資料:(1)抓取原網頁資料;(2)抓取網頁Javascript返回的資料。

一、抓取原網頁。

這個範例我們準備從http://ip.chinaz.com上抓取ip查詢的結果:

第一步:開啟這個網頁,然後輸入IP:111.142.55.73,點擊查詢button,就能夠看到網頁顯示的結果:




第二步:查看網頁原始碼,我們看到原始碼中有這麼一段:



從這裡能夠看出,查詢的結果,是又一次請求一個網頁之後顯示的。

再看看查詢之後的網頁地址:

也就是說,我們僅僅要訪問形如這種網址,就能夠得到ip查詢的結果,接下來看代碼:

public void captureHtml(String ip) throws Exception {String strURL = "http://ip.chinaz.com/?IP=" + ip;URL url = new URL(strURL);HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();InputStreamReader input = new InputStreamReader(httpConn.getInputStream(), "utf-8");BufferedReader bufReader = new BufferedReader(input);String line = "";StringBuilder contentBuf = new StringBuilder();while ((line = bufReader.readLine()) != null) {contentBuf.append(line);}String buf = contentBuf.toString();int beginIx = buf.indexOf("查詢結果[");int endIx = buf.indexOf("上面四項依次顯示的是");String result = buf.substring(beginIx, endIx);System.out.println("captureHtml()的結果:\n" + result);}
使用HttpURLConnection串連網站,用bufReader儲存網頁返回的資料,然後通過自己定義的一個解析方式將結果顯示出來。

這裡我僅僅是隨便的解析了一下,要解析的很準確的話自己需再處理。

解析結果例如以下:

captureHtml()的結果:
查詢結果[1]: 111.142.55.73 ==>> 1871591241 ==>> 福建省漳州市 移動</strong><br />  


二、抓取網頁JavaScript返回的結果。

有時候網站為了保護自己的資料,並沒有把資料直接放在網頁原始碼中返回,而是採用非同步方式,用JS返回資料,這樣能夠避免搜尋引擎等工具對網站資料的抓取。

首先看一下這個網頁:



用第一種方式查看該網頁的原始碼,卻沒有發現該運單的跟蹤資訊,由於它是通過JS的方式擷取結果的。

但有時候我們非常須要擷取到JS的資料,這個時候要怎麼辦呢?

這個時候我們須要用到一個工具:HTTP Analyzer,這個工具能夠截獲Http的互動內容,我們通過這個工具來達到我們的目的。

首先點擊Startbutton之後,它就開始監聽網頁的互動行為了。

我們開啟網頁:http://www.kiees.cn/sf.php ,能夠看到HTTP Analyzer列出了全部該網頁的請求資料以及結果:



為了更方便的查看JS的結果,我們先清空這些資料,然後再網頁中輸入快遞單號:107818590577,點擊查詢button,然後查看HTTP Analyzer的結果:


這個就是點擊查詢button之後,HTTP Analyzer的結果,我們繼續查看:




從上面兩幅圖中能夠看出,HTTP Analyzer能夠截獲JS返回的資料,並在Response Content中顯示,同一時候能夠看到JS請求的網頁地址。

既然如此,我們僅僅要分析HTTP Analyzer的結果,然後類比JS的行為就可擷取到資料,即我們僅僅要訪問JS請求的網頁地址來擷取資料,當然前提是這些資料是沒有經過加密的,我們記下JS請求的URL:http://www.kiees.cn/sf.php?wen=107818590577&channel=&rnd=0

然後讓程式去請求這個網頁的結果就可以!

以下是代碼:

public void captureJavascript(String postid) throws Exception {String strURL = "http://www.kiees.cn/sf.php?wen=" + postid+ "&channel=&rnd=0";URL url = new URL(strURL);HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();InputStreamReader input = new InputStreamReader(httpConn.getInputStream(), "utf-8");BufferedReader bufReader = new BufferedReader(input);String line = "";StringBuilder contentBuf = new StringBuilder();while ((line = bufReader.readLine()) != null) {contentBuf.append(line);}System.out.println("captureJavascript()的結果:\n" + contentBuf.toString());}
看到了吧,抓取JS的方式和前面抓取原網頁的代碼一模一樣,我們僅僅只是做了一個分析JS的過程。

以下是程式啟動並執行結果:

captureJavascript()的結果:

<div class="results"><div id="ali-itu-wl-result" class="ali-itu-wl-result"><h2 class="logisTitle">運單<span class="mail-no">【107818590577】</span>的跟蹤資訊</h2><div class="trace_result"><ul><li><span class="time">2012-07-16 15:46:00</span><span class="info">已收件 </span></li><li><span class="time">2012-07-16 16:03:00</span><span class="info">快件在 廣州\t,準備送往下一站廣州集散中心 </span></li><li><span class="time">2012-07-16 19:33:00</span><span class="info">快件在 廣州集散中心,準備送往下一站佛山集散中心 </span></li><li><span class="time">2012-07-17 01:56:00</span><span class="info">快件在 佛山集散中心\t,準備送往下一站佛山 </span></li><li><span class="time">2012-07-17 09:41:00</span><span class="info">正在派件.. </span></li><li><span class="time">2012-07-17 11:28:00</span><span class="info">派件已簽收 </span></li><li><span class="time">2012-07-17 11:28:00</span><span class="info">簽收人是:已簽收 </span></li></ul><div></div></div></div>  </div>


這些資料就是JS返回的結果了,我們的目的達到了!

希望本文可以對須要的朋友有一點協助,須要程式原始碼的,請點擊這裡下載!


Java抓取網頁資料(原網頁+Javascript返回資料)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.