`

用groovy写抓票程序

阅读更多
年底了能买到火车票是非常幸运的事儿, 比如我同事, 通过电话就订到了车票, 而我死活都没打进那个电话.

于是用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

分享到:
评论
3 楼 cectsky 2011-10-12  
有个疑问,我现在用你的代码,怎么eclipse不编译你的groovy文件呢
2 楼 cectsky 2011-03-02  
为什么要用LinkedList
1 楼 何枫abc 2011-01-25  
大哥,告诉你要用铁通的来打电话,路边的电话亭那是一打一个着.看到大哥写的代码,小弟我很是自卑啊!!!一点都看不懂.  

相关推荐

    Groovy入门]第二讲.完成文本界面的程序框架

    完成文本界面的程序框架"这个主题中,我们将深入探讨如何使用Groovy构建一个简单的文本界面程序。 首先,让我们了解Groovy的基本语法特点。Groovy允许开发者使用更接近自然语言的语法,比如省略分号和大括号。例如...

    Java中使用Groovy的三种方式

    本文将深入探讨在Java项目中使用Groovy的三种主要方式,并阐述它们各自的优势和应用场景。 一、作为嵌入式脚本 Java 6引入了JSR 223(Scripting for the Java Platform),允许在Java程序中直接执行脚本语言。...

    Groovy入门教程[参照].pdf

    3.兼容 Java:Groovy 可以与 Java 语言混合使用,Groovy 代码可以调用 Java 代码,反之亦然。 开发环境 1. JDK 1.5 以上 2. Eclipse + Groovy 插件(支持 Groovy 1.5.7) 创建 Groovy 项目 1. 新建一个 Java ...

    groovy经典入门

    Groovy是面向对象的,并且与Java完全兼容,这意味着你可以在Groovy程序中无缝地使用Java库和API。它的设计目标是提高开发者的生产力,同时保持强大的类型安全性和静态编译能力。 Groovy的经典入门通常会涵盖以下几...

    Groovy学习笔记 PDF版

    此外,书中可能还会涵盖Groovy在实际项目中的应用,如使用Grails进行Web开发,或者使用Groovy进行持续集成脚本的编写。书中的例子和练习将帮助你深入理解Groovy的强大功能,并提升你的编程技巧。 总之,Groovy为...

    Java调用Groovy,实时动态加载数据库groovy脚本

    当我们需要在Java程序中调用Groovy脚本时,可以使用以下步骤: 1. 引入Groovy库:在Java项目中添加Groovy的相关依赖,通常是`groovy-all`,确保Java能够访问Groovy运行时环境。 2. 创建GroovyClassLoader:使用这...

    groovy入门经典,groovyeclipse 插件

    无论是新手还是经验丰富的开发者,都能通过学习Groovy和使用GroovyEclipse插件提升工作效率。通过阅读《Groovy经典入门》这本书和实践其中的示例,你可以快速掌握Groovy语言并开始利用其强大的功能。

    Groovy安装以及简单使用

    在压缩包文件`GroovyDemo`中,可能包含了各种Groovy脚本示例,如上述的Hello World程序或者使用闭包的示例。通过查看这些示例,读者可以更直观地理解Groovy的语法和特性,并动手实践,从而更好地掌握Groovy的使用。 ...

    groovy-2.3.6-installer

    安装Groovy后,开发者可以使用Groovy Shell(groovysh)进行交互式编程,或者编写Groovy脚本执行任务。Groovy的语法简洁明了,支持闭包和动态类型,使得开发效率大大提高。此外,Groovy还可以用于构建脚本、Web开发...

    语言程序设计资料:Groovy_快速入门.doc

    语言程序设计资料:Groovy_快速入门.doc

    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版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...

    groovy和Java相互调用1

    标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...

    groovy in action 中文版 2017.11

    Groovy是完全兼容Java的,这意味着Java开发人员可以轻松地使用Groovy编写程序,并利用Groovy提供的强大功能简化开发流程。 Groovy能够为脚本编写人员提供一种更直接、更易于表达的编程方式。脚本编写人员可以使用...

    Groovy Script 入门

    4. **元编程**:Groovy支持元编程,可以通过反射机制修改程序的行为。 5. **简洁的语法**:Groovy具有简洁的语法,可以显著减少代码量。 6. **脚本能力**:Groovy支持命令行脚本执行,可以直接编写和执行简单的脚本...

    groovy-all

    如果你的项目中使用了Groovy,这个库将提供一个完整的生态系统,帮助你充分利用Groovy的灵活性和效率。在Java项目中引入这个库,你可以轻松地集成Groovy脚本,提升开发效率,同时得益于其动态特性和强大的库支持。

    apache-groovy-sdk-4.0.1下载

    解释器允许你运行Groovy脚本,而编译器则可以将Groovy代码转换成Java字节码,使得Groovy程序能在Java虚拟机(JVM)上运行。这对于Java开发者来说是个巨大的优势,因为他们可以无缝地将Groovy集成到现有的Java项目中...

    groovy速查手册

    这样做的好处在于,你可以像使用Java代码一样使用Groovy代码,无需担心兼容性问题。 - **从Groovy调用Java**:Groovy完全支持调用任何Java代码,就像在Java中一样直接使用。 - **从Java调用Groovy**:在Java中调用...

    groovy

    4. 测试:Spock测试框架使用Groovy编写,提供了富有表达力的测试语句,简化了测试代码的编写。 5. 容器管理:在Apache Kafka、Cassandra等大数据处理系统中,Groovy用于配置和管理容器。 四、Groovy与Java的交互 ...

Global site tag (gtag.js) - Google Analytics