爬取数据:对爬取数据进行分析整理,挖掘,分析 并进行可视化展示
import requests # 发送请求要用的模块 需要额外安装的 import parsel import csv import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.ticker as ticker plt.rcParams['font.family'] = 'SimSun' #第一步:需要爬取的网站地址 url = 'https://tianqi.2345.com/' # 发送 GET 请求 response = requests.get(url) # 检查请求是否成功 if response.status_code == 200: # 获取网页内容 html_content = response.text # 打印网页文本内容 print(html_content) else: print("请求失败,状态码:", response.status_code) # f = open('广-惠-河-深-天气.csv', mode='a', encoding='utf-8', newline='') csv_writer = csv.writer(f) csv_writer.writerow(['日期', '最高温度', '最低温度', '天气', '风向', '城市']) city_list = [72049, 59287, 59293, 59493,57036] for city in city_list: city_name = '' if city == 72049: city_name = '惠州' elif city == 59287: city_name = '广州' elif city == 59293: city_name = '河源' elif city == 59493: city_name = '深圳' # elif city== 57036: # city_name='西安' for year in range(2023, 2024): for month in range(1, 13): url = f'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D={city}&areaInfo%5BareaType%5D=2&date%5Byear%5D={year}&date%5Bmonth%5D={month}' # 1. 发送请求 response = requests.get(url=url) # 2. 获取数据 html_data = response.json()['data'] # 3. 解析数据 select = parsel.Selector(html_data) trs = select.css('.history-table tr') # 拿到31个tr for tr in trs[1:]: # 第一个表头不要 tds = tr.css('td::text').getall() # 针对每个tr进行提取 取出所有的td里面的内容 tds.append(city_name) # 把城市追加到列表里面 print(tds) # 4. 保存数据 csv_writer.writerow(tds) data = pd.read_csv('广-惠-河-深-天气.csv') data[['日期','星期']] = data['日期'].str.split(' ',expand=True,n=1) #去除多余字符 #data[['最高温度','最低温度']] = data[['最高温度','最低温度']].apply(lambda x: x.str.replace('°','').replace('', '0')) data[['最高温度','最低温度']] = data[['最高温度','最低温度']].apply(lambda x: x.str.replace('°','')) data.head() # 按城市和天气分组,并计算每组的天数 grouped = data.groupby(['城市', '天气']).size().reset_index(name='天数') # 将结果按城市分为4个DataFrame gz_weather = grouped[grouped['城市'] == '广州'] hy_weather = grouped[grouped['城市'] == '河源'] hz_weather = grouped[grouped['城市'] == '惠州'] sz_weather = grouped[grouped['城市'] == '深圳'] # # 定义一个函数,将原有的天气类型按照关键字划分 def classify_weather(weather): if '多云' in weather: return '多云' elif '晴' in weather: return '晴' elif '阴' in weather: return '阴' elif '大雨' in weather: return '雨' elif '中雨' in weather: return '雨' elif '小雨' in weather: return '雨' elif '雷阵雨' in weather: return '雨' elif '雾' in weather: return '雾' else: return '其他' # 将原有的天气类型按照关键字划分,并存进新的 DataFrame 中 new_data = data[['城市', '天气']].copy() new_data['新天气'] = new_data['天气'].apply(classify_weather) # # 按照城市和新天气列进行分组,并计算每一种天气的天数 count_data = new_data.groupby(['城市', '新天气'])['天气'].count().reset_index() # 根据条件筛选出符合要求的行 df1 = count_data.loc[count_data['城市'] == '广州'] df2 = count_data.loc[count_data['城市'] == '河源'] df3 = count_data.loc[count_data['城市'] == '惠州'] df4 = count_data.loc[count_data['城市'] == '深圳'] # 将“天气”列名改为“天数” df5 = df1.rename(columns={'天气': '天数'}) df6 = df2.rename(columns={'天气': '天数'}) df7 = df3.rename(columns={'天气': '天数'}) df8 = df4.rename(columns={'天气': '天数'}) # 输出结果 df5.to_csv('df5.csv',index=False) df6.to_csv('df6.csv',index=False) df7.to_csv('df7.csv',index=False) df8.to_csv('df8.csv',index=False) # 筛选出平均温度等于最高温度和最低温度平均值的数据 file_path = '广-惠-河-深天气.csv' # 请将 'your_file_path.csv' 替换为你的文件路径 # 读取 CSV 文件 data1 = pd.read_csv(file_path) # 将最高温度和最低温度列转换为字符串类型 data1['最高温度'] = data1['最高温度'].astype(str) data1['最低温度'] = data1['最低温度'].astype(str) # 计算平均温度并插入为新的一列 data1['平均温度'] = (data1['最高温度'].str.replace('°', '').astype(int) + data1['最低温度'].str.replace('°', '').astype(int)) / 2 # 将更新后的数据保存到新的 CSV 文件中 output_file = 'output_file.csv' # 新的输出文件路径 data1.to_csv(output_file, index=False) data_AB = data1[(data1['城市'] == '广州') | (data1['城市'] == '深圳') | (data1['城市'] == '河源') | (data1['城市'] == '惠州')] data_AB.to_csv('1.CSV', index=False) print(data_AB) # 将日期转换为月份并赋值给新的列 data_AB[['日期','星期']] = data_AB['日期'].str.split(' ',expand=True,n=1) data_AB['月份'] = pd.to_datetime(data_AB['日期']).dt.month # 按照城市和月份分组,计算每组的平均气温 grouped_AB = data_AB.groupby(['城市', '月份'])['平均温度'].mean().reset_index() # 按照城市和月份排序 grouped_AB = grouped_AB.sort_values(['城市', '月份']) print(grouped_AB) # # 打印结果 # # 筛选出广州和湛江的数据 gz_data = data_AB[data_AB['城市'] == '广州'] hy_data = data_AB[data_AB['城市'] == '河源'] hz_data = data_AB[data_AB['城市'] == '惠州'] sz_data = data_AB[data_AB['城市'] == '深圳'] print("地区筛选") # 提取日期和平均温度数据 x = gz_data['日期'] y1 = gz_data['平均温度'] y2 = hy_data['平均温度'] y3 = hz_data['平均温度'] y4 = sz_data['平均温度'] print("————————BEIGINING————————————————————————————温度获取中————————————————————————————————————————————") #绘制折线图 plt.figure(dpi=500, figsize=(10, 5)) plt.title("广河惠深每日平均温度折线图") plt.plot(x, y1, color='red', label='广州') plt.plot(x, y2, color='blue', label='河源') #plt.plot(x, y3, color='pure', label='惠州') plt.plot(x, y4, color='yellow', label='深圳') # 获取图的坐标信息 coordinates = plt.gca() # 设置x轴每个刻度的间隔天数 xLocator = mpl.ticker.MultipleLocator(30) coordinates.xaxis.set_major_locator(xLocator) # 将日期旋转30° plt.xticks(rotation=30) plt.xticks(fontsize=8) plt.ylabel("温度(℃)") plt.xlabel("日期") plt.legend() plt.savefig("广河惠深每日平均温度折线图.png") plt.rcParams['font.family'] = 'SimSun'#处理乱码 plt.show() #绘制折线图 # plt.rcParams['font.family'] = 'SimSun' # # 读取csv文件并转换为列表格式 # df = pd.read_csv('df5.csv') # data_list = df[['新天气', '天数']].values.tolist() # # data_GZ_HZ_SZ_HY = grouped_AB[ # (grouped_AB['城市'] == '广州') | (grouped_AB['城市'] == '惠州') | (grouped_AB['城市'] == '深圳') | (grouped_AB['城市'] == '河源')] # # # 绘制折线图 # fig, ax = plt.subplots() # for city in ['广州', '惠州', '深圳', '河源']: # ax.plot(data_GZ_HZ_SZ_HY[data_GZ_HZ_SZ_HY['城市'] == city]['月份'], # data_GZ_HZ_SZ_HY[data_GZ_HZ_SZ_HY['城市'] == city]['平均温度'], label=city) # # # 设置图例和标题 # ax.legend() # ax.set_title('广州、惠州、深圳、河源每月气温折线图') # 显示图形 plt.savefig("折线图.png") # import matplotlib.pyplot as plt # 创建一个画布 fig, ax = plt.subplots(figsize=(10, 5)) # 绘制广州各类天气条形图 ax.bar(df5['新天气'], df5['天数'], width=0.2, label='广州') # 绘制惠州各类天气条形图 ax.bar(df7['新天气'], df7['天数'], width=0.2, label='惠州', alpha=0.7) # 绘制河源各类天气条形图 ax.bar(df6['新天气'], df6['天数'], width=0.2, label='河源', alpha=0.7) # 绘制深圳各类天气条形图 ax.bar(df8['新天气'], df8['天数'], width=0.2, label='深圳', alpha=0.7) # 设置图例 ax.legend() # 设置 x 轴标签和标题 ax.set_xlabel('天气类型') ax.set_ylabel('天数') ax.set_title('广州、惠州、河源、深圳各类天气天数对比') # # 显示图表 # plt.show() # import pandas as pd # from pyecharts.charts import Pie # from pyecharts import options as opts # # 读取csv文件并转换为列表格式 # df = pd.read_csv('df6.csv') # data_list = df[['新天气', '天数']].values.tolist() # # 生成饼图 # pie = Pie() # pie.add("", data_list) # pie.set_global_opts(title_opts=opts.TitleOpts(title="广州各类天气天数占比")) # pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}")) # pie.render("pie_chart.html")