【转】WebHavrest使用分享

需要使用爬虫这个东西,所以我研究了一下子这个东西。
WebHarvest是个挺强大的爬虫,主要不是在Java代码那块使用,而是需要写脚本。
现在对WebHarvest这个配置的语法也不是很熟,只是写写使用经验。

外话:虽然我很烦写脚本,不过用着用着,我也觉得脚本的好处,发现脚本粘合性用在项目中也是很不错的。

可以到www.webharvest.org网上下载jar包。
其中还有一个方便调试的脚步本的工具: 


 
下载这个文件,可以双击,也可以使用java -jar 命令打开。
软件如下:



也可以使用代码执行脚本:
 

Java代码 复制代码
  1. //输入配置文件名   
  2. String scriptFile = "c:/mumu/tmp/webharvest/test2.xml";   
  3. //输入内容的存放文件夹路径   
  4.         String outDirectory = "c:/mumu/tmp/webharvest";   
  5.         ScraperConfiguration config = new ScraperConfiguration(scriptFile);    
  6.         Scraper scraper = new Scraper(config, outDirectory);    
  7.         scraper.setDebug(true);    
  8.            
  9.         long startTime = System.currentTimeMillis();    
  10.         scraper.execute();    
  11.         System.out.println("time elapsed: " + (System.currentTimeMillis() - startTime));   

//输入配置文件名
String scriptFile = "c:/mumu/tmp/webharvest/test2.xml";
//输入内容的存放文件夹路径
		String outDirectory = "c:/mumu/tmp/webharvest";
        ScraperConfiguration config = new ScraperConfiguration(scriptFile); 
        Scraper scraper = new Scraper(config, outDirectory); 
        scraper.setDebug(true); 
        
        long startTime = System.currentTimeMillis(); 
        scraper.execute(); 
        System.out.println("time elapsed: " + (System.currentTimeMillis() - startTime)); 



现在开始编写配置文件:
 

Java代码 复制代码
  1. <?xml version="1.0" encoding="utf-8"?>   
  2.   
  3. <config charset="utf-8">   
  4.   <var-def name="start">   
  5.       <html-to-xml>   
  6.         <http url="http://www.tianya.cn/bbs/index.shtml" charset="utf-8" />   
  7.       </html-to-xml>   
  8.   </var-def>   
  9.   <var-def name="ulList">   
  10.       <xpath expression="//div[@class='bankuai_list']">   
  11.         <var name="start" />   
  12.       </xpath>   
  13.   </var-def>   
  14.   <file action="write" path="tianya/siteboards.xml" charset="utf-8">   
  15.   <![CDATA[ <site> ]]>   
  16.   <loop item="item" index="i">   
  17.       <list><var name="ulList"/></list>   
  18.       <body>   
  19.           <xquery>   
  20.               <xq-param name="item">   
  21.               <var name="item"/>   
  22.               </xq-param>   
  23.               <xq-expression><![CDATA[   
  24.                   declare variable $item as node() external;    
  25.                     <board boardname="{normalize-space(data($item//h3/text()))}" boardurl="">   
  26.                   {   
  27.                   for $row in $item//li return   
  28.                   <board boardname="{normalize-space(data($row//a/text()))}" boardurl="{normalize-space(data($row/a/@href))}" />   
  29.                   }   
  30.                   </board>   
  31.               ]]></xq-expression>   
  32.           </xquery>   
  33.       </body>   
  34.   </loop>   
  35.   <![CDATA[ </site> ]]>   
  36.   </file>   
  37. </config>  

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

<config charset="utf-8">
  <var-def name="start">
	  <html-to-xml>
	  	<http url="http://www.tianya.cn/bbs/index.shtml" charset="utf-8" />
	  </html-to-xml>
  </var-def>
  <var-def name="ulList">
	  <xpath expression="//div[@class='bankuai_list']">
	  	<var name="start" />
	  </xpath>
  </var-def>
  <file action="write" path="tianya/siteboards.xml" charset="utf-8">
  <![CDATA[ <site> ]]>
  <loop item="item" index="i">
	  <list><var name="ulList"/></list>
	  <body>
		  <xquery>
			  <xq-param name="item">
			  <var name="item"/>
			  </xq-param>
			  <xq-expression><![CDATA[
				  declare variable $item as node() external; 
					<board boardname="{normalize-space(data($item//h3/text()))}" boardurl="">
				  {
				  for $row in $item//li return
				  <board boardname="{normalize-space(data($row//a/text()))}" boardurl="{normalize-space(data($row/a/@href))}" />
				  }
				  </board>
			  ]]></xq-expression>
		  </xquery>
	  </body>
  </loop>
  <![CDATA[ </site> ]]>
  </file>
</config>



输出结果我就不打印出来了,这个脚本例子是网上的。

先简单地说一个这个配置文件的写法
<var-def name="a">abc</var-def>
这里定义了一个a 变量标签的内容就是a的值。
现在a的值就是abc。

然而如果我现在需要爬baidu的页面,就需要先将http://www.baidu.com这个页面给下载下来先。
可以使用标签
<http url="www.baidu.com"  charset="utf-8" />
这个标签将代码返回下载下来所有的页面代码,此时需要有一个变量去存起来,可以使用
 

Java代码 复制代码
  1. <var-def name="baiduall">   
  2.   <http url="www.baidu.com"  charset="utf-8" />   
  3. </var-def>  

<var-def name="baiduall">
  <http url="www.baidu.com"  charset="utf-8" />
</var-def>


需要抓内容的必须将html转成xml,这样可以方便以DOM 的方式去定位信息内容。
现在可以使<html to xml标签.

 

Java代码 复制代码
  1. <var-def name="baiduall">   
  2.   <http url="www.baidu.com"  charset="utf-8" />   
  3. </var-def>   
  4. <var-def name="baiduxml">   
  5.    <html-to-xml>   
  6.      <var name="baiduall" />   
  7.    </html-to-xml>   
  8. </var-def>  

<var-def name="baiduall">
  <http url="www.baidu.com"  charset="utf-8" />
</var-def>
<var-def name="baiduxml">
   <html-to-xml>
     <var name="baiduall" />
   </html-to-xml>
</var-def>



上边的代码先使用<var标签去引用这baiduall变量。再使用<html-to-xml>标签处理
然后用baiduxml变量存放转成xml后的内容。
这里只是为了演示这个功能,其实可以简化成如下代码:

 

Java代码 复制代码
  1. <var-def name="baiduxml">   
  2.    <html-to-xml>   
  3.      <http url="www.baidu.com"  charset="utf-8" />   
  4.    </html-to-xml>   
  5. </var-def>  

<var-def name="baiduxml">
   <html-to-xml>
     <http url="www.baidu.com"  charset="utf-8" />
   </html-to-xml>
</var-def>


这代码与上边代码意义相同。

先在这里介绍最简单的用法,时间关系,我会日后与大家分享更多的功能方式讨论。
以后再讨论:
包括使用XPath定位与用js处理代码,<file标签输出到文件中,或是将数据在转到java对象中。

  • 大小: 3.2 KB

除了使用上述方法外,还可以使用将不页的数据输出到不同的结构化好的XML文件里面,

然后再进行读取的方法:

    配置文件:

   

Xml代码 复制代码
  1. <var-def name="targetUrl">http://www.51zyr.com/tpl/index/hotel_list_web.do</var-def>    
  2.          
  3.       <var name="page_num"/>    
  4.          
  5.        <file action="write" path="hotel_page${page_num}.xml">       
  6.              
  7.          <template>  
  8.              <![CDATA[ <root> ]]>  
  9.          </template>        
  10.                  
  11.        <loop item="item" index="i">  
  12.          <list>  
  13.             <xpath expression="//table[@background='../images/dotline.gif'][1]/tbody/tr">  
  14.                <html-to-xml>  
  15.                   <http url="${targetUrl}?pages=${page_num}"/> //这里根据从JAVA文件传过来的参数进行不同页面的查询抓取   
  16.                </html-to-xml>  
  17.            </xpath>             
  18.          </list>  
  19.          <body>         
  20.               <xquery>  
  21.                    <xq-param name="item">  
  22.                        <var name="item"/>  
  23.                    </xq-param>  
  24.                    <xq-expression><![CDATA[  
  25.                        declare variable $item as node() external;  
  26.                          
  27.                        let $num := data($item//td[1])  
  28.                        let $name := data($item//td[2])  
  29.                        let $star := data($item//td[3])  
  30.                        let $address := data($item//td[4])  
  31.                        let $telephone := data($item//td[5])  
  32.                            return  
  33.                                <hotel>  
  34.                                    <num>{data($num)}</num>  
  35.                                    <name>{data($name)}</name>  
  36.                                    <star>{data($star)}</star>  
  37.                                    <address>{data($address)}</address>  
  38.                                    <telephone>{data($telephone)}</telephone>  
  39.                                </hotel>  
  40.                    ]]></xq-expression>  
  41.                </xquery>  
  42.                  
  43.          </body>  
  44.        </loop>  
  45.         <![CDATA[ </root> ]]>  
  46.             </file>  

       

   接着是JAVA文件里面的关键代码:

   

Java代码 复制代码
  1. public void QueryPath(int num)    
  2.     {   
  3.            try{   
  4.             ScraperConfiguration config = new ScraperConfiguration("traveldata/config/hotel.xml");   
  5.             Scraper scraper = new Scraper(config, "traveldata/output/hotel");   
  6.                
  7.             scraper.addVariableToContext("page_num"new String(""+num));    
  8.                
  9.             scraper.setDebug(true);   
  10.             long starttime = System.currentTimeMillis();   
  11.             scraper.execute();   
  12.             long endtime = System.currentTimeMillis();   
  13.             System.out.println("Spent time:"+(endtime - starttime));         
  14.                
  15.             saveHotel(num);   
  16.                
  17.            }   
  18.            catch(Exception e)   
  19.            {   
  20.                e.printStackTrace();   
  21.            }   
  22.     }   
  23.   
  24.   public void getContent(int pageNum)  //循环调用   
  25.     {   
  26.         for(int i=1;i<=pageNum;i++)   
  27.         {   
  28.             QueryPath(i);   
  29.         }   
  30.     }  

出自http://www.javaeye.com/topic/570216

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值