当前位置:   article > 正文

基于python的天气网站数据爬取和可视化分析项目_pycharm用pyecharts爬取中国天气网数据实现可视化大屏

pycharm用pyecharts爬取中国天气网数据实现可视化大屏
  1. 基于python的天气网站数据爬取和可视化分析项目  2024.03-2024.04
  2. 项目职责:策划者和执行者 
  3. 项目地址:
  4. 项目描述本项目的目的是为了通过爬虫技术来爬取中国气象网的天气数据,并且使用pandas,pyecharts进行

数据可视化,分析天气数据。

  1. 项目环境pycharm,python3.9 requests bs pandas jupyter-notebook pyecharts,腾讯云,mariadb等
  2. 项目步骤

1.数据爬取:使用requests库模拟web浏览器进行访问中国气象网爬取数据,使用BeautifulSoup和lxml进行数据提取,包括日期、气温、风向、风级、风速、气压、降水,pm25等。

将常用的函数封装成模块--》导入

  1. """
  2. @author: wangyalin
  3. @file: download.py
  4. @time: 2023/11/30 10:42
  5. 把可重复使用的功能进行封装
  6. download模块(文件名:符合标识符的命名规则)
  7. """
  8. import requests
  9. import time
  10. import logging
  11. # 获取文本
  12. def download(url):
  13. #
  14. headers = {
  15. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
  16. }
  17. try:
  18. # try内部写有可能会出错的代码
  19. response = requests.get(url, headers=headers)
  20. response.raise_for_status()
  21. # 设置编码格式
  22. response.encoding = response.apparent_encoding
  23. # 返回文本数据
  24. time.sleep(1)
  25. # print(url, "访问成功")
  26. logging.info(url+"访问成功")
  27. return response.text
  28. except:
  29. # 如果出错了会执行这里
  30. # print(url, "访问错误")
  31. logging.error(url+"访问错误")
  32. return ""
  33. # 获取二进制
  34. def download_img(url):
  35. #
  36. headers = {
  37. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
  38. }
  39. try:
  40. # try内部写有可能会出错的代码
  41. response = requests.get(url, headers=headers)
  42. response.raise_for_status()
  43. # 设置编码格式
  44. response.encoding = response.apparent_encoding
  45. # 返回文本数据
  46. time.sleep(1)
  47. logging.info(url+"访问成功")
  48. return response.content
  49. except:
  50. # 如果出错了会执行这里
  51. logging.error(url + "访问错误")
  52. return ""

 

2.数据存储:将爬取的数据存储到腾讯云(cos),其他数据存储到本地mariadb数据库上,我成功爬取了中国气象网北京等几个城市的数据,为后续数据分析提供数据支撑。

上传本地mysql服务器做保存数据

  1. """
  2. @author: wangyalin
  3. @file: pyecharts_test.py
  4. @time: 2024/5/8 18:11
  5. """
  6. import pandas as pd
  7. from pyecharts.charts import Bar, Pie
  8. from pyecharts import options as opts
  9. # 读取 CSV 文件
  10. df = pd.read_csv("weacher7.csv")
  11. # 削去全为空的列和行
  12. df.dropna(axis="columns", how="all", inplace=True)
  13. df.dropna(axis="index", how="all", inplace=True)
  14. # 添加温度类型列
  15. def get_wendu_type(x):
  16. if x["最高温度"] > 28:
  17. return "高温"
  18. elif x["最低温度"] < 10:
  19. return "低温"
  20. else:
  21. return "常温"
  22. df["温度类型"] = df.apply(get_wendu_type, axis=1)
  23. # 设置索引为城市
  24. df.set_index('城市', inplace=True)
  25. # 提取北京数据
  26. df_beijing = df.loc['北京']
  27. # 绘制北京温度类型占比饼图
  28. y_data_pie = df_beijing.groupby("温度类型")["日期"].count()
  29. datas_pie = [(item, int(y_data_pie[item])) for item in y_data_pie.index]
  30. pie_chart = (
  31. Pie()
  32. .add("温度类型占比", datas_pie, percent_precision=1)
  33. .set_global_opts(title_opts=opts.TitleOpts(title="北京温度类型占比"))
  34. .set_series_opts(
  35. label_opts=opts.LabelOpts(formatter="{b}:{c} {d}%"),
  36. tooltip_opts=opts.TooltipOpts(formatter="{b}:{d}%")
  37. )
  38. )
  39. # 绘制北京天气温度类型柱状图
  40. y_data_bar = df_beijing.groupby("温度类型")["日期"].count().sort_values()
  41. data_bar = [int(y_data_bar[item]) for item in y_data_bar.index]
  42. bar_chart = (
  43. Bar()
  44. .add_xaxis(list(y_data_bar.index))
  45. .add_yaxis("北京", data_bar)
  46. .set_global_opts(title_opts=opts.TitleOpts(title="北京天气", subtitle="温度类型统计"))
  47. )
  48. # 温度变化曲线图
  49. data_line = df.groupby("日期").agg({"最高温度": "max", "最低温度": "min"})
  50. line_chart = data_line.plot()
  51. import matplotlib.pyplot as plt
  52. # 设置字体
  53. plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"] # 使用微软雅黑字体
  54. plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题
  55. # 保存图片
  56. line_chart.figure.savefig("温度变化曲线图.png")
  57. # 渲染图表
  58. pie_chart.render("北京温度类型占比.html")
  59. bar_chart.render("北京天气温度类型统计.html")
  60. line_chart.figure.savefig("温度变化曲线图.png")

 

 同时备份数据到腾讯云服务器--》做备份和冗余

 

  1. from qcloud_cos import CosConfig
  2. from qcloud_cos import CosS3Client
  3. from qcloud_cos.cos_exception import CosClientError, CosServiceError
  4. import sys
  5. import os
  6. import logging
  7. # 正常情况日志级别使用 INFO,需要定位时可以修改为 DEBUG,此时 SDK 会打印和服务端的通信信息
  8. logging.basicConfig(level=logging.INFO, stream=sys.stdout)
  9. # 修改secret_id, secret_key, region
  10. # 1. 设置用户属性, 包括 secret_id, secret_key, region 等。Appid 已在 CosConfig 中移除,请在参数 Bucket 中带上 Appid。Bucket 由 BucketName-Appid 组成
  11. secret_id = os.environ[
  12. 'COS_SECRET_ID'] # 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
  13. # secret_id = "AKID63mIafW2KOGvNcgW8WheYFiwwjHagZEf" # 用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
  14. secret_key = os.environ[
  15. 'COS_SECRET_KEY'] # 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
  16. # secret_key = "FXcS8b5LNAj4A2g993kDRRCpFSUedVBg" # 用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
  17. region = 'ap-guangzhou' # 替换为用户的 region,已创建桶归属的 region 可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket
  18. # COS 支持的所有 region 列表参见 https://cloud.tencent.com/document/product/436/6224
  19. token = None # 如果使用永久密钥不需要填入 token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见 https://cloud.tencent.com/document/product/436/14048
  20. scheme = 'https' # 指定使用 http/https 协议来访问 COS,默认为 https,可不填
  21. config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme)
  22. client = CosS3Client(config)
  23. import os
  24. def upload_folder(remote_dir, local_dir, bucket="wang-1325844428"):
  25. for root, dirs, files in os.walk(local_dir):
  26. for file in files:
  27. local_path = os.path.join(root, file)
  28. # 使用相对路径作为 COS 中的存储路径
  29. relative_path = os.path.relpath(local_path, local_dir)
  30. key = os.path.join(remote_dir, relative_path).replace("\\", "/") # 统一使用 "/" 分隔符
  31. upload(key, local_path, bucket)
  32. def upload(key, local_path, bucket="wang-1325844428"):
  33. # 使用高级接口断点续传,失败重试时不会上传已成功的分块(这里重试10次)
  34. for i in range(0, 10):
  35. try:
  36. response = client.upload_file(
  37. Bucket=bucket,
  38. Key=key,
  39. LocalFilePath=local_path)
  40. break
  41. except (CosClientError, CosServiceError) as e:
  42. print(e)
  43. url = f"{scheme}://{bucket}.cos.{region}.myqcloud.com/{key}"
  44. return url
  45. # 使用示例
  46. upload_folder("爬虫项目项目汇总", "./爬虫项目项目汇总")

 

 

 

3.数据清洗和整理:利用pandas对爬取的数据进行清洗和整理,去除重复和异常值,保证数据的可靠性。

4.数据可视化:利用pyecharts库将清洗后的数据以图表的形式展示,例如折线图展示一年气温变化曲线,饼图展示

使用pandas做数据清洗

使用pyecharts进行数据可视化

matplotlib--》绘制图片

  1. """
  2. @author: wangyalin
  3. @file: pyecharts_test.py
  4. @time: 2024/5/8 18:11
  5. """
  6. import pandas as pd
  7. from pyecharts.charts import Bar, Pie
  8. from pyecharts import options as opts
  9. # 读取 CSV 文件
  10. df = pd.read_csv("weacher7.csv")
  11. # 削去全为空的列和行
  12. df.dropna(axis="columns", how="all", inplace=True)
  13. df.dropna(axis="index", how="all", inplace=True)
  14. # 添加温度类型列
  15. def get_wendu_type(x):
  16. if x["最高温度"] > 28:
  17. return "高温"
  18. elif x["最低温度"] < 10:
  19. return "低温"
  20. else:
  21. return "常温"
  22. df["温度类型"] = df.apply(get_wendu_type, axis=1)
  23. # 设置索引为城市
  24. df.set_index('城市', inplace=True)
  25. # 提取北京数据
  26. df_beijing = df.loc['北京']
  27. # 绘制北京温度类型占比饼图
  28. y_data_pie = df_beijing.groupby("温度类型")["日期"].count()
  29. datas_pie = [(item, int(y_data_pie[item])) for item in y_data_pie.index]
  30. pie_chart = (
  31. Pie()
  32. .add("温度类型占比", datas_pie, percent_precision=1)
  33. .set_global_opts(title_opts=opts.TitleOpts(title="北京温度类型占比"))
  34. .set_series_opts(
  35. label_opts=opts.LabelOpts(formatter="{b}:{c} {d}%"),
  36. tooltip_opts=opts.TooltipOpts(formatter="{b}:{d}%")
  37. )
  38. )
  39. # 绘制北京天气温度类型柱状图
  40. y_data_bar = df_beijing.groupby("温度类型")["日期"].count().sort_values()
  41. data_bar = [int(y_data_bar[item]) for item in y_data_bar.index]
  42. bar_chart = (
  43. Bar()
  44. .add_xaxis(list(y_data_bar.index))
  45. .add_yaxis("北京", data_bar)
  46. .set_global_opts(title_opts=opts.TitleOpts(title="北京天气", subtitle="温度类型统计"))
  47. )
  48. # 温度变化曲线图
  49. data_line = df.groupby("日期").agg({"最高温度": "max", "最低温度": "min"})
  50. line_chart = data_line.plot()
  51. import matplotlib.pyplot as plt
  52. # 设置字体
  53. plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"] # 使用微软雅黑字体
  54. plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题
  55. # 保存图片
  56. line_chart.figure.savefig("温度变化曲线图.png")
  57. # 渲染图表
  58. pie_chart.render("北京温度类型占比.html")
  59. bar_chart.render("北京天气温度类型统计.html")
  60. line_chart.figure.savefig("温度变化曲线图.png")

一年中的气温分布,柱形图展示空气以质量排序,地图来展示地区的天气质量,以便更好的观测数据。

实现的图片:

http://localhost:63342/python/%E7%88%AC%E8%99%AB%E9%A1%B9%E7%9B%AE/%E7%88%AC%E8%99%AB%E4%B8%8A%E8%AF%BE%E4%BB%A3%E7%A0%81-20240115/%E5%8C%97%E4%BA%AC%E5%A4%A9%E6%B0%94%E6%B8%A9%E5%BA%A6%E7%B1%BB%E5%9E%8B%E7%BB%9F%E8%AE%A1.html?_ijt=muv8o99t5bhm044riji2snb8ft

 http://localhost:63342/python/%E7%88%AC%E8%99%AB%E9%A1%B9%E7%9B%AE/%E7%88%AC%E8%99%AB%E4%B8%8A%E8%AF%BE%E4%BB%A3%E7%A0%81-20240115/%E5%8C%97%E4%BA%AC%E6%B8%A9%E5%BA%A6%E7%B1%BB%E5%9E%8B%E5%8D%A0%E6%AF%94.html?_ijt=muv8o99t5bhm044riji2snb8ft

 

 

项目心得

1.更加加深对python爬虫应用的理解

2.加强了对pandas、requests 、pyecharts库的使用

3.提升了自己的python语法纠错,错误排查能力

4.增强了自己的数据分析、数据处理的能力

5.更加深入理解云平台的使用

   

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/709870
推荐阅读
相关标签
  

闽ICP备14008679号