夏天气温最冷TOP10城市|Python 主题月

本文正在参加「Python主题月」,详情查看 活动链接

工作准备

  之前有介绍过静态页面的爬取与动态接口的获取。其实爬虫也就是从一些常用的接口与页面上获取信息,接下来也同样是通过页面爬取元素的方式,带大家进行在炎炎夏日通过数据冰爽一下!!!

本地运行环境也是基于docker,搭建的粗细节,小伙伴们可以查看下上一篇文章介绍 ==>传送门

代码编写

需求分析

   我们要获取对应的城市气温情况,需要了解到哪里能获取到全国城市的气温分布情况,那么想到的就是通过天气预报网,在通过爬取各个地域的最低气温然后进行归纳整理即可。

  1. 查看各个区域的城市气温列表返回,并在页面元素中找到对应气温栏目。
  2. 爬取各个页面上所有的城市气温,进行存储并排序取得前十。
  3. 将对应的温度城市数据输出为直方图。

编写代码

  1. 首选定义函数入口,爬取对应数据项。
# 一共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'

url_areas = [url_hb, url_db, url_hd, url_hz, url_hn, url_xb, url_xn, url_gat]

for index, url in enumerate(url_areas):
     print('开始爬取第{}个区域'.format(index + 1))
     parse_page(url)
     time.sleep(1)
复制代码
  1. 分析数据并排序输出目标数据。
def analysis_data():
    # 1.默认的排序方式是升序【通过最低气温进行排序】
    ALL_DATA.sort(key=lambda data: data['temp_low'])
    # 2.获取前面10条数据
    top_10 = ALL_DATA[:10]
    return top_10
复制代码
  1. 对数据进行输出为直方图。
def show_with_chart(top_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文件中
    chart = Bar()
    chart.add_xaxis(citys)
    chart.add_yaxis("城市",temp_lows)
    chart.set_global_opts(title_opts=opts.TitleOpts(title="中国天气最低气温排行榜"))
    chart.render('temperature.html')
复制代码

效果截图

image.png

完整代码


import requests
from bs4 import BeautifulSoup
import time
from  pyecharts.charts  import Bar
from pyecharts import options as opts



# 一共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'

url_areas = [url_hb, url_db, url_hd, url_hz, url_hn, url_xb, url_xn, url_gat]

HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    'Referer': 'http://www.weather.com.cn/textFC/hb.shtml'
}

# 数据【城市+最低温度】列表
ALL_DATA = []


def parse_page(url):
    response = requests.get(url, headers=HEADERS)
    # 1.获取页面的原始html数据
    text = response.content.decode('utf-8')
    # 注意:港澳台中香港的table标签没有正确的关闭,使用lxml解析器不能正确解析。需要使用html5lib【容错性强】去自动补全代码,然后进行解析
    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)})


def spider():
    for index, url in enumerate(url_areas):
        print('开始爬取第{}个区域'.format(index + 1))
        parse_page(url)
        time.sleep(1)


def analysis_data():
    # 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):
    # 1.获取城市列表
    citys = list(map(lambda item: item['city'], top_10))
    
    # 2.最低温度列表
    temp_lows = list(map(lambda item: item['temp_low'], top_10))
    
    # 3.生成直方图并写入到html文件中
    chart = Bar()
    chart.add_xaxis(citys)
    chart.add_yaxis("城市",temp_lows)
    chart.set_global_opts(title_opts=opts.TitleOpts(title="中国天气最低气温排行榜"))
    chart.render('temperature.html')


if __name__ == '__main__':
    # 1.爬取数据
    spider()
    
    # 2.分析数据
    top_10 = analysis_data()
    
    # 3.使用chart生成直方图
    show_with_chart(top_10)
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享