• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

python爬取空气质量数据,并用Matplotlib模块画出图

武飞扬头像
青山浪客
帮助1

  • 爬取到的数据

学新通

 

  • 分析图:

学新通

  • 源代码:

  1.  
    import csv
  2.  
    import random
  3.  
    import time
  4.  
    import pandas as pd
  5.  
    import requests
  6.  
    from bs4 import BeautifulSoup
  7.  
    import matplotlib.pyplot as plt
  8.  
     
  9.  
    plt.rcParams["font.sans-serif"] = ["SimHei"]
  10.  
    plt.rcParams["axes.unicode_minus"] = False
  11.  
     
  12.  
     
  13.  
    class Spider(object):
  14.  
    def __init__(self):
  15.  
    pass
  16.  
     
  17.  
    def get_data_and_save(self):
  18.  
    with open('data.csv', 'w', encoding='utf-8', newline='') as f:
  19.  
    csv_writer = csv.writer(f)
  20.  
    csv_writer.writerow(['日期', '质量等级', 'AQI指数', '当天AQI排名', 'PM2.5', 'PM10', 'So2', 'No2', 'Co', 'O3'])
  21.  
    years = [2020, 2021, 2022]
  22.  
    months = range(1, 13)
  23.  
    for year in years:
  24.  
    for month in months:
  25.  
    if month < 10:
  26.  
    url = f'http://tianqihoubao.com/aqi/beijing-{year}0{month}.html'
  27.  
    else:
  28.  
    url = f'http://tianqihoubao.com/aqi/beijing-{year}{month}.html'
  29.  
    res = requests.get(url).text
  30.  
    soup = BeautifulSoup(res, 'html.parser')
  31.  
    for attr in soup.find_all('tr')[1:]:
  32.  
    one_day_data = list()
  33.  
    for index in range(0, 10):
  34.  
    one_day_data.append(attr.find_all('td')[index].get_text().strip())
  35.  
    csv_writer.writerow(one_day_data)
  36.  
    time.sleep(2 random.random())
  37.  
    print(year, month)
  38.  
     
  39.  
    def drawing(self):
  40.  
    csv_df = pd.read_csv('data.csv', encoding='GBK')
  41.  
    csv_df['日期'] = pd.to_datetime(csv_df['日期'])
  42.  
    csv_df.index = csv_df['日期']
  43.  
    del csv_df['日期']
  44.  
     
  45.  
    str_data = '2020-01-01'
  46.  
    end_data = '2020-01-31'
  47.  
    new_split_df = csv_df[str_data:end_data]
  48.  
    values_count = new_split_df['质量等级'].value_counts().items()
  49.  
    total = new_split_df['质量等级'].value_counts().tolist()
  50.  
    label = new_split_df['质量等级'].value_counts().index
  51.  
    explode = [0.01 for i in range(len(total))]
  52.  
    fig, axes = plt.subplots(3, 1, figsize=(10, 8))
  53.  
    # 画饼图
  54.  
    axes[0].pie(total, labels=label, autopct='%0.2f%%', explode=explode)
  55.  
    axes[0].set_title(f'北京{str_data.split("-")[0]}{str_data.split("-")[1]}月份统计数据')
  56.  
    # 画折线图
  57.  
    axes[1].plot(new_split_df['AQI指数'], 'go-')
  58.  
    axes[1].axhspan(0, 50, facecolor='g', alpha=0.5)
  59.  
    axes[1].axhspan(50, 100, facecolor='y', alpha=0.5)
  60.  
    axes[1].axhspan(100, 150, facecolor='orange', alpha=0.5)
  61.  
    axes[1].axhspan(150, 200, facecolor='r', alpha=0.5)
  62.  
    axes[1].set_title(f'北京{str_data.split("-")[0]}{str_data.split("-")[1]}月空气质量指数(AQI)变化趋势')
  63.  
    axes[1].legend(labels=('AQI',), loc='lower center', bbox_to_anchor=(0.5, -0.32))
  64.  
    # 画折线图
  65.  
    key = lambda x: f"{x.year}-{x.month}" if x.month >= 10 else f"{x.year}-0{x.month}"
  66.  
    AQI_max = csv_df.groupby(key)['AQI指数'].max()
  67.  
    AQI_ave = csv_df.groupby(key)['AQI指数'].mean()
  68.  
    AQI_min = csv_df.groupby(key)['AQI指数'].min()
  69.  
     
  70.  
    axes[2].plot(AQI_max, 'go-', color='r')
  71.  
    axes[2].plot(AQI_ave, 'go-', color='g')
  72.  
    axes[2].plot(AQI_min, 'go-', color='b')
  73.  
    axes[2].axhspan(0, 50, facecolor='g', alpha=0.5)
  74.  
    axes[2].axhspan(50, 100, facecolor='y', alpha=0.5)
  75.  
    axes[2].axhspan(100, 150, facecolor='orange', alpha=0.5)
  76.  
    axes[2].axhspan(150, 200, facecolor='r', alpha=0.5)
  77.  
    axes[2].axhspan(200, 300, facecolor='magenta', alpha=0.5)
  78.  
    axes[2].axhspan(300, 400, facecolor='purple', alpha=0.5)
  79.  
    axes[2].axhspan(400, 600, facecolor='brown', alpha=0.5)
  80.  
    axes[2].legend(['最大值', '平均值', '最小值'], bbox_to_anchor=(0.6, -0.353), ncol=3)
  81.  
    plt.xticks(rotation=70)
  82.  
    plt.subplots_adjust(hspace=0.433, wspace=0.5)
  83.  
    axes[2].set_title(f'北京空气质量指数(AQI)月变化趋势')
  84.  
    plt.show()
  85.  
     
  86.  
     
  87.  
    if __name__ == '__main__':
  88.  
    spider = Spider()
  89.  
    # 获取数据,保存数据
  90.  
    spider.get_data_and_save()
  91.  
    # 画分析图
  92.  
    spider.drawing()

本案例只做教学用途,不可用于商业用途

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhhabhaj
系列文章
更多 icon
同类精品
更多 icon
继续加载