Java抓取網頁數據(原網頁+Javascript返回數據)


轉載請注明出處!

原文鏈接:http://blog.csdn.net/zgyulongfei/article/details/7909006

 

有時候由於種種原因,我們需要采集某個網站的數據,但由於不同網站對數據的顯示方式略有不同!

本文就用Java給大家演示如何抓取網站的數據:(1)抓取原網頁數據;(2)抓取網頁Javascript返回的數據。

一、抓取原網頁。

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

第一步:打開這個網頁,然后輸入IP:111.142.55.73,點擊查詢按鈕,就可以看到網頁顯示的結果:

 

 

第二步:查看網頁源碼,我們看到源碼中有這么一段:

 

從這里可以看出,查詢的結果,是重新請求一個網頁之后顯示的。

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

也就是說,我們只要訪問形如這樣的網址,就可以得到ip查詢的結果,接下來看代碼:

 

[java]  view plain  copy
 
  1. public void captureHtml(String ip) throws Exception {  
  2.     String strURL = "http://ip.chinaz.com/?IP=" + ip;  
  3.     URL url = new URL(strURL);  
  4.     HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();  
  5.     InputStreamReader input = new InputStreamReader(httpConn  
  6.             .getInputStream(), "utf-8");  
  7.     BufferedReader bufReader = new BufferedReader(input);  
  8.     String line = "";  
  9.     StringBuilder contentBuf = new StringBuilder();  
  10.     while ((line = bufReader.readLine()) != null) {  
  11.         contentBuf.append(line);  
  12.     }  
  13.     String buf = contentBuf.toString();  
  14.     int beginIx = buf.indexOf("查詢結果[");  
  15.     int endIx = buf.indexOf("上面四項依次顯示的是");  
  16.     String result = buf.substring(beginIx, endIx);  
  17.     System.out.println("captureHtml()的結果:\n" + result);  
  18. }  

使用HttpURLConnection連接網站,用bufReader保存網頁返回的數據,然后通過自定義的一個解析方式將結果顯示出來。

 

這里我只是隨便的解析了一下,要解析的非常准確的話自己需再處理。

解析結果如下:

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

 

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

有時候網站為了保護自己的數據,並沒有把數據直接放在網頁源碼中返回,而是采用異步的方式,用JS返回數據,這樣可以避免搜索引擎等工具對網站數據的抓取。

首先看一下這個網頁:

 

用第一種方式查看該網頁的源碼,卻沒有發現該運單的跟蹤信息,因為它是通過JS的方式獲取結果的。

但有時候我們很需要獲取到JS的數據,這個時候要怎么辦呢?

這個時候我們需要用到一個工具:HTTP Analyzer,這個工具可以截獲Http的交互內容,我們通過這個工具來達到我們的目的。

首先點擊Start按鈕之后,它就開始監聽網頁的交互行為了。

我們打開網頁:http://www.kiees.cn/sf.php ,可以看到HTTP Analyzer列出了所有該網頁的請求數據以及結果:

 

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

這個就是點擊查詢按鈕之后,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

然后讓程序去請求這個網頁的結果即可!

下面是代碼:

 

[java]  view plain  copy
 
  1. public void captureJavascript(String postid) throws Exception {  
  2.     String strURL = "http://www.kiees.cn/sf.php?wen=" + postid  
  3.             + "&channel=&rnd=0";  
  4.     URL url = new URL(strURL);  
  5.     HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();  
  6.     InputStreamReader input = new InputStreamReader(httpConn  
  7.             .getInputStream(), "utf-8");  
  8.     BufferedReader bufReader = new BufferedReader(input);  
  9.     String line = "";  
  10.     StringBuilder contentBuf = new StringBuilder();  
  11.     while ((line = bufReader.readLine()) != null) {  
  12.         contentBuf.append(line);  
  13.     }  
  14.     System.out.println("captureJavascript()的結果:\n" + contentBuf.toString());  
  15. }  

看到了吧,抓取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返回的結果了,我們的目的達到了!

希望本文能夠對需要的朋友有一點幫助,需要程序源碼的,請點擊這里下載!http://download.csdn.net/download/zgyulongfei/4526567


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM