当前位置: 首页 > 工具软件 > Web-Harvest > 使用案例 >

[Web-Harvest数据采集之一]WebHarvest基础-配置文件分析

鲜于阳成
2023-12-01


 Web-Harvest 是一个用Java 写的开源的Web 数据抓取工具。在使用Web-Harvest 中可能需要用到如XPath,XQuery,和正则表达式等操作text/xml 的相关技术。Web-Harvest 主要着眼于目前仍占大多数的基于HMLT/XML 的页面内容。另一方面,它也能通过写自己的Java 方法来轻易扩展其提取能力。

Web-Harvest 官方网站(http://web-harvest.sourceforge.net/)已经介绍了其配置文件中的标签的用法。下面我们来分析配置文件的结构和各个模块的含义

 

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

<config charset="UTF-8">
	<var-def name="start">
		<html-to-xml>
  			<http url="http://www.360buy.com/allSort.aspx" charset="gbk" /> 
  		</html-to-xml>
  	</var-def>
</config>

Web-Harvest数据抓取开始于<config>根元素,定义一个处理器,数据采集的规则定义在<config></config>里面。上面代码是定义Web-Harvest要进行数据采集的网页。Web-Harvest会自动下载页面对应的源码,按照定义的规则进行数据采集。

<var-def name="alist">
       <xpath expression="//div[@class='m']">
          <var name="start"/>
       </xpath>
</var-def>

研究这段代码之前,就要好好研究一下我们要抓取的网页的源代码了。这里<xpath>标签定义的是我们要抓取的开始的元素节点。在使用Web-Harvest的时候XPath的使用是非常重要的,整个配置文件中大部分会是XPath表达式。//div[@class='m']意思是说源码中所有div标签的属性class属性值等于m的div标签,//div代表所有的div标签。但是这段代码执行的基础是我们上面定义的URL,即<var name="start"/>含义。可以看出我们上面定义的<var-def>的name属性值是start。<var name="start"/>把上面定义的内容引入进来。这也给我们一个启示:定义过的内容直接引用过来就可以了,不需要重新定义。

Web-Harvest技巧

  定义过的内容直接引用过来就可以了,不需要重新定义。

以上这些只是些基础的准备工作下面就是我们定义的抓取规则和抓取的到的数据及文件保存的路径了。

<file action="write"  path="360buyCategory.xml" charset="gbk"></file>

<file>标签:读写指定文件名的文件。这里我们定义的action="write"就是写,文件名为360buyCategory.xml编码方式是GBK。

<loop item="item" index="i">
               <list><var name="alist"/></list> 
</loop>


<loop>标签:通过迭代list 里面的每一项然后传到body 里面去执行,返回结果为body 执行后得到的一个列表。<var name="alist"/>这里我们同样引用了前面定义的alist。

 

<body>
                <xquery>
                  <xq-param name="item">
                     <var name="item"/>
                  </xq-param>
                  <xq-expression>
                   <![CDATA[
                        declare variable $item as node() external;
                        let $c1 :=data($item//div[@class='mt'][1]/h2/a/text())
                        for $i in $item//div[@class='mc'][1]//dl
                        let $c2 := data($i/dt[child::text()])
                        for $ii in  $i/dd/em
                        let $c3 := data($ii/a/text())
                        let $u := data($ii/a/@href)
                        return
                        <c>
                             <c1>{data($c1)}</c1>
                             <c2>{normalize-space(data($c2))}</c2>
                             <c3>{data($c3)}</c3>
                             <u>{data($u)}</u>
                        </c>
                    ]]>
                  </xq-expression>
                </xquery>
</body>

<body>标签里面就是我们定义的规则了,以及对于XQuery、XPath的应用需要一定的要求,可以单独去学习。

XPath教程:http://www.w3cschool.cn/index-14.html

XQuery教程:http://www.w3cschool.cn/index-15.html

[Web-Harvest数据采集之一]WebHarvest基础-配置文件分析源码

 

 类似资料: