年底了能买到火车票是非常幸运的事儿, 比如我同事, 通过电话就订到了车票, 而我死活都没打进那个电话.
于是用groovy写了个程序, 用来抓取火车票信息, 网上相关的程序还不少, 我只是用groovy来练练手而已, 本来可以完善一下, 像这个(
http://www.cnblogs.com/guozili/archive/2011/01/19/1939157.html)可以从多个网站抓取, 像这个(
http://www.notedit.com/2010/11/%E6%8A%A2%E7%81%AB%E8%BD%A6%E7%A5%A8%E7%9A%84%E7%A8%8B%E5%BA%8F/)可以定时抓取, 本来我想通过定时抓取发消息的, 后来搞到了票, 就这样吧.
class GetTicket {
final static String host = "http://hz.58.com/huochepiao/?StartStation=%25u676D%25u5DDE&EndStation=%25u5B9C%25u660C"
// 最早发车时间
final static int earliest = 120
// 已经确认无票的过滤掉
final static List filterList = [
"http://hz.58.com/huochepiao/4538967059457x.shtml",
"http://hz.58.com/huochepiao/4536633437697x.shtml"
]
def void get() {
def htmlSource = new Http().get(host).source.toString()
int i = 0
LinkedList<Entry> list = [] as LinkedList<Entry>;
htmlSource.eachLine{
if (i > 0 && i <= 4) {
switch(i) {
case 1:
list[list.size()-1].location = it.trim()
break;
case 2:
list[list.size()-1].number = it.trim()
break;
case 3:
list[list.size()-1].type = it.trim()
break;
case 4:
def matcher = it.trim() =~ /(.+)<\/a>/
def pair = matcher[0][1].split(" ")
pair[1] = pair[1].replaceAll(/月|日/, "")
list[list.size()-1].count = pair[0]
list[list.size()-1].date = pair[1]
if (Integer.valueOf(pair[1]) < earliest) {
list.removeLast()
}
break;
}
i++
return;
}else {
i = 0;
}
if (it ==~ /^ +<a href="http:\/\/hz\.58\.com\/huochepiao.+/){
def matcher = it =~ /"(http:\/\/hz\.58\.com\/huochepiao.+?)"/
def url = matcher[0][1].trim()
if (filterList.contains(url)) {
return;
}
Entry entry = [:] as Entry
entry.url = url
list << entry
i++
// 临近站信息
matcher = it =~ /.+>(.+)$/
if (matcher.matches()) {
entry.location = matcher[0][1].trim()
i++
}
}
}
list = list.sort()
list.each{ println "${it.date}\t${it.count}\t ${it.type}\t ${it.number}\t ${it.location}\t ${it.url}" }
}
}
class Entry implements Comparable{
def url
def location
def number
def type
def count
def date
int compareTo( def other) {
return Integer.valueOf(other.date) - Integer.valueOf(date)
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
注: 解析html用到了com.googlecode.groovyhttp.Http 这个lib(http://code.google.com/p/groovy-http/)
输出结果:
引用
131 1张 硬卧 K529 杭州 - 恩施 http://hz.58.com/huochepiao/4555300451203x.shtml
129 1张 硬卧 K529 杭州 - 荆门 http://hz.58.com/huochepiao/4547173468803x.shtml
128 1张 K529 杭州 - 恩施 http://hz.58.com/huochepiao/4547524308355x.shtml
124 1张 硬座 K253 杭州 - 宜昌 http://hz.58.com/huochepiao/4557214747137x.shtml
123 1张 硬卧 K253 杭州南 - 宜昌 http://hz.58.com/huochepiao/4557440945411x.shtml
123 1张 站票 K529 杭州 - 宜昌 http://hz.58.com/huochepiao/4532977245187x.shtml
122 1张 硬座 K253 杭州南 - 宜昌 http://hz.58.com/huochepiao/4557377085571x.shtml
122 1张 硬座 K253 杭州南 - 宜昌 http://hz.58.com/huochepiao/4544944871170x.shtml
分享到:
相关推荐
研究表明,使用Groovy比使用Java写程序,代码量少3-10倍。 DSL是新一代基于领域设计专用语言。由于Groovy的超级灵活性,你可以使用Groovy快速编写基于领域的小语言,从而将编码量进一步减少,程序更容易维护。越少...
在实战之前需要搭建开发环境,您可以在 Groovy轻松入门--搭建Groovy开发环境 学习到如何搭建Groovy环境,之后我会讲一下如何搭建Grails环境,然后手把手地写个Demo程序告终,我还会抽空写篇“Groovy轻松入门- -...
软件介绍: ...本版本经过测试能够正常安装使用,支持添加到IDEA中。和JAVA类似的动态语言Groovy,在虚拟机中运行,Groovy脚本在运行时会先被编译成Java类字节码,再通过JVM虚拟机执行这个Java字节码类。
语言程序设计资料:Groovy_快速入门.doc
Groovy
Groovy入门]第二讲.完成文本界面的程序框架 竟然上来了 enjoy it
groovy入门经典,groovyeclipse 插件
Groovy 是 JVM 的一个替代语言 — 替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。在编写新应用程序时,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有...
Java中使用Groovy的三种方式,详细见我的博客。
Groovy入门教程[参照].pdf
本文适合于不熟悉 Groovy,但想快速轻松地了解其基础知识的 Java开发人员。了解 Groovy 对 Java 语法的简化变形,学习 Groovy 的...最重要的是,您将学会如何在日常 Java 应用程序开发中联合使用 Groovy 和 Java 代码。
groovy入门 groovy入门 groovy入门 groovy入门groovy入门groovy入门
job-dsl-playground, 使用Jenkins工作DSL调试Groovy脚本的应用程序 Jenkins工作DSL游乐场http://job-dsl.herokuapp.com/使用 Jenkins工作DSL插件调试Groovy脚本的应用程序。 允许用户使用DSL创建作业并查看生成的XML...
赠送jar包:groovy-3.0.9.jar;...使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
groovy经典入门必备,愿大家共享下一代的编程语言。有问题共同探讨。
apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...
由于具有动态弱类型,以及无缝访问JavaAPI等特性,Groovy语言非常适合子开发中小型规模的应用程序。 相对于Java语言,Groovy语言的表述性更强,抽象程度更高。它使得应用程序开发更加快捷,提升了程序员生产力。...
groovy
概述主要介绍Java、spring与groovy结合使用,高清英文版本
Making Java Groovy is a practical handbook for developers who want to blend Groovy into their day to day work with Java It starts by introducing the key differences between Java and Groovy and how you...