我抓取了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 的部分解释下:

  1. 匹配到<td class='null'>读取下两行到多行模式空间;
  2. 删除 <xxx> 之类的字符串;
  3. 将换行符替换为空格;
  4. 删除空行。

不过我是用了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 {
      // 处理错误
    }
    // 数据存储处理
}

备注:

  1. regexp 中的多行模式需要使用 (?m:) 模式来实现;
  2. 先提取出三行信息,然后删除 <xxx> 内容;
  3. 最后用 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 证实了我的想法

其他:

总体来说肉类较蔬菜类价格比较稳定,小幅度上升的架势。

That's all.