专栏首页FunTestergroovy爬虫实例——历史上的今天

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

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

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

  1. get请求发送sql语句不能过长:我是做爬虫里面把sql拼好,发送到数据库存储服务上,之前一直用的get请求,由于这次内容较多,超过了最大长度限制,导致报错。故改为post请求,且兼容了get请求方式。
  2. 不明确的数据类型:某个年份的某一天事件不唯一的话,json格式的value是array,如果唯一则是一个json。在处理这个数据的时候才去了正则匹配。总结起来,在提取相关接口数据的时候,正则最好用。
  3. 拼接月份的时候有点复杂,直接写了一个省事儿的方法,如果各位有简单好用的,望不吝赐教。
 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    }

本文分享自微信公众号 - FunTester(NuclearTester)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「中高级前端面试」JavaScript手写代码无敌秘籍

    用来解析JSON字符串,构造由字符串描述的JavaScript值或对象。提供可选的reviver函数用以在返回之前对所得到的对象执行变换(操作)。

    Nealyang
  • 当我用了这些 Chrome 扩展插件,突然多出了好多时间!

    使用浏览器扩展程序可以使你的工作效率提高数倍不止,那么下面我就向大家分享一下我日常使用的扩展,可能大多数扩展大家都已经在使用了,不过也难免有一两个是你不知道的。

    Rocky0429
  • localStorage详细总结

    localStorage是html5的新特性,所以并不是所有的浏览器都支持,因此在使用localStorage时需要先判断浏览器是否支持localStorage...

    用代码征服天下
  • spring项目logback日志与logstash和Elasticsearch整合

    最近在做一个将分布式系统的日志数据通过logstash传到kafka的功能,做完之后决定业余搭一个ELK日志分析系统,将logstash采集到的日志传给Elas...

    朱季谦
  • 56 道高频 JavaScript 与 ES6+ 的面试题及答案

    用正则表达式匹配字符串,以字母开头,后面是数字、字符串或者下划线,长度为 9 - 20

    Nealyang
  • Thinkphp5.0快速入门笔记(3)

    https://www.kancloud.cn/thinkphp/thinkphp5_quickstart

    嘘、小点声
  • 【实践】Go的json解析:Marshal与Unmarshal

    Json(Javascript Object Nanotation)是一种数据交换格式,常用于前后端数据传输。任意一端将数据转换成json 字符串,另一端再将该...

    辉哥
  • nodejs基础-nvm和npm

    eadela
  • 判断点是否在多边形内的Python实现及小应用(射线法)

    判断一个点是否在多边形内是处理空间数据时经常面对的需求,例如GIS软件中的点选功能、根据多边形边界筛选出位于多边形内的点、求交集、筛选不在多边形内的点等等。判断...

    蛰虫始航
  • 前端模块化详解(完整版)

    在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可;如今CPU、浏览器性能得到了极大的提升,很多页面逻辑迁移到了客户端(表单验证等),随...

    Nealyang

扫码关注云+社区

领取腾讯云代金券