使用webpasser抓取某笑話網站整站內容
使用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抓取某笑話網站整站內容