當你有幸搜索到這篇博客的時候,相比你已經是以為資深的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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

