美文网首页python热爱者Python新世界
南方还未下雪,你是否知道中国哪10个城市最冷?python给你答

南方还未下雪,你是否知道中国哪10个城市最冷?python给你答

作者: 48e0a32026ae | 来源:发表于2018-12-19 13:53 被阅读2次

    阅读文本大概需要 7 分钟。

    01

    抓取目标

    这次我们的目标是爬取全国最冷的 10 座城市。

    首先打开目标网站 - 中国天气网。

    学习Python中有不明白推荐加入交流群

                    号:960410445

                    群里有志同道合的小伙伴,互帮互助,

                    群里有不错的视频学习教程和PDF!

    我们要爬取全国所有城市的 温度,然后获取温度最低的 10 个城市,再绘制成饼状图。

    02

    准备工作

    由于爬取的数据少,考虑使用「 美味汤 - beautiful soup 」的方式来爬取。

    另外,最后需要根据数据生成饼状图,需要安装「 pyecharts 」及兼容库,不然控制台会报错。

    # 安装美味汤

    pip3 install bs4

    # html5lib 提升兼容性

    pip3 install html5lib

    # 安装图形库

    pip3 install pyecharts

    # 安装图形兼容库

    pip3 install pyecharts-snapshot

    注意:一般爬虫使用 lxml 去解析,但是由于中国天气网的「 港澳台 」页面源码中存在很多标签没有正确关闭,因此使用 html5lib 的方式去解析数据。

    03

    爬取思路

    首先,我们可以看到全国分为华北、东北、华东、华中、华南、西北、西南、港澳台,8 个区域来展示天气数据。

    # 一共8个区域,包含:华北、东北、华东、华中、华南、西北、西南、港澳台

    # 华北

    url_hb = 'http://www.weather.com.cn/textFC/hb.shtml'

    # 东北

    url_db = 'http://www.weather.com.cn/textFC/db.shtml'

    # 华东

    url_hd = 'http://www.weather.com.cn/textFC/hd.shtml'

    # 华中

    url_hz = 'http://www.weather.com.cn/textFC/hz.shtml'

    # 华南

    url_hn = 'http://www.weather.com.cn/textFC/hn.shtml'

    # 西北

    url_xb = 'http://www.weather.com.cn/textFC/xb.shtml'

    # 西南

    url_xn = 'http://www.weather.com.cn/textFC/xn.shtml'

    # 港澳台【比较特殊】

    url_gat = 'http://www.weather.com.cn/textFC/gat.shtml'

    我们首先需要去获取每一个区域下所有城市的天气数据,然后再对数据进行整理排序,写入到图形文件中。

    04

    代码实现

    首先爬取「 华北地区 」城市的天气数据。

    可以获取到下面的规律:

    所有的「 class=conMidtab 」的 6 个 div 保存着华北地区所有城市,包含今天以内未来一周的天气数据。

    每一个「 class=conMidtab2 」的 div 代表了一个省份的天气信息。

    省份下面的城市天气数据,都包含 table 标签下。从第 3 个 tr 标签开始,是每一个城市的天气数据。

    soup = BeautifulSoup(text, 'html5lib')

    div_conMidtab = soup.find('div', class_='conMidtab')

    # 3.获取所有的table子Tag【天气信息都保存在table标签下面】

    tables = div_conMidtab.find_all('table')

    # 4.遍历片区下面的省份

    for table in tables:

    # 4.1过滤掉表头的两个tr数据

    trs = table.find_all('tr')[2:]

    # 5.遍历省份下面的市区

    for index, tr in enumerate(trs):

    tds = tr.find_all('td')

    # 5.1 城市名称【第 1 个td标签】

    # 注意:一个省份第一个城市取第 2 个td标签;其余城市取第 1 个td标签

    city_td = tds[1] if index == 0 else tds[0]

    city = list(city_td.stripped_strings)[0]

    # 5.2 最低气温【倒数第 2 个td标签】

    temp_low_td = tds[-2]

    temp_low = list(temp_low_td.stripped_strings)[0]

    ALL_DATA.append({"city": city, "temp_low": int(temp_low)})

    接下来,循环全国 8 个区域的列表,获取所有城市的名称和温度数据。

    for index, url in enumerate(url_areas):

    print('开始爬取第{}个区域'.format(index + 1))

    parse_page(url)

    time.sleep(1)

    然后拿到所有城市和温度的列表数据后,就可以对数据按温度进行「 升序 」排列。

    def analysis_data():

    """

    分析爬下来的数据

    :return:

    """

    # 1.默认的排序方式是升序【通过最低气温进行排序】

    ALL_DATA.sort(key=lambda data: data['temp_low'])

    # 2.获取前面10条数据

    top_10 = ALL_DATA[:10]

    return top_10

    最后,将数据写入到饼状图中。

    def show_with_chart(top_10):

    """

    10个城市和温度生成饼状图

    :param top_10:

    :return:

    """

    # 把列表tip_10中的每一项拿出去放到匿名函数中,然后组装成新的一个列表

    # 1.获取城市列表

    citys = list(map(lambda item: item['city'], top_10))

    # 2.最低温度列表

    temp_lows = list(map(lambda item: item['temp_low'], top_10))

    # 3.生成饼状图并写入到html文件中

    bar = Bar("最低气温排行榜")

    bar.add("最低温度", citys, temp_lows)

    # 渲染

    bar.render('temperature.html')

    05

    爬取结果

    最后打开生成的饼状图,就能很直观的查看到今天温度最低的 10 个城市。

    相关文章

      网友评论

        本文标题:南方还未下雪,你是否知道中国哪10个城市最冷?python给你答

        本文链接:https://www.haomeiwen.com/subject/wacjkqtx.html