我抓取了1508天的广州市菜价数据
这两天发现了一个广州市全市菜篮子平价零售价信息的网页,该页面最早的记录日期是 2012-12-19 ,可以用来做数据抓取测试。
页面抓取和提取
网页格式
<tr>
<td class='null'>冻排骨<a href="javascript:showDetailChart('2017-02-14', 1736)"><img src="/basic/skin/default/jquery.easyui/icons/trend.png" border="0"></a></td>
<td class='null'>元/公斤</td>
<td class='null'>43.38</td>
<td class='null'>冻鸡翼<a href="javascript:showDetailChart('2017-02-14', 1738)"><img src="/basic/skin/default/jquery.easyui/icons/trend.png" border="0"></a></td>
<td class='null'>元/公斤</td>
<td class='null'>33.31</td>
<td class='null'>冻凤爪<a href="javascript:showDetailChart('2017-02-14', 1739)"><img src="/basic/skin/default/jquery.easyui/icons/trend.png" border="0"></a></td>
<td class='null'>元/公斤</td>
<td class='null'>24.63</td>
</tr>
提取
最方便的方式是 shell,包括下载和提取,用 curl 和 sed ,一条 shell 指令可以解决:
curl -s 'http://121.8.226.252/basic/sendReportInfoes/sendReportDeatil?srhSrId=2&srhReportId=15&srhCycle=2017-02-15' | sed -rn "/<td class='null'>/{N;N;s/<[^>]+>//g;s/\n/ /g;p}" | sed -re '/^\s*$/d'
sed 的部分解释下:
- 匹配到
<td class='null'>
读取下两行到多行模式空间; - 删除
<xxx>
之类的字符串; - 将换行符替换为空格;
- 删除空行。
不过我是用了Golang来跑。
获取页面:
// import: net/http io/ioutil
resp, err := http.Get(url)
if err != nil {
// 错误处理
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
// 错误处理
}
提取信息:
// import: regexp strings
reg, _ := regexp.Compile(`(?m:<td class='null'>[^\n]+?</td>\n<td class='null'>[^\n]+?</td>\n<td class='null'>[^\n]+?</td>)`)
regSub, _ := regexp.Compile(`<[^>]+>`)
for _, one := range reg.FindAll(body, -1) {
content := regSub.ReplaceAllString(string(one), "")
fields := strings.Fields(content)
if len(fields) != 3 {
// 处理错误
}
// 数据存储处理
}
备注:
- regexp 中的多行模式需要使用
(?m:)
模式来实现; - 先提取出三行信息,然后删除
<xxx>
内容; - 最后用
strings.Fields
来分隔到一个 array 里。
数据存储
简单地使用了 redis ,数据类型是 List 。
key 为产品名,使用 RPUSH
逐个推入,数据内容为 date:value
格式,如:
2017-02-12:38.0
2017-02-13:37.76
读取时使用 LRANGE
读出。
使用的 redis 库为 github.com/garyburd/redigo/redis
。
比较简单,不细说了。
数据展示
用 beego 搭建了一个简单的 web 应用,就是下拉菜单选择产品,然后使用 echars 绘出 bar 图。
一些有意思的图
传说中的蒜你狠
菜价暴涨的 2016 年春节
google 如是说
果然是超过了草鱼
来去匆匆的冬瓜哥
google 如是说
空心菜是季节性作物?春冬两季价格普遍较高,而夏秋两季较低。
google 证实了我的想法
其他:
总体来说肉类较蔬菜类价格比较稳定,小幅度上升的架势。