最近作了一个历史上今天的爬虫程序,跟历史天气数据源一致,数据量比较小,几十秒就爬完了。中间遇到一些问题,一块儿分享出来供你们参考。本项目源码和相关数据已经上传到了github,有兴趣的朋友能够去看看,会不按期更新。java
git传送门git
get请求发送sql语句不能过长:我是作爬虫里面把sql拼好,发送到数据库存储服务上,以前一直用的get请求,因为此次内容较多,超过了最大长度限制,致使报错。故改成post请求,且兼容了get请求方式。github
不明确的数据类型:某个年份的某一天事件不惟一的话,json格式的value是array,若是惟一则是一个json。在处理这个数据的时候才去了正则匹配。总结起来,在提取相关接口数据的时候,正则最好用。sql
拼接月份的时候有点复杂,直接写了一个省事儿的方法,若是各位有简单好用的,望不吝赐教。数据库
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("( )+", 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) } } }