groovy爬虫实例——历史上的今天

最近做了一个历史上今天的爬虫程序,跟历史天气数据源一致,数据量比较小,几十秒就爬完了。中间遇到一些问题,一起分享出来供大家参考。本项目源码和相关数据已经上传到了github,有兴趣的朋友可以去看看,会不定期更新。

github传送门

弄了一个查看地址:有兴趣可以点击一下

1.get请求发送sql语句不能过长:我是做爬虫里面把sql拼好,发送到数据库存储服务上,之前一直用的get请求,由于这次内容较多,超过了最大长度限制,导致报错。故改为post请求,且兼容了get请求方式。

2.不明确的数据类型:某个年份的某一天事件不唯一的话,json格式的value是array,如果唯一则是一个json。在处理这个数据的时候才去了正则匹配。总结起来,在提取相关接口数据的时候,正则最好用。

3.拼接月份的时候有点复杂,直接写了一个省事儿的方法,如果各位有简单好用的,望不吝赐教。

static void main(String[] args) {
        DEFAULT_CHARSET = GBK;

        for (int i in 1..12) {
            for (int j in 1..31) {
                if (i == 2 && (j == 30 || j == 31)) continue
                if ((i in [4, 6, 9, 11]) && j == 31) continue
                def month = i > 9 ? i + EMPTY : "0" + i;
                def day = j > 9 ? j + EMPTY : "0" + j;
                def date = month + "-" + day
                getInfo(date)
            }
        }

        testOver()
    }

    static getInfo(String date) {
        def url = "http://tools.***.com/his/" + date.replace("-", EMPTY) + "_c.js"
        def all = FanRequest.isGet()
                .setUri(url)
                .getResponse()
                .getString("content")
                .substring(8)
                .replace(";", EMPTY)
                .replaceAll("(&nbsp)+", EMPTY)
                .replaceAll("\\t", EMPTY)
                .replace("##", EMPTY)
                .replaceAll(SPACE_1, EMPTY)
        def json = JSONObject.fromObject(all)
        def keys = json.keySet()
        keys.each { key ->
            def s = json.get(key).toString()
            def all1 = Regex.regexAll(s, "\\{\"title.+?\\}")
            for (int i in 0..all1.size() - 1) {
                def info = all1.get(i)
                def inf = JSONObject.fromObject(info.toString())
                def title = inf.getString("title")
                def keyword = inf.getString("keyword")
                def content = inf.getString("content")
                def alt = inf.getString("alt")
                String sql = "INSERT INTO today_histroy (date,title,keyword,content,alt) VALUES (\"%s\",\"%s\",\"%s\",\"%s\",\"%s\");"
                sql = String.format(sql, key + "-" + date, title, keyword, content.replace("  ", EMPTY), alt)
                MySqlTest.sendWork(sql)
            }
        }
    }

欢迎有兴趣的朋友一起交流:QQ群号:340964272

猜你喜欢

转载自blog.csdn.net/Fhaohaizi/article/details/82620826