Java抓取网页数据(原网页+Javascript返回数据)
轉(zhuǎn)載請(qǐng)注明出處!
原文鏈接:http://blog.csdn.net/zgyulongfei/article/details/7909006
有時(shí)候因?yàn)榉N種原因,我們須要採(cǎi)集某個(gè)站點(diǎn)的數(shù)據(jù),但因?yàn)椴煌军c(diǎn)對(duì)數(shù)據(jù)的顯示方式略有不同!
本文就用Java給大家演示怎樣抓取站點(diǎn)的數(shù)據(jù):(1)抓取原網(wǎng)頁(yè)數(shù)據(jù);(2)抓取網(wǎng)頁(yè)Javascript返回的數(shù)據(jù)。
一、抓取原網(wǎng)頁(yè)。
這個(gè)樣例我們準(zhǔn)備從http://ip.chinaz.com上抓取ip查詢的結(jié)果:
第一步:打開(kāi)這個(gè)網(wǎng)頁(yè),然后輸入IP:111.142.55.73,點(diǎn)擊查詢button,就能夠看到網(wǎng)頁(yè)顯示的結(jié)果:
第二步:查看網(wǎng)頁(yè)源代碼,我們看到源代碼中有這么一段:
從這里能夠看出,查詢的結(jié)果,是又一次請(qǐng)求一個(gè)網(wǎng)頁(yè)之后顯示的。
再看看查詢之后的網(wǎng)頁(yè)地址:
也就是說(shuō),我們僅僅要訪問(wèn)形如這種網(wǎng)址,就能夠得到ip查詢的結(jié)果,接下來(lái)看代碼:
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("查詢結(jié)果[");int endIx = buf.indexOf("上面四項(xiàng)依次顯示的是");String result = buf.substring(beginIx, endIx);System.out.println("captureHtml()的結(jié)果:\n" + result); }使用HttpURLConnection連接站點(diǎn),用bufReader保存網(wǎng)頁(yè)返回的數(shù)據(jù),然后通過(guò)自己定義的一個(gè)解析方式將結(jié)果顯示出來(lái)。
這里我僅僅是隨便的解析了一下,要解析的很準(zhǔn)確的話自己需再處理。
解析結(jié)果例如以下:
captureHtml()的結(jié)果:
查詢結(jié)果[1]: 111.142.55.73 ==>> 1871591241 ==>> 福建省漳州市 移動(dòng)</strong><br /> ?
二、抓取網(wǎng)頁(yè)JavaScript返回的結(jié)果。
有時(shí)候站點(diǎn)為了保護(hù)自己的數(shù)據(jù),并沒(méi)有把數(shù)據(jù)直接放在網(wǎng)頁(yè)源代碼中返回,而是採(cǎi)用異步的方式,用JS返回?cái)?shù)據(jù),這樣能夠避免搜索引擎等工具對(duì)站點(diǎn)數(shù)據(jù)的抓取。
首先看一下這個(gè)網(wǎng)頁(yè):
用第一種方式查看該網(wǎng)頁(yè)的源代碼,卻沒(méi)有發(fā)現(xiàn)該運(yùn)單的跟蹤信息,由于它是通過(guò)JS的方式獲取結(jié)果的。
但有時(shí)候我們非常須要獲取到JS的數(shù)據(jù),這個(gè)時(shí)候要怎么辦呢?
這個(gè)時(shí)候我們須要用到一個(gè)工具:HTTP Analyzer,這個(gè)工具能夠截獲Http的交互內(nèi)容,我們通過(guò)這個(gè)工具來(lái)達(dá)到我們的目的。
首先點(diǎn)擊Startbutton之后,它就開(kāi)始監(jiān)聽(tīng)網(wǎng)頁(yè)的交互行為了。
我們打開(kāi)網(wǎng)頁(yè):http://www.kiees.cn/sf.php ,能夠看到HTTP Analyzer列出了全部該網(wǎng)頁(yè)的請(qǐng)求數(shù)據(jù)以及結(jié)果:
為了更方便的查看JS的結(jié)果,我們先清空這些數(shù)據(jù),然后再網(wǎng)頁(yè)中輸入快遞單號(hào):107818590577,點(diǎn)擊查詢button,然后查看HTTP Analyzer的結(jié)果:
這個(gè)就是點(diǎn)擊查詢button之后,HTTP Analyzer的結(jié)果,我們繼續(xù)查看:
從上面兩幅圖中能夠看出,HTTP Analyzer能夠截獲JS返回的數(shù)據(jù),并在Response Content中顯示,同一時(shí)候能夠看到JS請(qǐng)求的網(wǎng)頁(yè)地址。
既然如此,我們僅僅要分析HTTP Analyzer的結(jié)果,然后模擬JS的行為就可獲取到數(shù)據(jù),即我們僅僅要訪問(wèn)JS請(qǐng)求的網(wǎng)頁(yè)地址來(lái)獲取數(shù)據(jù),當(dāng)然前提是這些數(shù)據(jù)是沒(méi)有經(jīng)過(guò)加密的,我們記下JS請(qǐng)求的URL:http://www.kiees.cn/sf.php?wen=107818590577&channel=&rnd=0
然后讓程序去請(qǐng)求這個(gè)網(wǎng)頁(yè)的結(jié)果就可以!
以下是代碼:
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()的結(jié)果:\n" + contentBuf.toString()); }看到了吧,抓取JS的方式和前面抓取原網(wǎng)頁(yè)的代碼一模一樣,我們僅僅只是做了一個(gè)分析JS的過(guò)程。
以下是程序運(yùn)行的結(jié)果:
captureJavascript()的結(jié)果:
<div class="results"><div id="ali-itu-wl-result" class="ali-itu-wl-result"><h2 class="logisTitle">運(yùn)單<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,準(zhǔn)備送往下一站廣州集散中心 </span></li><li><span class="time">2012-07-16 19:33:00</span><span class="info">快件在 廣州集散中心,準(zhǔn)備送往下一站佛山集散中心 </span></li><li><span class="time">2012-07-17 01:56:00</span><span class="info">快件在 佛山集散中心\t,準(zhǔn)備送往下一站佛山 </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>
這些數(shù)據(jù)就是JS返回的結(jié)果了,我們的目的達(dá)到了!
希望本文可以對(duì)須要的朋友有一點(diǎn)幫助,須要程序源代碼的,請(qǐng)點(diǎn)擊這里下載!
總結(jié)
以上是生活随笔為你收集整理的Java抓取网页数据(原网页+Javascript返回数据)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux 终端訪问 FTP 及 上传
- 下一篇: Redis集群功能概述