文章来源:[url]http://www.blogjava.net/hankchen/archive/2009/09/22/296000.html[/url]

Web-Harvest是一个Java开源Web数据抽取工具。它能够收集指定的Web页面并从这些页面中提取有用的数据。其实现原理是,根据预先定义的配置文件用httpclient获取页面的全部内容(关于httpclient的内容,本博有些文章已介绍),然后运用XPath、XQuery、正则表达式等这些技术来实现对text/xml的内容筛选操作,选取精确的数据。前两年比较火的垂直搜索(比如:酷讯等)也是采用类似的原理实现的。Web-Harvest应用,关键就是理解和定义配置文件,其他的就是考虑怎么处理数据的Java代码。当然在爬虫开始前,也可以把Java变量填充到配置文件中,实现动态的配置。

(友情提示:本博文章欢迎转载,但请注明出处:陈新汉,http://www.blogjava.net/hankchen)

现在以爬取天涯论坛的所有版面信息为例,介绍Web-Harvest的用法,特别是其配置文件。

天涯的版块地图页面时:http://www.tianya.cn/bbs/index.shtml

[天涯的部分版面列表]

我们的目标就是要抓取全部的版块信息,包括版块之间的父子关系。

先查看版块地图的页面源代码,寻求规律:

<div class="backrgoundcolor">

<div class="bankuai_list">

<h3>社会民生</h3>

<ul>

<li><a href="http://www.tianya.cn/publicforum/articleslist/0/free.shtml" id="item天涯杂谈">天涯杂谈</a></li>

<li><a href="http://www.tianya.cn/publicforum/articleslist/0/worldlook.shtml" id="item国际观察">国际观察</a></li>

<li><a href="http://www.tianya.cn/publicforum/articleslist/0/news.shtml" id="item天涯时空">天涯时空</a></li>

<li><a href="http://www.tianya.cn/publicforum/articleslist/0/no06.shtml" id="item传媒江湖">传媒江湖</a></li>

…… //省略

</ul>

</div>

<div class="clear"></div>

</div>

<div class="nobackrgoundcolor">

<div class="bankuai_list">

<h3>文学读书</h3>

<ul>

<li><a href="http://www.tianya.cn/techforum/articleslist/0/16.shtml" id="item莲蓬鬼话">莲蓬鬼话</a></li>

<li><a href="http://www.tianya.cn/publicforum/articleslist/0/no05.shtml" id="item煮酒论史">煮酒论史</a></li>

<li><a href="http://www.tianya.cn/publicforum/articleslist/0/culture.shtml" id="item舞文弄墨">舞文弄墨</a></li>

……. //省略

</ul>

</div>

<div class="clear"></div>

</div>

……. //省略

通过页面源码分析,发现每个大板块都是在<div class="bankuai_list"></div>的包括之下,而大板块下面的小版块都是下面的形式包含的。

<li><a href="xxx" id="xxx">xxx</a></li>,这些规律就是webharvest爬数据的规则。

下面先给出全部的配置:(tianya.xml)

<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>

这个配置文件分为三个部分:

1. 定义爬虫入口:

<var-def name="start">

<html-to-xml>

<http url="http://www.tianya.cn/bbs/index.shtml" charset="utf-8" />

</html-to-xml>

</var-def>

爬虫的入口URL是:http://www.tianya.cn/bbs/index.shtml

同时,指定了爬虫的爬数据的编码,这个编码应该根据具体的页面编码来定,例如上面的入口页面的编码就是utf-8。其实,有很多的中文页面的编码是gbk或者gb2312,那么这个地方的编码就要相应设置,否则会出现数据乱码。

2. 定义数据的过滤规则:

<var-def name="ulList">

<xpath expression="//div[@class='bankuai_list']">

<var name="start" />

</xpath>

</var-def>

上面配置就是根据XPath从爬得的数据中筛选合适的内容。这里需要得到所有的<div class="bankuai_list"></div>信息。有关XPath和XQuery的语法请网上查询。

3. 最后一步就是处理数据。可以写入XML文件,也可以使用SetContextVar的方式把收集的数据塞到一个集合变量中,供Java代码调用(比如:数据直接入库)。
这里是直接写入XML文件,然后解析XML即可。

注意下面的for循环,这是XQuery的语法,提供遍历的功能。由于大版面小版块是一个树状结构,需要这种遍历。

<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>

相关的Java代码如下:

/**

* Copyright(C):2009

* @author陈新汉

* Sep4,20093:24:58PM

*/

String configFile="tianya.xml";

ScraperConfiguration config = new ScraperConfiguration(configFile);

String targetFolder="c:\\chenxinhan";

Scraper scraper = new Scraper(config,targetFolder);

//设置爬虫代理

scraper.getHttpClientManager().setHttpProxy("218.56.64.210","8080");

scraper.setDebug(true);

scraper.execute();

上面代码执行完成后,收集的数据文件地址为:c:\chenxinhan\tianya\siteboards.xml

友情提示:本博文章欢迎转载,但请注明出处:陈新汉,http://www.blogjava.net/hankchen

Webharvest网络爬虫应用总结相关推荐

  1. java 开发用到网络爬虫,抓取汽车之家网站全部数据经历

    经历了两个礼拜的折腾,某某知名网站的数据终于到手了.犯罪没被发现这种心情感觉很爽. 说一下我的犯罪经历,之前公司总是抓取某某网站数据,可能是被发现了.某某网站改变了策略.通过各种技术终止了我们的行为, ...

  2. 83款 网络爬虫开源软件

    网络爬虫介绍及其比较 http://www.docin.com/p-321349858.html 1.http://www.oschina.net/project/tag/64/spider?lang ...

  3. 爬虫_83款 网络爬虫开源软件

    1.http://www.oschina.net/project/tag/64/spider?lang=0&os=0&sort=view& 搜索引擎 Nutch Nutch 是 ...

  4. 2023年互联网网络爬虫框架TOP10分析

    网络爬虫 是一种自动收集互联网上发布的文本.图像和视频等信息并将其存储在数据库中的程序.各种网络爬虫在大数据热潮中发挥着重要作用,使人们更容易抓取数据. 在各种网络爬虫中,有很多开源的网络爬虫框架.开 ...

  5. 开源python爬虫软件下载_83款 网络爬虫开源软件

    Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. 尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目 ...

  6. python网络爬虫初识_python爬虫(一)初识爬虫

    什么是爬虫? 中文名(网络爬虫) 外文名(web crawler) 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程 ...

  7. 【网络爬虫】(1) 网络请求,urllib库介绍

    各位同学好,今天开始和各位分享一下python网络爬虫技巧,从基本的函数开始,到项目实战.那我们开始吧. 1. 基本概念 这里简单介绍一下后续学习中需要掌握的概念. (1)http 和 https 协 ...

  8. Python网络爬虫--urllib

    本篇随便记录学习崔庆才老师编著的<Python3 网络爬虫开发实战>以及urllib标准库使用 urllib库是Python内置的HTTP请求库,包含四个模块: request:最基本的H ...

  9. python网络爬虫程序技术,Python网络爬虫程序技术

    spContent=该课程是2018年广东省精品在线开放课程.课程主要以爬取学生信息.爬取城市天气预报.爬取网站图像.爬起图书网站图书.爬取商城网站商品等5个项目为依托,讲解Web.正则表达式.Bea ...

最新文章

  1. ABP 重写主键ID
  2. 阿里巴巴研究员叔同:云原生是企业数字创新的最短路径
  3. WeX5 Model 里data ,baasData 数据过滤条件清除 数据初始化
  4. clone git 修改保存路径_用git管理版本,你必须知道的事情
  5. linux服务器如何访问,如何连接一个Linux服务器
  6. vue seo关键词设置_「干货」SEO常识关键词选取及设置方法
  7. WINDOWS2016故障转移群集
  8. 在计算机上设置桌面,如何在计算机上设置动态桌面墙纸
  9. 记一款价廉物美的小型DAC+耳放----Dr.DAC
  10. kali最高权限root
  11. 什么是软件测试工程师呢?
  12. html字母输出空格,如何在网页中插入html中文空格与英文空格
  13. LSD源代码编译运行
  14. scrollTop兼容性问题
  15. 20221018-B站视频怎么自动添加字幕
  16. 001-unity2D游戏随机生成地图
  17. 上品携手SAP领跑服装零售行业
  18. 新东方雅思词汇---7.4、cap
  19. 微机原理——汇编语言
  20. 去中心化数字身份DID简介——二、一个完整的DID使用流程

热门文章

  1. 网络工程之思科路由器基本配置操作讲解
  2. 聆听音乐6cd下载_机器聆听如何改变智能家居体验
  3. 如何用Link Develop开发一个智能厕所
  4. shell脚本编程之练习篇
  5. 基于 RFID 技术的飞机维修工具管理系统
  6. insertBefore 的详细用法解析
  7. element分页:删除最后一页的所有数据后currentPage显示正确,但列表内容为空以及批量删除为空的问题
  8. Github 删除远端分支的某个文件或文件夹
  9. 红米k40刷lineage-18.1
  10. pc弹窗宽度_PC端网页尺寸设计一