码迷,mamicode.com
首页 > Web开发 > 详细

正式推荐我的一个开源项目,可以处理网页抓取,语法分析

时间:2015-09-01 12:45:01      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

autogrammerspider项目,今天在[www.taobao.com]上面测试成功了,这个项目可以大大缓解你抓取网页时,分析网页的痛苦。

目前在功能,效率上面虽然还有很大的提升空间,但是基本运行已经问题不大。我今天正式介绍这个项目,希望各位有兴趣的话可以用用,提出宝贵意见,如果真的需要什么功能的话也可以告诉我,我会尽快完善。

这个东西的使用如下,

首先配置特征文件,放在resource, autospider下面,

技术分享

特征文件的内容如下:

技术分享

在这个特征文件里面有3个地方需要注意,

一个是最上面的namespace,这个地方是你使用时候的一个名字标记,这里为tb-category。

一个是handler,这是你自己定义的处理函数,当完全匹配到特征的时候就会调用这个函数。

还有一个是<_list>标签,例如你要匹配的是 <div someattr> <a someattr> <a someattr> .... </div> 这里由于你本身也不知道,不关心里面有几个<a>标签,你就可以加入一个<_list>,表示它同级别前面的兄弟元素无限重复。

那么handler是什么样子呢?

技术分享

其中,第一个参数会贯穿一个整个匹配过程,无论你要匹配多少种handler,多少次handler,只要是一篇文章的匹配,这个ExecuteParam就是同一个。

第二个参数是植入了handler的元素,第三个参数是符合整个特征的元素,在这里也就分别是a标签,以及它父级的父级的<dd>元素标签。

下面是整个测试代码:

技术分享

这里你需要配置一个bean,然后用createExecutor("传入配置文件里面的namespace")即可获得一个执行上下文,用来分析文本,下面是bean的配置,你自己new一个对象然后调用init方法也可以:

技术分享

运行结果:

技术分享

这里只是匹配到了一组特征值,程序支持多组匹配,如果有多个满足特征的html元素,会匹配多次。


最后就是开源软件的位置了,包括测试项目的git代码在这里:

http://git.oschina.net/notebook

由于我目前还没有上传至maven仓库,我在published项目里面放了2个jar包。

简单说说原理:

本文的功能由 autogrammerspider直接支持,autogrammer则是更下一级的支持,它是一个可自定义语法,可自定义处理流程,自定义错误处理等等的语法分析器(其实由于它完全是自己写的,甚至可以不符合任何语法规则,所以说是状态机生成器可能更为贴切),它的作用远不止这个文章里面提到的功能,将来我还会以它为基础完成其他的项目。

autogrammerspider本身是一个编译器,它首先有一套内置的规则文法,然后会用这个编译器去变编译用户配置的配置文件,这个编译的结果是另一个编译器。

用户会用这第二个编译器去编译文本,这个编译器的逻辑是这样的,首先它只能识别用户在配置文件中定义的属性和tag,然后他会试图按照配置文件去读取,一旦发现读取失败则会抛弃之前失败的文本,继续从头匹配,一旦整个匹配成功则调用handler,然后如此反复一直匹配到文本结束为止。


最后的最后附上几个需要完善的地方

首先目前尚不支持<a>ww</a>这种xml内部 text的匹配,只支持标签和属性的匹配。

还有例如上面这个匹配规则,如果是 

<div class="J_CatHook cathook" class="c-2"> <a class="c-3"> something </a></div>

这样是会匹配成功的,因为class="c-2"是在特征里面不存在的,会被忽略。但是

<div class="J_CatHook cathook" class="c-3"> <a class="c-3"> something </a></div>

会匹配失败,因为class="c-3"在特征里面存在,无法被忽略。

其他缺陷肯定还有,但目前作为第一个版本我认为尚无必要考虑如此多的情况,如果各位使用中有什么需要可以告诉我,我会更新。




正式推荐我的一个开源项目,可以处理网页抓取,语法分析

标签:

原文地址:http://my.oschina.net/HaFoLuoKe/blog/499980

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!