當你有幸搜索到這篇博客的時候,相比你已經是以為資深的java程序大師。因此我下面所說的內容你都會能看懂,因此簡單的東西就不再敘述,如果有不懂的地方,可以加入數據挖掘群咨詢(群號:224739996)。
首先我們的項目有MyEclipse8.6創建的maven項目,名稱crawlerDemo,如下:
通過指定的URL抓取網頁內容
所謂網頁抓取,就是把URL地址中指定的網絡資源從網絡流中讀取出來,保存到本地。類似于使用程序模擬IE瀏覽器的功能,把URL作為HTTP請求的內容發送到服務器端,然后讀取服務器端的響應資源。
Java語言是為網絡而生的編程語言,它把網絡資源看成是一種文件,它對網絡資源的訪問和對本地文件的訪問一樣方便。它把請求和響應封裝為流。因此我們可以根據相應內容,獲得響應流,之后從流中按字節讀取數據。例如,java.net.URL類可以對相應的Web服務器發出請求并且獲得響應文檔。java.net.URL類有一個默認的構造函數,使用URL地址作為參數,構造URL對象:
- URL?pageURL?=?new?URL(path);?
接著,可以通過獲得的URL對象來取得網絡流,進而像操作本地文件一樣來操作網絡資源:
- InputStream?stream?=?pageURL.openStream();?
在實際的項目中,網絡環境比較復雜,因此,只用java.net包中的API來模擬IE客戶端的工作,代碼量非常大。需要處理HTTP返回的狀態碼,設置HTTP代理,處理HTTPS協議等工作。為了便于應用程序的開發,實際開發時常常使用Apache的HTTP客戶端開源項目--HttpClient。它完全能夠處理HTTP連接中的各種問題,使用起來非常方便。只需在項目中引入HttpClient.jar包,就可以模擬IE來獲取網頁內容。例如:
package crawlerDemo; import java.io.IOException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.methods.GetMethod; /** *通過指定的URL抓取網頁內容DEMO *數據挖掘群號:224739996 */ public class httpClientDemo { public static void main( String[] args ) { //創建一個客戶端,類似于打開一個瀏覽器 HttpClient httpclient=new HttpClient(); //創建一個get方法,類似于在瀏覽器地址欄中輸入一個地址 GetMethod getMethod=new GetMethod("http://zhengyunfei.iteye.com/blog/2190701");
//回車,獲得響應狀態碼 try { int statusCode=httpclient.executeMethod(getMethod); System.out.println("statusCode="+statusCode); //查看命中情況,可以獲得的東西還有很多,比如head、cookies等 System.out.println("response=" + getMethod.getResponseBodyAsString()); } catch (HttpException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ //釋放 getMethod.releaseConnection(); } } } 運行上面demo,結果如下:
statusCode=200 2015-3-9 16:05:22 org.apache.commons.httpclient.HttpMethodBase getResponseBody 警告: Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended. response=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <script type="text/javascript"> function getCookie(c_name) { // Local function for getting a cookie value if (document.cookie.length > 0) { c_start = document.cookie.indexOf(c_name + "="); if (c_start!=-1) { c_start=c_start + c_name.length + 1; c_end=document.cookie.indexOf(";", c_start); if (c_end==-1) c_end = document.cookie.length; return unescape(document.cookie.substring(c_start,c_end)); } } return ""; } function setCookie(c_name, value, expiredays) { // Local function for setting a value of a cookie var exdate = new Date(); exdate.setDate(exdate.getDate()+expiredays); document.cookie = c_name + "=" + escape(value) + ((expiredays==null) ? "" : ";expires=" + exdate.toGMTString()) + ";path=/"; } function getHostUri() { var loc = document.location; return loc.toString(); } setCookie('YPF8827340282Jdskjhfiw_928937459182JAX666', '220.231.3.154', 10); try { location.reload(true); } catch (err1) { try { location.reload(); } catch (err2) { location.href = getHostUri(); } } </script> </head> <body> <noscript>This site requires JavaScript and Cookies to be enabled. Please change your browser settings or upgrade your browser.</noscript> </body> </html>
?
上面的示例代碼是使用HttpClient進行請求與響應的例子。HttpClient httpclient=new HttpClient()表示創建一個客戶端,相當于打開瀏覽器。GetMethod getMethod=new GetMethod("http://www.blablabla.com");使用get方式對http://www.blablabla.com進行請求。int statusCode=httpclient.executeMethod(getMethod); 執行請求,獲取響應狀態。 getMethod.getResponseBodyAsString()方法能夠以字符串方式獲取返回的內容。這也是網頁抓取所需要的內容。在這個示例中,只是簡單地把返回的內容打印出來,而在實際項目中,通常需要把返回的內容寫入本地文件并保存。最后還要關閉網絡連接,以免造成資源消耗。
?
? 這個例子是用get方式來訪問Web資源。通常,get請求方式把需要傳遞給服務器的參數作為URL的一部分傳遞給服務器。但是,HTTP協議本身對URL字符串長度有所限制。因此不能傳遞過多的參數給服務器。為了避免這種問題,通常情況下,采用post方法進行HTTP請求,HttpClient包對post方法也有很好的支持。例如:
?
package crawlerDemo; import java.io.IOException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; /** *通過指定的URL抓取網頁內容DEMO *數據挖掘群號:224739996 */ public class HttpClientPostDemo { public static void main( String[] args ) { //創建一個客戶端,類似于打開一個瀏覽器 HttpClient httpclient=new HttpClient(); //創建一個post方法,類似于在瀏覽器地址欄中輸入一個地址 PostMethod postMethod=new PostMethod("http://www.pestreet.cn/query/article/1/searchResult.html"); //回車,獲得響應狀態碼 try { //使用數組來傳遞參數 NameValuePair[] postData = new NameValuePair[1]; //設置參數 postData[0] = new NameValuePair("searchKey", "2015"); postMethod.addParameters(postData); int statusCode=httpclient.executeMethod(postMethod); System.out.println("statusCode="+statusCode); //查看命中情況,可以獲得的東西還有很多,比如head、cookies等 System.out.println("response=" + postMethod.getResponseBodyAsString()); } catch (HttpException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ //釋放 postMethod.releaseConnection(); } } }
運行結果如下:
statusCode=200 2015-3-9 16:48:18 org.apache.commons.httpclient.HttpMethodBase getResponseBody 警告: Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended. response=<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>搜索結果-財富街</title> <meta property="wb:webmaster" content="d9cb9a0148c6ce38" /> <link href="/style/Config.css" rel="stylesheet" /> <link href="/style/Default.css" rel="stylesheet" /> <link href="/scripts/component/select/select.css" rel="stylesheet" /> <script src="/scripts/lib/jquery.min.js" type="text/javascript"></script> <script src="/scripts/lib/jquery.validate.min.js" type="text/javascript"></script> <script src="/scripts/component/fts.js" type="text/javascript"></script> <script src="/scripts/other/Config.js" type="text/javascript"></script> <script src="/scripts/other/Menu.js" type="text/javascript"></script> <script src="/scripts/other/Default.js" type="text/javascript"></script> <script src="/scripts/other/DAds.js" type="text/javascript"></script> <script src="/scripts/other/RightMenu.js" type="text/javascript"></script> <script src="/scripts/component/pagination.js" type="text/javascript"></script> <!--[if lt IE 9]><script src="/scripts/other/html5.js" language="javascript" type="text/javascript"></script><![endif]--> <!--[if lt IE 7]> <script src="/scripts/other/DD_belatedPNG_0.0.8a.js" language="javascript" type="text/javascript"></script> <script> DD_belatedPNG.fix('*'); </script> <![endif]--> <link href="/style/List.css" rel="stylesheet" /> </head> <body> <!-- Top start --> <script src="/scripts/component/select/select.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function () { var datas = [{field : '私募股權', value : 'smgq', selected : true}, {field : '二級市場', value : 'ejsc'}, {field : '文章', value : 'article'}]; $('#searchSelect').select({datas : datas, btn : $('#fs_select_button'), hidden : $('#fs_select_type'), defaultValue : 'article'}); $('#searchKey').keydown(function(e) { var e = e || event, keycode = e.which || e.keyCode; if(keycode == 13) { searchSubmit(); } }); }); function searchSubmit() { var type = $('#fs_select_type').val(); var searchKey = $('#searchKey').val(); var url = '/query/' + type + '/1/searchResult.html?searchKey=' + encodeURI(encodeURI(searchKey)); window.location.href = url; return false; } </script> <div class="header"> <header> <h1><img src="/images/logo/Logo.jpg" alt="財富街" /></h1> <div class="TopSearch"> <div id="searchSelect" class="searchSelect"> <img src="/images/sbtn.png" id="fs_select_button" class="fs_select_button"/> <input type="hidden" id="fs_select_type" name="searchType" value=""/> </div> <input id="searchKey" name="searchKey" type="text" placeholder="Search" value="2015"> <button type="button" id="searchSubmit" style="cursor:pointer" onclick="searchSubmit();"></button> </div> <h6><img src="/images/tel/TopTel.jpg" alt="熱線電話:4006547828" /></h6> <div class="ClearBoth"></div> </header> <nav> <ul> <li><a href="/index.html">首頁</a></li> <li id="Menu_1"><a href="javascript:void(0)">我要投資</a> <div id="SmallMenu_1" class="SmallMenu"> <dl> <dd><a href="/smgq/1/56.html">私募股權</a></dd> <dd><a href="/sqtz/1/58.html">申請投資</a></dd> </dl> </div> </li> <li id="Menu_2"><a href="javascript:void(0)">我要募資</a> <div id="SmallMenu_2" class="SmallMenu"> <dl> <dd><a href="/sqmz/1/61.html">申請募資</a></dd> </dl> </div> </li> <li id="Menu_3"><a href="javascript:void(0)">動態與資訊</a> <div id="SmallMenu_3" class="SmallMenu"> <dl> <dd><a href="/wzwslt/1/63.html">最新資訊</a></dd> <dd><a href="/wzwslt/1/64.html">行業風云</a></dd> <dd><a href="/wzwslt/1/65.html">政策動態</a></dd> <dd><a href="/wzslt/1/66.html">研究報告</a></dd> <dd><a href="/wzslt/1/67.html">專業排名</a></dd> </dl> </div> </li> <li id="Menu_4"><a href="javascript:void(0)">樂資會</a> <div id="SmallMenu_4" class="SmallMenu"> <dl> <dd><a href="/jshyhd/1/70.html">樂資會簡介</a></dd> <dd><a href="/jshyhd/1/71.html">會員權益</a></dd> <dd><a href="/hyhd/1/72.html">會員活動</a></dd> <dd><a href="/downlb/1/73.html">會員下載專區</a></dd> </dl> </div> </li> <li id="Menu_5"><a href="javascript:void(0)">財富街課堂</a> <div id="SmallMenu_5" class="SmallMenu"> <dl> <dd><a href="/wzwslt/1/108.html">私募股權課堂</a></dd> <dd><a href="/wzwslt/1/153.html">二級市場課堂</a></dd> <dd><a href="/wzwslt/1/154.html">更多知識</a></dd> </dl> </div> </li> <li id="Menu_6"><a href="javascript:void(0)">關于我們</a> <div id="SmallMenu_6" class="SmallMenu"> <dl> <dd><a href="/statement/1/75.html">清科集團簡介</a></dd> <dd><a href="/statement/1/76.html">財富街簡介</a></dd> <dd><a href="/statement/1/77.html">聯系我們</a></dd> <dd><a href="/statement/1/176.html">法律聲明</a></dd> </dl> </div> </li> </ul> <div class="Login"><a href="/user/userLogin.html">登錄</a>|<a href="/user/userRegister.html" class="Reg">注冊</a></div> <div class="ClearBoth"></div> </nav> </div> <!-- Top End --> <!-- Main Start --> <div class="location">我要投資 > 搜索結果</div> <section> <div class="detail"> <div class="NewsList NewsListBox" style="background-color:#ffffff;"> <h4>搜索結果:43個</h4> <ul style="padding-top : 10px;"> <li> <h6><a href="/query/article/2015000000043994.html" target="_blank">投資聚焦Focus》總第96期:2015年私募基金七大政策爆點猜想</a></h6> <span>2015-03-09</span> <p>從2014年走來,私募基金已成為資本市場一股重要力量,年初監管層大力推行備案制,在政策的規范下,隨著牛市的來臨,私募基金規模快速發展。</p> </li> <li> <h6><a href="/query/article/2015000000043983.html" target="_blank">新三板2015投資攻略</a></h6> <span>2015-03-06</span> <p>2015年,隨著市場對競價交易制度和分層管理的呼聲漸高,新三板將受到越來越多的投資者關注。從近期官方密集表態來看,新三板競價交易有望于2015年中推出。214年8月做市商制度出臺后,曾大幅提升新三板公司估值。因此市場普遍預期,競價交易推出后將進一步提升新三板估值。</p> </li> <li> <h6><a href="/query/article/2015000000043980.html" target="_blank">清科快評:總理報告首提“互聯網+”,2015互聯網金融迎風口機遇</a></h6> <span>2015-03-06</span> <p>監管層已經充分意識到現有的政策法規并不完全適用于互聯網金融,為使得其獲得一個健康完善的發展環境,2015年政府將創新金融監管,防范和化解金融風險。大力發展普惠金融,讓所有市場主體都能享受到金融服務。</p> </li> <li> <h6><a href="/query/article/2015000000043969.html" target="_blank">清科觀察:《2015天使投資白皮書》出爐,國家支持"眾創空間"將再燃投資熱情</a></h6> <span>2015-03-06</span> <p>2014年全國科技企業孵化器數量超過1600家,國家級孵化器達約600家,非國家級超過1000家,在孵企業8萬余家,累計孵化企業約6萬家。除了推動孵化器的建設以外,“眾創空間”概念還包括了各類創客空間以及交流平臺的搭建。</p> </li> <li> <h6><a href="/query/article/2015000000043968.html" target="_blank"> 2015年值得關注的10家硬件創業公司</a></h6> <span>2015-03-05</span> <p>過去幾年軟件初創公司更容易博得人們的關注,如各種各樣的社交應用、手機游戲等。隨著眾籌平臺越來越熱門,更多硬件初創公司也開始發力。以下的10家公司或許有望憑借優秀的產品在2015年成為業界關注的焦點。</p> </li> <li> <h6><a href="/query/article/2015000000043961.html" target="_blank">2015年兩會股市猜想(附歷年兩會股市行情)</a></h6> <span>2015-03-05</span> <p>一年一度的全國兩會即將拉開帷幕,每年的兩會都是投資者關注的重點,將釋放怎樣的全年經濟發展脈絡,哪些概念、板塊將成為熱點,兩會期間又是否會有一波特色的“兩會行情”?</p> </li> <li> <h6><a href="/query/article/2015000000043959.html" target="_blank">2015全球超級富豪排名發布 中國新入榜人數超美國</a></h6> <span>2015-03-05</span> <p>2015年福布斯全球億萬富豪榜近日正式發布,入榜名單上,都是世界范圍內個人或家族凈資產超過10億美元的超級富豪。據統計數據顯示,今年新增入榜人數為290人,其中71人來自中國,57位來自美國。</p> </li> </ul> <!-- 分頁請求處理 --> <input type="hidden" name="pageNo" value="1"/> <input type="hidden" name="pageSize" value="7"/> <div class="PageBox">當前:1/7 <span>1</span> <a href="javascript:void(0);" onclick="turnOverPage(2);">2</a> … <a href="javascript:void(0);" onclick="turnOverPage(6);">6</a> <a href="javascript:void(0);" onclick="turnOverPage(7);">7</a> 共:43 條 </div> <script language="javascript"> function turnOverPage(no){ var url = '/query/article/(no)/searchResult.html?searchKey=2015'; if(url.indexOf('func:') == 0) { var fName = url.replace('func:', ''); window[fName](no); } else { var lh = url.replace(/\(no\)/, no); window.location.href = encodeURI(encodeURI(lh)); } } </script> </div> </div> <aside> <div class="Right_Service"> <h6>“太好了,我有興趣”</h6> <p class="Con">撥打400電話或網頁對話投資顧問,獲得1對1專家服務</p> <p class="Btn Border"><img src="/images/button/Right_ZxBtn2.jpg" style="cursor:pointer;" onclick="notic();" alt="投資顧問聯系" /> <img src="/images/button/Right_TelBtn2.jpg" alt="撥打400電話" /></p> <p class="Box">加入樂資會微信微博<br />搶注第一手投資機會</p> <p><img src="/images/Right_ewm2.jpg" alt="二維碼" /></p> </div> <script type="text/javascript"> function notic() { $.ajax({ url : fts.baseURI + '/notic/send', type : 'POST', timeout : '1000', async : false, dataType : 'json', success : function(responseText) { var result = responseText.result; var isRelation = responseText.relation; var message = responseText.message; if(result) { if(isRelation) { if(confirm("投資顧問已經聯系過您,是否需要再次取得投資顧問聯系?")) { updateStatus(); } } else { alert(message); } } else { window.location.href = "/user/userLogin.html" } } }); } function updateStatus() { $.ajax({ url : fts.baseURI + '/notic/updateStatus', type : 'POST', timeout : '1000', async : false, dataType : 'json', success : function(response) { var r = response.result; var m = response.message; if(r) { alert(m); } } }); } </script> </aside> <div class="ClearTab"></div> </section> <!-- Main End --> <!-- footer Start --> <div class="footer"> <div class="EndMenu"> <dl> <dt><a href="javascript:void(0);" style="color:#f2f2f2; font-weight:700;">我要投資</a></dt> <dd><a href="/smgq/1/56.html" style="color:#f2f2f2;">私募股權</a></dd> <dd><a href="/sqtz/1/58.html" style="color:#f2f2f2;">申請投資</a></dd> </dl> <dl> <dt><a href="javascript:void(0);" style="color:#f2f2f2; font-weight:700;">我要募資</a></dt> <dd><a href="/sqmz/1/61.html" style="color:#f2f2f2;">申請募資</a></dd> </dl> <dl> <dt><a href="javascript:void(0);" style="color:#f2f2f2; font-weight:700;">動態與資訊</a></dt> <dd><a href="/wzwslt/1/63.html" style="color:#f2f2f2;">最新資訊</a></dd> <dd><a href="/wzwslt/1/64.html" style="color:#f2f2f2;">行業風云</a></dd> <dd><a href="/wzwslt/1/65.html" style="color:#f2f2f2;">政策動態</a></dd> <dd><a href="/wzslt/1/66.html" style="color:#f2f2f2;">研究報告</a></dd> <dd><a href="/wzslt/1/67.html" style="color:#f2f2f2;">專業排名</a></dd> </dl> <dl> <dt><a href="javascript:void(0);" style="color:#f2f2f2; font-weight:700;">樂資會</a></dt> <dd><a href="/jshyhd/1/70.html" style="color:#f2f2f2;">樂資會簡介</a></dd> <dd><a href="/jshyhd/1/71.html" style="color:#f2f2f2;">會員權益</a></dd> <dd><a href="/hyhd/1/72.html" style="color:#f2f2f2;">會員活動</a></dd> <dd><a href="/downlb/1/73.html" style="color:#f2f2f2;">會員下載專區</a></dd> </dl> <dl> <dt><a href="javascript:void(0);" style="color:#f2f2f2; font-weight:700;">財富街課堂</a></dt> <dd><a href="/wzwslt/1/108.html" style="color:#f2f2f2;">私募股權課堂</a></dd> <dd><a href="/wzwslt/1/153.html" style="color:#f2f2f2;">二級市場課堂</a></dd> <dd><a href="/wzwslt/1/154.html" style="color:#f2f2f2;">更多知識</a></dd> </dl> <dl> <dt><a href="javascript:void(0);" style="color:#f2f2f2; font-weight:700;">關于我們</a></dt> <dd><a href="/statement/1/75.html" style="color:#f2f2f2;">清科集團簡介</a></dd> <dd><a href="/statement/1/76.html" style="color:#f2f2f2;">財富街簡介</a></dd> <dd><a href="/statement/1/77.html" style="color:#f2f2f2;">聯系我們</a></dd> <dd><a href="/statement/1/176.html" style="color:#f2f2f2;">法律聲明</a></dd> </dl> <div class="EndContact"> <p> 北京市朝陽區霄云路26號鵬潤大廈A座12層1203室<br /> 聯系電話:+86 10 84580476<br />傳真:+86 10 84584529 </p> <ul> <li class="wb" onclick="window.open('http://weibo.com/pwmchina')" style="cursor:pointer">新浪微博</li> <li class="wx" onclick="window.open('/75/wx.html')" style="cursor:pointer">微信</li> </ul> <div class="ClearBoth"></div> </div> <div class="ClearTab"></div> </div> <footer> Copyright @ 2012 Tooks All Rights Reserved 京ICP備12000166號<br> 京公網安備11010502026892號 </footer> </div> <div style="display:none;"> <script type="text/javascript"> var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://"); document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F7f253a0a0746530f430fcca8f1933364' type='text/javascript'%3E%3C/script%3E")); </script> </div> <!-- footer End --> </body> </html>
??
上面的例子說明了如何使用post方法來訪問Web資源。與get方法不同,post方法可以使用NameValuePair來設置參數,因此可以設置"無限"多的參數。而get方法采用把參數寫在URL里面的方式,由于URL有長度限制,因此傳遞參數的長度會有限制。
?
?
?
?
??
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
