如何用Python、Pandas和爬虫统计历史天气数据?

摘要:背景 最近在计划明年从北京rebase到深圳去,所以最近在看深圳的各个方面。去年在深圳呆过一段时间,印象最深的是,深圳总是突然就下雨,还下好大的雨。对于我这种从小在南方长大但是后面又在北京呆了2年多的人来说,熟悉而又无奈。 今天早上本来想随
背景 最近在计划明年从北京rebase到深圳去,所以最近在看深圳的各个方面。去年在深圳呆过一段时间,印象最深的是,深圳总是突然就下雨,还下好大的雨。对于我这种从小在南方长大但是后面又在北京呆了2年多的人来说,熟悉而又无奈。 今天早上本来想随便浏览浏览一个天气网站,看看深圳的历史天气如何的,但是,一不小心发现,这家网站竟然直接能用API来抓数据,这~~~还不抓一波,省的自己一个月一个月地看。 先上最后的效果图: 所有的code都在我的GitHub上:boydfd 下面从几个方面讲一讲我是怎么做的: 爬取数据 用pandas显示数据 功能扩展 遇到的坑 爬取数据 先是在http://tianqi.2345.com上面浏览了一下深圳的6月份天气。然后发现点切换月份的时候,网址没有变,那应该有请求API吧,看看这个API长啥样吧。 发现返回值就是纯JS代码,那就解析一下吧: 去掉var =和最后的;。 用到demjson解析成Python的List[Dict]对象。 转成pandas的DataFrame 加上我们的date字段 date = '201905' weather = requests.get('http://tianqi.2345.com/t/wea_history/js/{date}/59493_{date}.js'.format(date=date)).text.split('=')[1][:-1] weather = demjson.decode(weather)['tqInfo'] df = pd.DataFrame(weather) df['month'] = date 结果是这样的: 用Pandas显示数据 太多雨天 我们可以看到,有各种雷阵雨啊,阴转雨啊,雨转阴之类的,这样看到的天气太杂了,所以我就统一了一下,按照雨、多云、阴、晴的顺序来排序,先出出现的关键词优先级更高。 写一个函数来处理之: rain = '雨' rain_index = ' ' + rain cloudy = '多云' cloudy_index = ' ' + cloudy overcast = '阴' overcast_index = ' ' + overcast sunny = '晴' sunny_index = ' ' + sunny def weath_category(row): tianqi = row['tianqi'] if tianqi.find(rain) != -1: return rain_index if tianqi.find(overcast) != -1: return overcast_index if tianqi.find(cloudy) != -1: return cloudy_index return sunny_index 多个月的数据 一个月的数据不够啊,我们想要很多个月的数据,那就写得函数来生成月份吧。 def date_generate(start, end): start = datetime.strptime(start, '%Y%m') end = datetime.strptime(end, '%Y%m') while True: next_start = start + relativedelta(months=1) yield start.strftime('%Y%m') if next_start > end: break start = next_start 画图 分好类,爬了多个月份的数据,就剩最终的画图部分了。使用Pandas提供给我们的函数,可以很容易就画出图来。
阅读全文