前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >groovy爬虫实例——历史上的今天

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

作者头像
FunTester
发布2019-10-23 16:18:56
6920
发布2019-10-23 16:18:56
举报
文章被收录于专栏:FunTester

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

git传送门:https://github.com/Fhaohaizi/fan

  1. get请求发送sql语句不能过长:我是做爬虫里面把sql拼好,发送到数据库存储服务上,之前一直用的get请求,由于这次内容较多,超过了最大长度限制,导致报错。故改为post请求,且兼容了get请求方式。
  2. 不明确的数据类型:某个年份的某一天事件不唯一的话,json格式的value是array,如果唯一则是一个json。在处理这个数据的时候才去了正则匹配。总结起来,在提取相关接口数据的时候,正则最好用。
  3. 拼接月份的时候有点复杂,直接写了一个省事儿的方法,如果各位有简单好用的,望不吝赐教。
代码语言:javascript
复制
 1static void main(String[] args) {
 2        DEFAULT_CHARSET = GBK;
 3
 4        for (int i in 1..12) {
 5            for (int j in 1..31) {
 6                if (i == 2 && (j == 30 || j == 31)) continue
 7                if ((i in [4, 6, 9, 11]) && j == 31) continue
 8                def month = i > 9 ? i + EMPTY : "0" + i;
 9                def day = j > 9 ? j + EMPTY : "0" + j;
10                def date = month + "-" + day
11                getInfo(date)
12            }
13        }
14        testOver()
15    }
16    static getInfo(String date) {
17        def url = "http://tools.***.com/his/" + date.replace("-", EMPTY) + "_c.js"
18        def all = FanRequest.isGet()
19                .setUri(url)
20                .getResponse()
21                .getString("content")
22                .substring(8)
23                .replace(";", EMPTY)
24                .replaceAll("(&nbsp)+", EMPTY)
25                .replaceAll("\\t", EMPTY)
26                .replace("##", EMPTY)
27                .replaceAll(SPACE_1, EMPTY)
28        def json = JSONObject.fromObject(all)
29        def keys = json.keySet()
30        keys.each { key ->
31            def s = json.get(key).toString()
32            def all1 = Regex.regexAll(s, "\\{\"title.+?\\}")
33            for (int i in 0..all1.size() - 1) {
34                def info = all1.get(i)
35                def inf = JSONObject.fromObject(info.toString())
36                def title = inf.getString("title")
37                def keyword = inf.getString("keyword")
38                def content = inf.getString("content")
39                def alt = inf.getString("alt")
40                String sql = "INSERT INTO today_histroy (date,title,keyword,content,alt) VALUES (\"%s\",\"%s\",\"%s\",\"%s\",\"%s\");"
41                sql = String.format(sql, key + "-" + date, title, keyword, content.replace("  ", EMPTY), alt)
42                MySqlTest.sendWork(sql)
43            }
44        }
45    }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档