使用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.配置写好后就可以加入任务,启动测试了。建议可以单个测试下。

 

posted on 2018-08-17 21:49  hxt8  阅读(560)  评论(0编辑  收藏  举报