一直想在webmagic中加入一门自定义语言(领域特定语言,简称DSL),但是实在无力从语法解析层开始写起。尝试过在XPath上做文章,后来又觉得太难过了。今天又聊到这个话题,想到当年接触过的Ruby,找到了这个Ruby的简易爬虫项目: https://github.com/mion/harvestman
JVM上一个好处就是有很多奇怪的库,而且这些库还非常的成熟,比如JRuby,Jython以及rhino。于是鼓捣半天,整出了一个DSL的雏形(基于JRuby): <!-- lang: ruby --> title = css "div.BlogTitle h1" content = css "div.BlogContent" urls "http://my\.oschina\.net/flashsword/blog/\d+"
感觉还是非常强大的!最强大之处是你大概不知道它是Ruby,好像你也不怎么需要会Ruby的语法...
可惜JRuby虽酷,但是遇到复杂情况定制起来可能会有点难度,毕竟会Ruby的人不那么多。这时我又想到了广大程序员喜闻乐见的Javascript!于是有了Javascript版本DSL(基于rhino):
<!-- lang: js -->
var result = {
title: $("div.BlogTitle h1"),
content: $("div.BlogContent")
}
var config = {
ua: '',
sleepTime : 20
}
urls("http://my\\.oschina\\.net/flashsword/blog/\\d+")
说真的它已经不算是DSL了,因为有明显的js痕迹!不过没关系,毕竟熟悉js的人更多嘛,这样子高级定制会方便一些。