zoukankan      html  css  js  c++  java
  • 自古逢秋悲寂寥,奈何今秋热成雕?Python使用Pyecharts统计全国温度Top10并绘图

    秋词—刘禹锡

    自古逢秋悲寂寥,
    我言秋日胜春朝。
    晴空一鹤排云上,
    便引诗情到碧霄。

    古人谈及秋天,都是悲凉寂寥,那么….我好想回到古代的秋天啊!明明到了秋天,为什么最近的气温比夏天还热。
    之前做天气预报自动推送小工具的时候,爬过中国天气网 

    http://www.weather.com.cn/forecast/,今天就再盘它一次,来看看全国天气吧
    首先进入中国天气网,有一个国内天气预报的栏目:

    如上图所示,网站将中国分为:
    华为、东北、华南、西北、西南、华东、华中,西安属于西北,进去看看:

    网站有一个设置,只要过了当天的6点,那么当天的白天温度就清空了…所以我们就来看看,明天全国天气Top10吧!

    看到这温度,我就想说,三伏天的温度也不过如此吧….
    咱们来分析下这张图,每个省的第一个城市都是省会城市,省内的温度差别不大,那我们就把全国每个省会城市的温度进行比较吧,至于港澳台…暂且不分析。

    网站分析

    网站html分析

    每日天气

    • <div class="conMidtab">
      conMidtab一共有7个,后6个添加了隐藏样式style="display:none;",是后6天的天气预报,既然咱们看的是明天天气,就选择第二个吧…

    • 各省天气
      <div class="conMidtab2">
      每个省份的数据都包过在这个div中,只要findAll即可

    • 省会城市
      <tr style="background-color: rgb(255, 255, 255);">
      表格中的前两个tr应该用th做标题的,所以从第三个tr就是省会城市的温度信息了

    • 数据获取
      省会城市名称、最高温度、最低温度 分别在1、4、7的td中,findALL后,这么规律的排序直接使用列表切片[1:8:3]即可获取

    数据汇总分析

    刚才分析了西北地区的数据获取,然后再看看西南。
    西北地域的数据url为:
    http://www.weather.com.cn/textFC/xb.shtml
    再看看西南地域的url:
    http://www.weather.com.cn/textFC/xn.shtml
    简直不要太欢乐,url只有最后的地域拼音头不一样,可以开启for循环模式了!
    遍历7个地域,然后获取每个地域下的省会城市,最终保存到一个列表中,样式大致如下

    数据展示

    数据趴好了,返回一串数组?这怎么符合处女座追求完美的行事风格!
    python绘图的模块很多,多数人都用Matplotlib,但是…

    渣男锡纸烫,渣女大波浪,而我不一样,积极又向上。

    所以不一样的我使用pyecharts….
    今天用pyecharts绘图,让大家看看python集成echarts后的绘图效果如何。

    代码实现

    模块准备

    如果你是首次使用爬虫和echarts绘图,需要关注一下模块的安装:

    pip install requests
    install beautifulsoup4
    pip install lxml # bs4的解析依赖库
    pip install pyecharts

    关于pyecharts的更新

    网上铺天盖地的pycharts都是来回转来转去的0.3.x、0.5.x的版本
    pyecharts 19年4月份已经更新到1.1.0了,其中不管是模块导入还是插件的使用,变更都比较大。
    所以网上的那列介绍,如果是python3.6+你就别看了,不适合你,连代码引入都会报错。
    有人说可以指定旧版本啊,可既然出了新版本,你又何必杠精的去学习旧的版本?
    看看pyecharts的github:https://github.com/pyecharts/pyechart

    网站底部有专门的中、英文文档,喜欢的朋友可以去仔细瞧瞧…

    代码实现

    # -*- coding: utf-8 -*-
    # @Author   : 王翔
    # @JianShu  : 清风Python
    # @Date     : 2019/8/15 21:39
    # @Software : PyCharm
    # @version  :Python 3.7.3
    # @File     : TempComparison.py
    
    import requests
    from bs4 import BeautifulSoup
    from pyecharts.charts import Line
    import datetime
    
    
    class TempComparison:
        def __init__(self):
            self.cityInfoList = []
    
        def get_request(self):
            areas_list = ['hb', 'db', 'hd', 'hz', 'hn', 'xb', 'xn']
            headers = {
                'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) '
                              'AppleWebKit/537.36 (KHTML, like Gecko) '
                              'Chrome/70.0.3538.67 Safari/537.36',
                'Referer': 'http://www.weather.com.cn/textFC/xn.shtml'
            }
            for area in areas_list:
                req = requests.get("http://www.weather.com.cn/textFC/%s.shtml" % area,
                                   headers=headers)
                content = req.content.decode('utf-8')
                soup = BeautifulSoup(content, 'lxml')
                for line in soup.findAll('div', {'class': 'conMidtab'})[1].findAll('div', {'class': 'conMidtab2'}):
                    td_list = line.findAll('tr')[2].findAll('td')[1:8:3]
                    self.cityInfoList.append(list(map(lambda x: x.text.strip(), td_list)))
            print(self.cityInfoList)
    
        def filter_result(self):
            top_city_info = sorted(self.cityInfoList, key=lambda x: x[1], reverse=True)[:10]
            city, high_temp, low_temp = list(zip(*top_city_info))
            now = datetime.datetime.now()
            tommorrow = (now + datetime.timedelta(days=1)).strftime("%Y-%m-%d")
            charts_bar = (
                Line()
                    .set_global_opts(
                    title_opts={"text": "省会城市温度Top10 清风Python",
                                "subtext": tommorrow})
                    .add_xaxis(city)
                    .add_yaxis("高温", high_temp, color='#C3322D')  # is_symbol_show=True, is_smooth=True,
                    .add_yaxis("低温", low_temp, color='#399EFF')
            )
            charts_bar.render('TempComparison.html')
    
    
    if __name__ == '__main__':
        main = TempComparison()
        main.get_request()
        main.filter_result()
    

    代码执行完成后,会生成一个TempComparison.html的文件

    效果展示:

    The End

    OK,今天的内容就到这里,如果觉得内容对你有所帮助,欢迎点击文章右下角的“在看”。
    期待你关注我的公众号清风Python,如果觉得不错,希望能动动手指转发给你身边的朋友们。

    作者:清风Python

  • 相关阅读:
    齐文词根词缀---1、第一讲
    元音发音规则
    英语重读规则
    英语单词重读规则
    unicode,ansi,utf-8,unicode big endian编码的区别
    Netty中粘包和拆包的解决方案
    【转载】 DirectByteBuffer内存释放
    Netty 中ChannelOption的含义以及使用的场景Netty 中ChannelOption的含义以及使用的场景
    Connection reset原因分析和解决方案
    Netty实现Socket
  • 原文地址:https://www.cnblogs.com/huaweicloud/p/11861582.html
Copyright © 2011-2022 走看看