web harvest 之初体验

来源:互联网 发布:淘宝拍摄产品多少钱 编辑:程序博客网 时间:2024/05/17 08:13
       现在正处于信息爆炸的时代,互联网上的信息是越来越多,所以快速省力的从网上抽取有用的信息也显得越来越重要。开源的Web-Harvest可以帮我完成类似的任务。
web-harvest简介:
    Web-Harvest 是一个用Java 写的开源的Web 数据提取工具。它提供了一种从所需的页面上提取有用数据的方法。为了达到这个目的,你可能需要用到如XSLT,XQuery,和正则表达式等操作text/xml 的相关技术。Web-Harvest 主要着眼于目前仍占大多数的基于HMLT/XML 的页面内容。另一方面,它也能通过写自己的Java 方法来轻易扩展其提取能力。
    Web-Harvest 的主要目的是加强现有数据提取技术的应用。它的目标不是创造一种新方法,而是提供一种更好地使用和组合现有方法的方式。它提供了一个处理器集用于处理数据和控制流程,每一个处理器被看作是一个函数,它拥有参数和执行后同样有结果返回。而且处理是被组合成一个管道的形式,这样使得它们可以以链式的形式来执行,此外为了更易于数据操作和重用,Web-Harvest 还提供了变量上下方用于存储已经声明的变量。

    web-harvest 启动,可以直接双击jar包运行,不过该方法不能指定web-harvest java虚拟机的大小。第二种方法,在cmd下切到web-harvest的目录下,敲入命令“java -jar -Xms400m webharvest_all_2.jar” 即可启动并设置起java虚拟机大小为400M。

下面看一段简单的例子:

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

<config>
<var-def name="StartUrl">http://icml.cc/2012/papers/</var-def>
<var-def name="page">
<html-to-xml>
<http url="${StartUrl}"/>
</html-to-xml>
</var-def>
<var-def name="content">
<xpath expression="//div[@class='paper']/h2/text()|//div[@class='paper']/p/a[contains(text(),'pdf')]/@href">
<var name="page"/>
</xpath>
</var-def>
<loop item="item" index="i">
<list>
<var name="content"/>
</list>
<body>
<var-def name="index">
<script return="temp">
<![CDATA[
j=Integer.parseInt(i.toString());
temp=j % 2;
]]>
</script>
</var-def>
<case>
<if condition="${Integer.parseInt(index.toString()) != 0}">
<empty>
<var-def name="text">
<var name="item"/>
</var-def>
</empty>
</if>
<else>
<empty>
<var-def name="link">
<var name="item"/>
</var-def>
</empty>
<file action="write" type="binary" path="Download/${text}.pdf">
<http url="${sys.fullUrl(StartUrl,link)}"/>
</file>
</else>
</case>
</body>
</loop>
</config>

这段代码是从ICML2012上抓去论文(网易博客对代码的排版显示做的差了点,凑合着看吧)。

1.定义好我们要去抓去信息的网址
2.将其从HTML格式转为XML格式
3.用xpath语句提取相应的论文名字和连接
4.在下面的loop循环里挨个取出我们要处理的变量,其中的if-else语句用来判断奇偶行号
5用http语句将论文下载下来,外面嵌套file语句将论文写到硬盘里。

写好XML配置文件后(起名字为ICML.xml),我们再来看一下如何用java代码调用它。
import java.io.IOException;
import org.webharvest.definition.ScraperConfiguration;
import org.webharvest.runtime.Scraper;
public class Test {
    public static void main(String[] args) throws IOException {
        ScraperConfiguration config = new ScraperConfiguration(”D:/ICML.xml”);
        Scraper scraper = new Scraper(config, “D:/tmp/”);
        scraper.setDebug(true);
       
        long startTime = System.currentTimeMillis();
        scraper.execute();
        System.out.println(”time elapsed: ” + (System.currentTimeMillis() - startTime));
       
    }
}
这里要记得引入web-harvest相关的包。
web-harvest相关的XML配置文件需要有一定的XML、xpath、XQuery基础。好在web-harvest也有相应的帮助文档。

这里扯点题外话,做事情能否做好心态很重要,写程序也一样。我之所以接触web-harvest是因为前一段时间申请完软件著作权之后老板看我太闲了,让我去给他写个程序专门用来查询和抓取数据挖掘相关会议录用的论文,但是当时我接这活的时候很是不情愿,导致工作效率就很慢,并且写代码的时候经常出错,看来写代码的时候也必须保持有个好心情呐~web harvest 之初体验 - 慕希颜 - 慕希颜的博客