1. 程式人生 > >使用webpasser抓取某笑話網站整站內容

使用webpasser抓取某笑話網站整站內容

實現 標題 失效 idt 策略 .net see jsoup 目標

使用webpasser框架抓取某一笑話網站整站內容。webpasser是一款可配置的爬蟲框架,內置頁面解析引擎,可快速配置出一個爬蟲任務。配置方式將頁面解析和數據存儲分離,如果目標網站改版,也可以快速修復。

配置說明如下(該例子完整配置見http://git.oschina.net/passer/webpasser):

1.先寫總的抓取參數:網頁編碼是gbk,請求超時時間是5秒,請求失敗重試5次,抓取失敗後等待時間10秒,設置10個線程抓取,每次抓取後不等待。這裏不設置請求頭信息、cookie,代理了。

<fetchConfig charset="gbk" timeOutSecond="5" errorRetry="5" errorDelayTime="10" runThreadNum="10"  fetchPrepareDelayTime="0" >
		    <userAgent>Mozilla/5.0 (compatible; webpasser;)</userAgent>
			<headers>
				<!-- <header name="Referer" value="http://www.jokeji.cn" /> -->
			</headers>
			<!-- HTTP Cookie -->
			<cookies>
			<!--   <cookie  name="cookie1" value="" host="" path=""/>
		           <cookie name="cookie2" value="1"  /> -->
			</cookies>	
			<!-- 代理設置: 從ip.txt中批量獲讀取ip,每次抓取隨機使用某個ip -->
			<!-- <proxies path="ip.txt"></proxies> -->
			<!-- 單個代理獲取 ,pollUrl的系統鏈接中需隨機返回一個代理ip,格式是  ip:port  
			     (當使用proxy標簽時proxies失效) 
			-->
		<!-- 	<proxy pollUrl="http://localhost:8083/proxyManage/pollProxyIp.action?task=xunbo" ></proxy>
	 -->
	</fetchConfig>

2.scope表示限制抓取的鏈接域名範圍(註意limitHost裏一定要是域名,不能在前後加http或/),seeds表示從這些seed為入口開始抓取。

	<scope>
		<limitHost value="www.jokeji.cn" />

	</scope> 
	
	<!-- 種子 -->
	<seeds>
		<seed url="http://www.jokeji.cn/" /> 
	</seeds>

3.如果網頁的鏈接格式符合scope的規則,則進入這個page的解析策略。digLink是用來從一個網頁中挖取新的鏈接。用jsoup語法指定從所有的a標簽挖取新鏈接。由於新鏈接是相對鏈接,用relativeToFullUrl處理鏈將相對鏈接轉為絕對鏈接。

技術分享圖片

	<page>
		<scope>
		   <rule type="regex" value="http://www.jokeji.cn(.*)" />
		</scope>
		<!-- 鏈接挖取 -->
	     <digLink  >
	          <rules>
					<rule type="jsoup" value="a[^href]" attr="href"  />
						 <rule type="relativeToFullUrl"  /> 
				</rules>
	     </digLink>
	     
	</page>

4.抽取詳情頁中想要的具體業務數據,經過下面解析後返回指定的map數據。

(1)獲取標題數據:通過jsoup語法(jquery選擇器)獲得title標簽中的內容;由於title內容中"_"後面的內容不需要,通過“cut”便簽(截取處理鏈)將“_”後面的內容去除。

技術分享圖片

(2)獲取文章內容的數據:通過jsoup語法(jquery選擇器)獲得id為text110的標簽裏的內容。

技術分享圖片

	<!-- 解析具體的業務數據,處理後是一個map
	  -->
	<page>
		<scope>
		   <rule type="regex" value="http://www.jokeji.cn/jokehtml/(.*).htm" />
		</scope>
		<field name="title" >
			 <!-- 提取某個字段數據的處理鏈  -->
			<rules>
	   			 	 <rule type="jsoup" value="title" exp="html()" />
	   			  <rule type="cut" >
				     <pre></pre>
				     <end>_</end>
				  </rule>
			</rules>
		</field>
		<field name="content" >	
			 <rules>	
			<rule type="jsoup" value="#text110"  />
			</rules>
		</field>
	</page>

5.解析好的數據持久化配置(存儲步驟4中的數據):target為handleResultMapInterface是固定值,表示是持久化的類,classPath是具體的實現類。com.hxt.webpasser.persistent.impl.DiskJsonHandleResult是存儲到硬盤的實現類demo,該類屬性有rootDir(保存到哪個文件夾)、charSet(存儲時的編碼),詳見該類。可自定義編寫持久化類,繼承HandleResultMapInterface接口,有些屬性用配置傳入。(建議持久化是另外一個獨立項目提供數據存儲的http接口,爬蟲請求該接口將數據push進去,這樣分離維護比較方便,例com.hxt.webpasser.persistent.impl.VideoPushServcieImpl)

	 <!-- 抓取解析後的數據持久化 -->
	  <resultHandler target="handleResultMapInterface" classPath="com.hxt.webpasser.persistent.impl.DiskJsonHandleResult">
	 			<property name="rootDir" value="downdir/path/jokeji" ></property>
	 			<property name="charSet" value="gbk" ></property>
	 </resultHandler>
	 

6.配置寫好後就可以加入任務,啟動測試了。建議可以單個測試下。

技術分享圖片

技術分享圖片

技術分享圖片

使用webpasser抓取某笑話網站整站內容