采集一个简单的页面,我配置的分页一直不对,只能采集第一页

机智的小安 发布于 2016/07/15 09:43
阅读 370
收藏 0

以下是我配置的XML文件:

<?xml version="1.0" encoding="UTF-8"?>


<task>


<!--  timeOutSecond:抓取时请求超时时间(单位:秒)
     errorRetry:抓取失败重连次数
     errorDelayTime: 抓取失败后等待时间
 fetchPrepareDelay:抓取前延迟时间(单位:秒),防止对某个网站太频繁爬
 runThreadNum:  线程数
 charset:编码  (如果设为auto,会根据返回的页面编码标志取,如果取不到,可能会报错)
-->
<fetchConfig charset="utf-8" timeOutSecond="5" errorRetry="5" errorDelayTime="10" runThreadNum="5"  fetchPrepareDelayTime="5" >

   <userAgent>Mozilla/5.0 (compatible; webpasser;)</userAgent>
<headers>
<header name="Referer" value="http://www.nhfpc.gov.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> -->


</fetchConfig>

<!-- 抓取的域名范围 -->
<scope>
<limitHost value="www.nhfpc.gov.cn" />
</scope>

<!-- 种子 -->
<seeds>
<seed  url="http://www.nhfpc.gov.cn/zhuzhan/flfg/lists.shtml" />
</seeds>

<!-- 挖取网页链接,放入抓取队列 -->
<page>
<scope>
  <rule type="regex" value="http://www.nhfpc.gov.cn/zhuzhan/flfg/(.*).shtml" />
</scope>
<!-- 列表数据挖取 -->
    <digLink>
         <rules>
<rule type="xpath" value="//div[@class='contents']//ul//li//a[@href]" attr="href"  />
<rule type="replace" >
    <oldChars>../</oldChars>
       <newChars></newChars>
   </rule>
<rule type="combine" value="http://www.nhfpc.gov.cn/[$this]" />
 </rules>
    </digLink>
    <!-- 分页挖取 -->
 <digLink>
         <rules>
  <rule type="xpath" value="//div[@class='pagination_index_num']//a[@href]" attr="href"  />
<rule type="combine" value="http://www.nhfpc.gov.cn/zhuzhan/flfg/[$this]" />
 </rules>
    </digLink>
</page>

<!-- 解析具体的业务数据,处理后是一个map
 -->
<page name="films">

<scope>
  <rule type="regex" value="http://www.nhfpc.gov.cn/\w+/\w+/\d*/\w+.shtml" />
</scope>


<field name="title" >
<rules>
<!-- 提取某个字段数据的处理链  -->
<rule type="xpath" value="//div[@class='content_title']" exp="text()" />
<rule type="toText" >
</rule>
</rules>
</field>


<field name="subTitle" >
<rules>
<rule type="xpath" value="//div[@class='content_subtitle']//span[1]" exp="text()" />
<rule type="toText" >
</rule>
<!-- 
 <rule type="cut" >
    <pre>年代:</pre>
    <end> </end>
 </rule>
 -->
</rules>
</field>

<field name="submitdate" >
<rules>
<rule type="xpath" value="//div[@class='content_subtitle']//span[3]" exp="text()" />
</rules>
</field>
 
<field name="content" >
<rules>
<rule type="xpath" value="//div[@class='content']" exp="text()" />
<rule type="toText" >
</rule>
</rules>
</field>

<!-- 
<field name="downlist" isList="1" >
        <rules>
<rule type="xpath" value="//div[@class='ndownlist']" exp="html()"   />
 <rule type="cut" >
    <pre>GvodUrls = "</pre>
    <end>";</end>
 </rule>
 <rule type="split" >
  <param name="splitMark" value="###" />
 </rule>
</rules>
</field>
  -->
 
</page>

<!-- 抓取解析后的数据持久化 -->
<resultHandler target="handleResultMapInterface" classPath="com.hxt.webpasser.persistent.impl.DiskJsonHandleResult">
<property name="rootDir" value="d:/www.nhfpc.gov.cn/data" ></property>
<property name="charSet" value="gbk" ></property>
</resultHandler>
 
</task>


@hxt168

加载中
0
hxt168
hxt168

这个网站分页是js生成的,要用自定义处理链(项目要再git pull下)。

这个分页的处理链简单写了下:

public class CustomDemoRule implements DecideRule{


public List<Object> handle(Rule rule, List<Object> contentList, Map valueMap) {
// valueMap 默认会有 fetchUrl 和  taskName的值
String fetchUrl=String.valueOf(valueMap.get("fetchUrl"));
if(contentList!=null)
{
for(int i=0;i<contentList.size();i++)
{
// ('page_div',4, 2,'lists','shtml',80)
String con=String.valueOf(contentList.get(i));
String[] arr=con.split(",");
if(arr.length>5){
int totalPage=Integer.parseInt(arr[1]);
String listStr=StringUtil.cutNotContainStartAndEnd(arr[3],"'", "'");
String shtmlStr=StringUtil.cutNotContainStartAndEnd(arr[4],"'", "'");
String preUrl=StringUtil.cutNotContainStartAndEnd(fetchUrl,"", listStr);
List<Object> list=new ArrayList<Object>();
for(int j=1;j<=totalPage;j++){
String url=preUrl+listStr+"_"+j+"."+shtmlStr;
list.add(url);
}
return list;

}

}

}

return null;
}



}


配置:

<?xml version="1.0" encoding="UTF-8"?>


<task>


<!--  timeOutSecond:抓取时请求超时时间(单位:秒)
     errorRetry:抓取失败重连次数
     errorDelayTime: 抓取失败后等待时间
 fetchPrepareDelay:抓取前延迟时间(单位:秒),防止对某个网站太频繁爬
 runThreadNum:  线程数
 charset:编码  (如果设为auto,会根据返回的页面编码标志取,如果取不到,可能会报错)
-->
<fetchConfig charset="utf-8" timeOutSecond="5" errorRetry="5" errorDelayTime="10" runThreadNum="5"  fetchPrepareDelayTime="5" >


   <userAgent>Mozilla/5.0 (compatible; webpasser;)</userAgent>
<headers>
<header name="Referer" value="http://www.nhfpc.gov.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> -->




</fetchConfig>


<customConfig>
        <!-- 自定义rule -->
<customRules>
         <customRule name="digJumpPage" classPath="com.hxt.webpasser.regular.CustomDemoRule" />
</customRules>
</customConfig>


<!-- 抓取的域名范围 -->
<scope>
<limitHost value="www.nhfpc.gov.cn" />
</scope>


<!-- 种子 -->
<seeds>
<seed  url="http://www.nhfpc.gov.cn/zhuzhan/flfg/lists.shtml" />
</seeds>


<!-- 挖取网页链接,放入抓取队列 -->
<page>
<scope>
  <rule type="regex" value="http://www.nhfpc.gov.cn/zhuzhan/(.*)/(.*).shtml" />
</scope>
<!-- 列表数据挖取 -->
    <digLink>
         <rules>
<rule type="xpath" value="//div[@class='contents']//ul//li//a[@href]" attr="href"  />
<rule type="replace" >
    <oldChars>../</oldChars>
       <newChars></newChars>
   </rule>
<rule type="combine" value="http://www.nhfpc.gov.cn/[$this]" />
 </rules>
    </digLink>
    <!-- 分页挖取 -->
 <digLink>
         <rules>
     
                <rule type="cut" >
      <!-- 截取分页js   example: createPageHTML('page_div',4, 2,'lists','shtml',80);} -->
    <pre><![CDATA[createPageHTML(]]></pre>
    <end><![CDATA[);]]></end>
</rule>

    <!-- 自己定义的处理链 ,  分页 -->
<rule type="digJumpPage"  /> 

 
       </rules>
    </digLink>
</page>


<!-- 解析具体的业务数据,处理后是一个map
 -->
<page name="films">


<scope>
  <rule type="regex" value="http://www.nhfpc.gov.cn/\w+/\w+/\d*/\w+.shtml" />
</scope>




<field name="title" >
<rules>
<!-- 提取某个字段数据的处理链  -->
<rule type="xpath" value="//div[@class='content_title']" exp="text()" />
<rule type="toText" >
</rule>
</rules>
</field>




<field name="subTitle" >
<rules>
<rule type="xpath" value="//div[@class='content_subtitle']//span[1]" exp="text()" />
<rule type="toText" >
</rule>
<!-- 
 <rule type="cut" >
    <pre>年代:</pre>
    <end> </end>
 </rule>
 -->
</rules>
</field>


<field name="submitdate" >
<rules>
<rule type="xpath" value="//div[@class='content_subtitle']//span[3]" exp="text()" />
</rules>
</field>
 
<field name="content" > 
<rules>
<rule type="xpath" value="//div[@class='content']" exp="text()" />
<rule type="toText" >
</rule>
</rules>
</field>


<!-- 
<field name="downlist" isList="1" >
        <rules>
<rule type="xpath" value="//div[@class='ndownlist']" exp="html()"   />
 <rule type="cut" >
    <pre>GvodUrls = "</pre>
    <end>";</end>
 </rule>
 <rule type="split" >
  <param name="splitMark" value="###" />
 </rule>
</rules>
</field>
  -->
  
</page>


<!-- 抓取解析后的数据持久化 -->
<resultHandler target="handleResultMapInterface" classPath="com.hxt.webpasser.persistent.impl.DiskJsonHandleResult">
<property name="rootDir" value="d:/www.nhfpc.gov.cn/data" ></property>
<property name="charSet" value="gbk" ></property>
</resultHandler>
 
</task>




返回顶部
顶部