用Python爬虫获取今日全国高温Top10

热出天际

今天全国到底有多热暂时不知道,反正我大西安今天是热出天际了!
还没入伏就能有这样的温度,各大空调厂商是给老天送了多少供奉啊....
之前做天气预报自动推送小工具的时候,爬过中国天气网,今天就再盘它一次,来看看全国天气吧
首先进入中国天气网,有一个国内天气预报的栏目:

5847426-70996508d777c5c2.png
国内天气预报.png

如上图所示,网站将中国分为:
华为、东北、华南、西北、西南、华东、华中、港澳台及大地域,西安属于西北,进去看看:


5847426-2bf412e14f9eda4e.png
西安天气.png

看到这温度,我就想到了小岳岳的那句我的天哪...!
咱们来分析下这张图,每个省的第一个诚实都是省会城市,省内的温度差别不大,那我们就把全国每个省会城市的温度进行比较吧,至于港澳台...我选择直接忽视。

网站分析

网站html分析
5847426-28a9563410378db8.png
网站html代码.png
  • 每日天气
    <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个地域,然后获取每个地域下的省会城市,最终保存到一个列表中,样式大致如下:

5847426-bd08a504f05e78ab.png
预处理数据.png

数据展示

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

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

所以不一样的我使用pyecharts....
今天用pyecharts绘图,让大家看看python集成echarts后的绘图效果如何。
既然是温度排行当然要用折线图了,然后绘图给大家展示下全国今日气温最高的省会城市Top10,走起...

代码实现

模块准备

如果你是首次使用爬虫和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/pyecharts

5847426-36228a635223ceab.png
github更新说明.png

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

代码实现
# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清风Python
# @Date     : 2019/5/25 11:45
# @Software : PyCharm
# @version  :Python 3.6.8
# @File     : TempComparison.py

import requests
from bs4 import BeautifulSoup
from pyecharts.charts import Line
import time


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.find('div', {'class': 'conMidtab'}).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)))

    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))
        charts_bar = (
            Line()
                .set_global_opts(
                title_opts={"text": "全国省会城市温度Top10 %s " % time.strftime("%Y-%m-%d", time.localtime()),
                            "subtext": "author:一梦七年诗"})
                .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的文件

5847426-5e2f30c05b957887.png
生成html.png

效果展示:


5847426-1f852845b54a1dac.gif
效果展示.gif

Top1

看到了吧,今天我天朝长安城排名Top1,不服来战啊!
今天的Python练习是否满意?

github:https://github.com/KingUranus/PythonTests

©本文由简书作者:清风Python 原创 如需转载请注明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值