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"在特征里面存在,无法被忽略。
其他缺陷肯定还有,但目前作为第一个版本我认为尚无必要考虑如此多的情况,如果各位使用中有什么需要可以告诉我,我会更新。