`

用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 DSL

    研究表明,使用Groovy比使用Java写程序,代码量少3-10倍。 DSL是新一代基于领域设计专用语言。由于Groovy的超级灵活性,你可以使用Groovy快速编写基于领域的小语言,从而将编码量进一步减少,程序更容易维护。越少...

    Groovy轻松入门——Grails实战基础篇

    在实战之前需要搭建开发环境,您可以在 Groovy轻松入门--搭建Groovy开发环境 学习到如何搭建Groovy环境,之后我会讲一下如何搭建Grails环境,然后手把手地写个Demo程序告终,我还会抽空写篇“Groovy轻松入门- -...

    Groovy-2.4.13 windows版安装程序.rar

    软件介绍: ...本版本经过测试能够正常安装使用,支持添加到IDEA中。和JAVA类似的动态语言Groovy,在虚拟机中运行,Groovy脚本在运行时会先被编译成Java类字节码,再通过JVM虚拟机执行这个Java字节码类。

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

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

    Groovy学习笔记 PDF版

    Groovy

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

    Groovy入门]第二讲.完成文本界面的程序框架 竟然上来了 enjoy it

    groovy入门经典,groovyeclipse 插件

    groovy入门经典,groovyeclipse 插件

    精通 Groovy--下一代开发语言

    Groovy 是 JVM 的一个替代语言 — 替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。在编写新应用程序时,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有...

    Java中使用Groovy的三种方式

    Java中使用Groovy的三种方式,详细见我的博客。

    Groovy入门教程[参照].pdf

    Groovy入门教程[参照].pdf

    apache-groovy-sdk-2.4.11

    本文适合于不熟悉 Groovy,但想快速轻松地了解其基础知识的 Java开发人员。了解 Groovy 对 Java 语法的简化变形,学习 Groovy 的...最重要的是,您将学会如何在日常 Java 应用程序开发中联合使用 Groovy 和 Java 代码。

    groovy入门编程

    groovy入门 groovy入门 groovy入门 groovy入门groovy入门groovy入门

    job-dsl-playground, 使用Jenkins工作DSL调试Groovy脚本的应用程序.zip

    job-dsl-playground, 使用Jenkins工作DSL调试Groovy脚本的应用程序 Jenkins工作DSL游乐场http://job-dsl.herokuapp.com/使用 Jenkins工作DSL插件调试Groovy脚本的应用程序。 允许用户使用DSL创建作业并查看生成的XML...

    groovy-3.0.9-API文档-中文版.zip

    赠送jar包:groovy-3.0.9.jar;...使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    groovy经典入门

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

    Groovy入门经典.pdf

    由于具有动态弱类型,以及无缝访问JavaAPI等特性,Groovy语言非常适合子开发中小型规模的应用程序。  相对于Java语言,Groovy语言的表述性更强,抽象程度更高。它使得应用程序开发更加快捷,提升了程序员生产力。...

    groovy-3.0.7.msi

    groovy

    Java Groovy结合使用

    概述主要介绍Java、spring与groovy结合使用,高清英文版本

    [Groovy] Making Java 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...

Global site tag (gtag.js) - Google Analytics