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

  • 爬取到的数据

 

  • 分析图:

 

  • 源代码:

import csv
import random
import time
import pandas as pd
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False


class Spider(object):
    def __init__(self):
        pass

    def get_data_and_save(self):
        with open('data.csv', 'w', encoding='utf-8', newline='') as f:
            csv_writer = csv.writer(f)
            csv_writer.writerow(['日期', '质量等级', 'AQI指数', '当天AQI排名', 'PM2.5', 'PM10', 'So2', 'No2', 'Co', 'O3'])
            years = [2020, 2021, 2022]
            months = range(1, 13)
            for year in years:
                for month in months:
                    if month < 10:
                        url = f'http://tianqihoubao.com/aqi/beijing-{year}0{month}.html'
                    else:
                        url = f'http://tianqihoubao.com/aqi/beijing-{year}{month}.html'
                    res = requests.get(url).text
                    soup = BeautifulSoup(res, 'html.parser')
                    for attr in soup.find_all('tr')[1:]:
                        one_day_data = list()
                        for index in range(0, 10):
                            one_day_data.append(attr.find_all('td')[index].get_text().strip())
                        csv_writer.writerow(one_day_data)
                    time.sleep(2 + random.random())
                    print(year, month)

    def drawing(self):
        csv_df = pd.read_csv('data.csv', encoding='GBK')
        csv_df['日期'] = pd.to_datetime(csv_df['日期'])
        csv_df.index = csv_df['日期']
        del csv_df['日期']

        str_data = '2020-01-01'
        end_data = '2020-01-31'
        new_split_df = csv_df[str_data:end_data]
        values_count = new_split_df['质量等级'].value_counts().items()
        total = new_split_df['质量等级'].value_counts().tolist()
        label = new_split_df['质量等级'].value_counts().index
        explode = [0.01 for i in range(len(total))]
        fig, axes = plt.subplots(3, 1, figsize=(10, 8))
        # 画饼图
        axes[0].pie(total, labels=label, autopct='%0.2f%%', explode=explode)
        axes[0].set_title(f'北京{str_data.split("-")[0]}年{str_data.split("-")[1]}月份统计数据')
        # 画折线图
        axes[1].plot(new_split_df['AQI指数'], 'go-')
        axes[1].axhspan(0, 50, facecolor='g', alpha=0.5)
        axes[1].axhspan(50, 100, facecolor='y', alpha=0.5)
        axes[1].axhspan(100, 150, facecolor='orange', alpha=0.5)
        axes[1].axhspan(150, 200, facecolor='r', alpha=0.5)
        axes[1].set_title(f'北京{str_data.split("-")[0]}年{str_data.split("-")[1]}月空气质量指数(AQI)变化趋势')
        axes[1].legend(labels=('AQI',), loc='lower center', bbox_to_anchor=(0.5, -0.32))
        # 画折线图
        key = lambda x: f"{x.year}-{x.month}" if x.month >= 10 else f"{x.year}-0{x.month}"
        AQI_max = csv_df.groupby(key)['AQI指数'].max()
        AQI_ave = csv_df.groupby(key)['AQI指数'].mean()
        AQI_min = csv_df.groupby(key)['AQI指数'].min()

        axes[2].plot(AQI_max, 'go-', color='r')
        axes[2].plot(AQI_ave, 'go-', color='g')
        axes[2].plot(AQI_min, 'go-', color='b')
        axes[2].axhspan(0, 50, facecolor='g', alpha=0.5)
        axes[2].axhspan(50, 100, facecolor='y', alpha=0.5)
        axes[2].axhspan(100, 150, facecolor='orange', alpha=0.5)
        axes[2].axhspan(150, 200, facecolor='r', alpha=0.5)
        axes[2].axhspan(200, 300, facecolor='magenta', alpha=0.5)
        axes[2].axhspan(300, 400, facecolor='purple', alpha=0.5)
        axes[2].axhspan(400, 600, facecolor='brown', alpha=0.5)
        axes[2].legend(['最大值', '平均值', '最小值'], bbox_to_anchor=(0.6, -0.353), ncol=3)
        plt.xticks(rotation=70)
        plt.subplots_adjust(hspace=0.433, wspace=0.5)
        axes[2].set_title(f'北京空气质量指数(AQI)月变化趋势')
        plt.show()


if __name__ == '__main__':
    spider = Spider()
    # 获取数据,保存数据
    spider.get_data_and_save()
    # 画分析图
    spider.drawing()

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

  • 2
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山浪客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值