Python实战项目:天气数据爬取+数据可视化(完整代码)_python爬虫实战

news/2024/9/19 17:40:28/ 标签: 信息可视化, python, 爬虫

在这里插入图片描述


一、选题的背景

二、主题式网络爬虫设计方案

①主题式网络爬虫名称:天气预报爬取数据与可视化数据
②主题式网络爬虫爬取的内容与数据特征分析:
③爬取内容:天气预报网站上的历史天气数据 包括(日期,最高温度,最低温度,天气,风向)等信息
④数据特征分析:时效性,完整性,结构化,可预测性等特性
⑤主题式网络爬虫设计方案概述

  • 实现思路:本次设计方案首先分析网站页面主要使用requests爬虫程序,实现网页的请求、解析、过滤、存储等,通过pandas库对数据进行分析和数据可视化处理。
  • 该过程遇到的难点:动态加载、反爬虫、导致爬虫难以获取和解析数据,数据可视化的效果和美观性

三、主题页面的结构特征分析

在这里插入图片描述

(1) 导航栏位于界面顶部

(2) 右侧热门城市历史天气

(3) 中间是内容区海口气温走势图以及风向统计

(4) 页面底部是网站信息和网站服务

2. Htmls 页面解析

class="tianqi_pub_nav_box"顶部导航栏

class="tianqi_pub_nav_box"右侧热门城市历史天气

3.节点(标签)查找方法与遍历方法

for循环迭代遍历

温馨提示:篇幅有限,完整代码已打包文件夹,获取方式在:
在这里插入图片描述


四、网络爬虫程序设计

数据来源:查看天气网:http://www.tianqi.com.cn。访问海口市的历史天气网址:https://lishi.tianqi.com/haikou/202311.html,利用Python的爬虫技术从网站上爬取东莞市2023-11月历史天气数据信息。

Part1: 爬取天气网历海口史天气数据并保存未:"海口历史天气【2023年11月】.xls"文件


在这里插入图片描述

  1 import requests  2 from lxml import etree  3 import xlrd, xlwt, os  4 from xlutils.copy import copy  5 6 class TianQi():  7     def \_\_init\_\_(self):8         pass9 10     #爬虫部分11     def spider(self): 12         city\_dict = { 13             "海口": "haikou"14 }15         city = '海口'16         city = city\_dict\[f'{city}'\]17         year = '2023'18         month = '11'19         start\_url = f'https://lishi.tianqi.com/{city}/{year}{month}.html'20         headers = { 21             'authority': 'lishi.tianqi.com',22             'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,\*/\*;q=0.8,application/signed-exchange;v=b3;q=0.7',23             'accept-language': 'zh-CN,zh;q=0.9',24             'cache-control': 'no-cache',25             # Requests sorts cookies= alphabetically26             'cookie': 'Hm\_lvt\_7c50c7060f1f743bccf8c150a646e90a=1701184759; Hm\_lvt\_30606b57e40fddacb2c26d2b789efbcb=1701184793; Hm\_lpvt\_30606b57e40fddacb2c26d2b789efbcb=1701184932; Hm\_lpvt\_7c50c7060f1f743bccf8c150a646e90a=1701185017',27             'pragma': 'no-cache',28             'referer': 'https://lishi.tianqi.com/ankang/202309.html',29             'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A\_Brand";v="24"',30             'sec-ch-ua-mobile': '?0',31             'sec-ch-ua-platform': '"Windows"',32             'sec-fetch-dest': 'document',33             'sec-fetch-mode': 'navigate',34             'sec-fetch-site': 'same-origin',35             'sec-fetch-user': '?1',36             'upgrade-insecure-requests': '1',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',38         }39         response = requests.get(start\_url,headers=headers).text40         tree = etree.HTML(response) 41         datas = tree.xpath("/html/body/div\[@class='main clearfix'\]/div\[@class='main\_left inleft'\]/div\[@class='tian\_three'\]/ul\[@class='thrui'\]/li")42         weizhi = tree.xpath("/html/body/div\[@class='main clearfix'\]/div\[@class='main\_left inleft'\]/div\[@class='inleft\_tian'\]/div\[@class='tian\_one'\]/div\[@class='flex'\]\[1\]/h3/text()")\[0\]43         self.parase(datas,weizhi,year,month)44 45 46    #解析部分47     def parase(self,datas,weizhi,year,month): 48         for data in datas: 49             #1、日期50             datetime = data.xpath("./div\[@class='th200'\]/text()")\[0\]51             #2、最高气温52             max\_qiwen = data.xpath("./div\[@class='th140'\]\[1\]/text()")\[0\]53             #3、最低气温54             min\_qiwen = data.xpath("./div\[@class='th140'\]\[2\]/text()")\[0\]55             #4、天气56             tianqi = data.xpath("./div\[@class='th140'\]\[3\]/text()")\[0\]57             #5、风向58             fengxiang = data.xpath("./div\[@class='th140'\]\[4\]/text()")\[0\]59             dict\_tianqi = { 60                 '日期':datetime,61                 '最高气温':max\_qiwen,62                 '最低气温':min\_qiwen,63                 '天气':tianqi,64                 '风向':fengxiang65             }66             data\_excel = { 67                 f'{weizhi}【{year}年{month}月】':\[datetime,max\_qiwen,min\_qiwen,tianqi,fengxiang\]68             }69             self.chucun\_excel(data\_excel,weizhi,year,month)70             print(dict\_tianqi)71 72 73    #储存部分74     def chucun\_excel(self, data,weizhi,year,month): 75         if not os.path.exists(f'{weizhi}【{year}年{month}月】.xls'):76             # 1、创建 Excel 文件77             wb = xlwt.Workbook(encoding='utf-8')78             # 2、创建新的 Sheet 表79             sheet = wb.add\_sheet(f'{weizhi}【{year}年{month}月】', cell\_overwrite\_ok=True)80             # 3、设置 Borders边框样式81             borders = xlwt.Borders() 82             borders.left = xlwt.Borders.THIN 83             borders.right = xlwt.Borders.THIN 84             borders.top = xlwt.Borders.THIN 85             borders.bottom = xlwt.Borders.THIN 86             borders.left\_colour = 0x4087             borders.right\_colour = 0x4088             borders.top\_colour = 0x4089             borders.bottom\_colour = 0x4090             style = xlwt.XFStyle()  # Create Style91             style.borders = borders  # Add Borders to Style92             # 4、写入时居中设置93             align = xlwt.Alignment() 94             align.horz = 0x02  # 水平居中95             align.vert = 0x01  # 垂直居中96             style.alignment = align 97             # 5、设置表头信息, 遍历写入数据, 保存数据98             header = ( 99                 '日期', '最高气温', '最低气温', '天气', '风向')
100             for i in range(0, len(header)):
101                 sheet.col(i).width = 2560 \* 3
102                 #行,列, 内容,   样式
103 sheet.write(0, i, header\[i\], style)
104                 wb.save(f'{weizhi}【{year}年{month}月】.xls')
105         # 判断工作表是否存在
106         if os.path.exists(f'{weizhi}【{year}年{month}月】.xls'):
107             # 打开工作薄
108             wb = xlrd.open\_workbook(f'{weizhi}【{year}年{month}月】.xls')
109             # 获取工作薄中所有表的个数
110             sheets = wb.sheet\_names()
111             for i in range(len(sheets)):
112                 for name in data.keys():
113                     worksheet = wb.sheet\_by\_name(sheets\[i\])
114                     # 获取工作薄中所有表中的表名与数据名对比
115                     if worksheet.name == name:
116                         # 获取表中已存在的行数
117                         rows\_old = worksheet.nrows
118                         # 将xlrd对象拷贝转化为xlwt对象
119                         new\_workbook = copy(wb)
120                         # 获取转化后的工作薄中的第i张表
121                         new\_worksheet = new\_workbook.get\_sheet(i)
122                         for num in range(0, len(data\[name\])):
123 new\_worksheet.write(rows\_old, num, data\[name\]\[num\])
124                         new\_workbook.save(f'{weizhi}【{year}年{month}月】.xls')
125 
126 if \_\_name\_\_ == '\_\_main\_\_':
127     t=TianQi()
128     t.spider()

Part2:根据海口历史天气【2023年11月】.xls生成海口市天气分布图
在这里插入图片描述

1 import pandas as pd2 from pyecharts.charts import Pie 3 from pyecharts import options as opts 4 from pyecharts.globals import ThemeType 5 6 def on(gender\_counts): 7     total = gender\_counts.sum() 8     percentages = {gender: count / total \* 100 for gender, count in gender\_counts.items()} 9     analysis\_parts = \[\]
10     for gender, percentage in percentages.items():
11         analysis\_parts.append(f"{gender}天气占比为{percentage:.2f}%,")
12     analysis\_report = "天气比例饼状图显示," + ''.join(analysis\_parts)
13     return analysis\_report
14 
15 df = pd.read\_excel("海口历史天气【2023年11月】.xls")
16 gender\_counts = df\['天气'\].value\_counts()
17 analysis\_text = on(gender\_counts)
18 pie = Pie(init\_opts=opts.InitOpts(theme=ThemeType.WESTEROS,bg\_color='#e4cf8e'))
19 
20 pie.add(
21     series\_name="海口市天气分布",
22     data\_pair=\[list(z) for z in zip(gender\_counts.index.tolist(), gender\_counts.values.tolist())\],
23     radius=\["40%", "70%"\],
24     rosetype="radius",
25     label\_opts=opts.LabelOpts(is\_show=True, position="outside", font\_size=14,
26                               formatter="{a}<br/>{b}: {c} ({d}%)")
27 )
28 pie.set\_global\_opts(
29     title\_opts=opts.TitleOpts(title="海口市11月份天气分布",pos\_right="50%"),
30     legend\_opts=opts.LegendOpts(orient="vertical", pos\_top="15%", pos\_left="2%"),
31     toolbox\_opts=opts.ToolboxOpts(is\_show=True)
32 )
33 pie.set\_series\_opts(label\_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)"))
34 html\_content = pie.render\_embed()
35 
36 # 生成HTML文件
37 complete\_html = f"""
38 <html>
39 <head>
40 <title>天气数据分析</title>
41 
42 </head>
43 <body style="background-color: #e87f7f">
44 <div style='margin-top: 20px;background-color='#e87f7f''>
45 <div>{html\_content}</div>
46 <h3>分析报告:</h3>
47 <p>{analysis\_text}</p>
48 </div>
49 </body>
50 </html>
51 """  
52 # 保存到HTML文件
53 with open("海口历史天气【2023年11月】饼图可视化.html", "w", encoding="utf-8") as file:
54     file.write(complete\_html)

Part3:根据海口历史天气【2023年11月】.xls生成海口市温度趋势
在这里插入图片描述

 1 import pandas as pd 2 import matplotlib.pyplot as plt 3 from matplotlib import font\_manager 4 import jieba 5 6 # 中文字体7 font\_CN = font\_manager.FontProperties(fname="C:\\Windows\\Fonts\\STKAITI.TTF")8 9 # 读取数据
10 df = pd.read\_excel('海口历史天气【2023年11月】.xls')
11 
12 # 使用 jieba 处理数据,去除 "C"
13 df\['最高气温'\] = df\['最高气温'\].apply(lambda x: ''.join(jieba.cut(x))).str.replace('℃', '').astype(float)
14 df\['最低气温'\] = df\['最低气温'\].apply(lambda x: ''.join(jieba.cut(x))).str.replace('℃', '').astype(float)
15 # 开始绘图
16 plt.figure(figsize=(20, 8), dpi=80)
17 max\_tp = df\['最高气温'\].tolist()
18 min\_tp = df\['最低气温'\].tolist()
19 x\_day = range(1, 31)
20 # 绘制30天最高气温
21 plt.plot(x\_day, max\_tp, label = "最高气温", color = "red")
22 # 绘制30天最低气温
23 plt.plot(x\_day, min\_tp, label = "最低气温", color = "skyblue")
24 # 增加x轴刻度
25 \_xtick\_label = \["11月{}日".format(i) for i in x\_day\]
26 plt.xticks(x\_day, \_xtick\_label, fontproperties=font\_CN, rotation=45)
27 # 添加标题
28 plt.title("2023年11月最高气温与最低气温趋势", fontproperties=font\_CN)
29 plt.xlabel("日期", fontproperties=font\_CN)
30 plt.ylabel("温度(单位°C)", fontproperties=font\_CN)
31 plt.legend(prop = font\_CN)
32 plt.show()

Part4:根据海口历史天气【2023年11月】.xls生成海口市词汇图
在这里插入图片描述

1 from pyecharts.charts import WordCloud 2 from pyecharts import options as opts 3 from pyecharts.globals import SymbolType 4 import jieba 5 import pandas as pd 6 from collections import Counter 7 8 # 读取Excel文件9 df = pd.read\_excel('海口历史天气【2023年11月】.xls')
10 # 提取商品名
11 word\_names = df\["风向"\].tolist() + df\["天气"\].tolist()
12 # 提取关键字
13 seg\_list = \[jieba.lcut(text) for text in word\_names\]
14 words = \[word for seg in seg\_list for word in seg if len(word) > 1\]
15 word\_counts = Counter(words)
16 word\_cloud\_data = \[(word, count) for word, count in word\_counts.items()\]
17 
18 # 创建词云图
19 wordcloud = (
20     WordCloud(init\_opts=opts.InitOpts(bg\_color='#00FFFF'))
21         .add("", word\_cloud\_data, word\_size\_range=\[20, 100\], shape=SymbolType.DIAMOND,
22              word\_gap=5, rotate\_step=45,
23              textstyle\_opts=opts.TextStyleOpts(font\_family='cursive', font\_size=15))
24         .set\_global\_opts(title\_opts=opts.TitleOpts(title="天气预报词云图",pos\_top="5%", pos\_left="center"),
25                          toolbox\_opts=opts.ToolboxOpts(
26                              is\_show=True,
27                              feature={
28                                  "saveAsImage": {},
29                                  "dataView": {},
30                                  "restore": {},
31                                  "refresh": {}
32 }
33 )
34 
35 )
36 )
37 
38 # 渲染词图到HTML文件
39 wordcloud.render("天气预报词云图.html")

爬虫课程设计全部代码如下:
 1 import requests2 from lxml import etree3 import xlrd, xlwt, os4 from xlutils.copy import copy5 6 class TianQi():7     def \_\_init\_\_(self):8         pass9 10     #爬虫部分11     def spider(self):12         city\_dict = {13             "海口": "haikou"14 }15         city = '海口'16         city = city\_dict\[f'{city}'\]17         year = '2023'18         month = '11'19         start\_url = f'https://lishi.tianqi.com/{city}/{year}{month}.html'20         headers = {21             'authority': 'lishi.tianqi.com',22             'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,\*/\*;q=0.8,application/signed-exchange;v=b3;q=0.7',23             'accept-language': 'zh-CN,zh;q=0.9',24             'cache-control': 'no-cache',25             # Requests sorts cookies= alphabetically26             'cookie': 'Hm\_lvt\_7c50c7060f1f743bccf8c150a646e90a=1701184759; Hm\_lvt\_30606b57e40fddacb2c26d2b789efbcb=1701184793; Hm\_lpvt\_30606b57e40fddacb2c26d2b789efbcb=1701184932; Hm\_lpvt\_7c50c7060f1f743bccf8c150a646e90a=1701185017',27             'pragma': 'no-cache',28             'referer': 'https://lishi.tianqi.com/ankang/202309.html',29             'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A\_Brand";v="24"',30             'sec-ch-ua-mobile': '?0',31             'sec-ch-ua-platform': '"Windows"',32             'sec-fetch-dest': 'document',33             'sec-fetch-mode': 'navigate',34             'sec-fetch-site': 'same-origin',35             'sec-fetch-user': '?1',36             'upgrade-insecure-requests': '1',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',38         }39         response = requests.get(start\_url,headers=headers).text40         tree = etree.HTML(response)41         datas = tree.xpath("/html/body/div\[@class='main clearfix'\]/div\[@class='main\_left inleft'\]/div\[@class='tian\_three'\]/ul\[@class='thrui'\]/li")42         weizhi = tree.xpath("/html/body/div\[@class='main clearfix'\]/div\[@class='main\_left inleft'\]/div\[@class='inleft\_tian'\]/div\[@class='tian\_one'\]/div\[@class='flex'\]\[1\]/h3/text()")\[0\]43         self.parase(datas,weizhi,year,month)44 45 46    #解析部分47     def parase(self,datas,weizhi,year,month):48         for data in datas:49             #1、日期50             datetime = data.xpath("./div\[@class='th200'\]/text()")\[0\]51             #2、最高气温52             max\_qiwen = data.xpath("./div\[@class='th140'\]\[1\]/text()")\[0\]53             #3、最低气温54             min\_qiwen = data.xpath("./div\[@class='th140'\]\[2\]/text()")\[0\]55             #4、天气56             tianqi = data.xpath("./div\[@class='th140'\]\[3\]/text()")\[0\]57             #5、风向58             fengxiang = data.xpath("./div\[@class='th140'\]\[4\]/text()")\[0\]59             dict\_tianqi = {60                 '日期':datetime,61                 '最高气温':max\_qiwen,62                 '最低气温':min\_qiwen,63                 '天气':tianqi,64                 '风向':fengxiang65             }66             data\_excel = {67                 f'{weizhi}【{year}年{month}月】':\[datetime,max\_qiwen,min\_qiwen,tianqi,fengxiang\]68             }69             self.chucun\_excel(data\_excel,weizhi,year,month)70             print(dict\_tianqi)71 72 73    #储存部分74     def chucun\_excel(self, data,weizhi,year,month):75         if not os.path.exists(f'{weizhi}【{year}年{month}月】.xls'):76             # 1、创建 Excel 文件77             wb = xlwt.Workbook(encoding='utf-8')78             # 2、创建新的 Sheet 表79             sheet = wb.add\_sheet(f'{weizhi}【{year}年{month}月】', cell\_overwrite\_ok=True)80             # 3、设置 Borders边框样式81             borders = xlwt.Borders()82             borders.left = xlwt.Borders.THIN83             borders.right = xlwt.Borders.THIN84             borders.top = xlwt.Borders.THIN85             borders.bottom = xlwt.Borders.THIN86             borders.left\_colour = 0x4087             borders.right\_colour = 0x4088             borders.top\_colour = 0x4089             borders.bottom\_colour = 0x4090             style = xlwt.XFStyle()  # Create Style91             style.borders = borders  # Add Borders to Style92             # 4、写入时居中设置93             align = xlwt.Alignment()94             align.horz = 0x02  # 水平居中95             align.vert = 0x01  # 垂直居中96             style.alignment = align97             # 5、设置表头信息, 遍历写入数据, 保存数据98             header = (99                 '日期', '最高气温', '最低气温', '天气', '风向')
100             for i in range(0, len(header)):
101                 sheet.col(i).width = 2560 \* 3
102                 #           行,列, 内容,   样式
103                 sheet.write(0, i, header\[i\], style)
104                 wb.save(f'{weizhi}【{year}年{month}月】.xls')
105         # 判断工作表是否存在
106         if os.path.exists(f'{weizhi}【{year}年{month}月】.xls'):
107             # 打开工作薄
108             wb = xlrd.open\_workbook(f'{weizhi}【{year}年{month}月】.xls')
109             # 获取工作薄中所有表的个数
110             sheets = wb.sheet\_names()
111             for i in range(len(sheets)):
112                 for name in data.keys():
113                     worksheet = wb.sheet\_by\_name(sheets\[i\])
114                     # 获取工作薄中所有表中的表名与数据名对比
115                     if worksheet.name == name:
116                         # 获取表中已存在的行数
117                         rows\_old = worksheet.nrows
118                         # 将xlrd对象拷贝转化为xlwt对象
119                         new\_workbook = copy(wb)
120                         # 获取转化后的工作薄中的第i张表
121                         new\_worksheet = new\_workbook.get\_sheet(i)
122                         for num in range(0, len(data\[name\])):
123                             new\_worksheet.write(rows\_old, num, data\[name\]\[num\])
124                         new\_workbook.save(f'{weizhi}【{year}年{month}月】.xls')
125 
126 if \_\_name\_\_ == '\_\_main\_\_':
127     t=TianQi()
128     t.spider()
129 import pandas as pd
130 import jieba
131 from pyecharts.charts import Scatter
132 from pyecharts import options as opts
133 
134 from scipy import stats
135 
136 # 读取数据
137 df = pd.read\_excel('海口历史天气【2023年11月】.xls')
138 
139 # 使用 jieba 处理数据,去除 "C"
140 df\['最高气温'\] = df\['最高气温'\].apply(lambda x: ''.join(jieba.cut(x))).str.replace('℃', '').astype(float)
141 df\['最低气温'\] = df\['最低气温'\].apply(lambda x: ''.join(jieba.cut(x))).str.replace('℃', '').astype(float)
142 
143 # 创建散点图
144 scatter = Scatter()
145 scatter.add\_xaxis(df\['最低气温'\].tolist())
146 scatter.add\_yaxis("最高气温", df\['最高气温'\].tolist())
147 scatter.set\_global\_opts(title\_opts=opts.TitleOpts(title="最低气温与最高气温的散点图"))
148 html\_content = scatter.render\_embed()
149 
150 # 计算回归方程
151 slope, intercept, r\_value, p\_value, std\_err = stats.linregress(df\['最低气温'\], df\['最高气温'\])
152 
153 print(f"回归方程为:y = {slope}x + {intercept}")
154 
155 analysis\_text = f"回归方程为:y = {slope}x + {intercept}"
156 # 生成HTML文件
157 complete\_html = f"""
158 <html>
159 <head>
160     <title>天气数据分析</title>
161 </head>
162 <body style="background-color: #e87f7f">
163     <div style='margin-top: 20px;background-color='#e87f7f''>
164         <div>{html\_content}</div>
165         <p>{analysis\_text}</p>
166     </div>
167 </body>
168 </html>
169 """
170 # 保存到HTML文件
171 with open("海口历史天气【2023年11月】散点可视化.html", "w", encoding="utf-8") as file:
172     file.write(complete\_html)
173 
174 import pandas as pd
175 from flatbuffers.builder import np
176 from matplotlib import pyplot as plt
177 from pyecharts.charts import Pie
178 from pyecharts import options as opts
179 from pyecharts.globals import ThemeType
180 
181 def on(gender\_counts):
182     total = gender\_counts.sum()
183     percentages = {gender: count / total \* 100 for gender, count in gender\_counts.items()}
184     analysis\_parts = \[\]
185     for gender, percentage in percentages.items():
186         analysis\_parts.append(f"{gender}天气占比为{percentage:.2f}%,")
187     analysis\_report = "天气比例饼状图显示," + ''.join(analysis\_parts)
188     return analysis\_report
189 
190 df = pd.read\_excel("海口历史天气【2023年11月】.xls")
191 gender\_counts = df\['天气'\].value\_counts()
192 analysis\_text = on(gender\_counts)
193 pie = Pie(init\_opts=opts.InitOpts(theme=ThemeType.WESTEROS,bg\_color='#e4cf8e'))
194 pie.add(
195     series\_name="海口市天气分布",
196     data\_pair=\[list(z) for z in zip(gender\_counts.index.tolist(), gender\_counts.values.tolist())\],
197     radius=\["40%", "70%"\],
198     rosetype="radius",
199     label\_opts=opts.LabelOpts(is\_show=True, position="outside", font\_size=14,
200                               formatter="{a}<br/>{b}: {c} ({d}%)")
201 )
202 pie.set\_global\_opts(
203     title\_opts=opts.TitleOpts(title="海口市11月份天气分布",pos\_right="50%"),
204     legend\_opts=opts.LegendOpts(orient="vertical", pos\_top="15%", pos\_left="2%"),
205     toolbox\_opts=opts.ToolboxOpts(is\_show=True)
206 )
207 pie.set\_series\_opts(label\_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)"))
208 html\_content = pie.render\_embed()
209 
210 # 生成HTML文件
211 complete\_html = f"""
212 <html>
213 <head>
214     <title>天气数据分析</title>
215 
216 </head>
217 <body style="background-color: #e87f7f">
218     <div style='margin-top: 20px;background-color='#e87f7f''>
219         <div>{html\_content}</div>
220         <h3>分析报告:</h3>
221         <p>{analysis\_text}</p>
222     </div>
223 </body>
224 </html>
225 """
226 
227 import pandas as pd
228 import matplotlib.pyplot as plt
229 from matplotlib import font\_manager
230 import jieba
231 
232 # 中文字体
233 font\_CN = font\_manager.FontProperties(fname="C:\\Windows\\Fonts\\STKAITI.TTF")
234 
235 # 读取数据
236 df = pd.read\_excel('海口历史天气【2023年11月】.xls')
237 
238 # 使用 jieba 处理数据,去除 "C"
239 df\['最高气温'\] = df\['最高气温'\].apply(lambda x: ''.join(jieba.cut(x))).str.replace('℃', '').astype(float)
240 df\['最低气温'\] = df\['最低气温'\].apply(lambda x: ''.join(jieba.cut(x))).str.replace('℃', '').astype(float)
241 # 开始绘图
242 plt.figure(figsize=(20, 8), dpi=80)
243 max\_tp = df\['最高气温'\].tolist()
244 min\_tp = df\['最低气温'\].tolist()
245 x\_day = range(1, 31)
246 # 绘制30天最高气温
247 plt.plot(x\_day, max\_tp, label = "最高气温", color = "red")
248 # 绘制30天最低气温
249 plt.plot(x\_day, min\_tp, label = "最低气温", color = "skyblue")
250 # 增加x轴刻度
251 \_xtick\_label = \["11月{}日".format(i) for i in x\_day\]
252 plt.xticks(x\_day, \_xtick\_label, fontproperties=font\_CN, rotation=45)
253 # 添加标题
254 plt.title("2023年11月最高气温与最低气温趋势", fontproperties=font\_CN)
255 plt.xlabel("日期", fontproperties=font\_CN)
256 plt.ylabel("温度(单位°C)", fontproperties=font\_CN)
257 plt.legend(prop = font\_CN)
258 plt.show()
259 
260 from pyecharts.charts import WordCloud
261 from pyecharts import options as opts
262 from pyecharts.globals import SymbolType
263 import jieba
264 import pandas as pd
265 from collections import Counter
266 
267 # 读取Excel文件
268 df = pd.read\_excel('海口历史天气【2023年11月】.xls')
269 # 提取商品名
270 word\_names = df\["风向"\].tolist() + df\["天气"\].tolist()
271 # 提取关键字
272 seg\_list = \[jieba.lcut(text) for text in word\_names\]
273 words = \[word for seg in seg\_list for word in seg if len(word) > 1\]
274 word\_counts = Counter(words)
275 word\_cloud\_data = \[(word, count) for word, count in word\_counts.items()\]
276 
277 # 创建词云图
278 wordcloud = (
279     WordCloud(init\_opts=opts.InitOpts(bg\_color='#00FFFF'))
280         .add("", word\_cloud\_data, word\_size\_range=\[20, 100\], shape=SymbolType.DIAMOND,
281              word\_gap=5, rotate\_step=45,
282              textstyle\_opts=opts.TextStyleOpts(font\_family='cursive', font\_size=15))
283         .set\_global\_opts(title\_opts=opts.TitleOpts(title="天气预报词云图",pos\_top="5%", pos\_left="center"),
284                          toolbox\_opts=opts.ToolboxOpts(
285                              is\_show=True,
286                              feature={
287                                  "saveAsImage": {},
288                                  "dataView": {},
289                                  "restore": {},
290                                  "refresh": {}
291                              }
292                          )
293 
294     )
295 )
296 
297 # 渲染词图到HTML文件
298 wordcloud.render("天气预报词云图.html")

五、总结

1.根据散点图的显示回归方:y = 0.6988742964352719x + 10.877423389618516来获取海口市11月份温度趋势
2.根据饼状图可以了解海口市11月份的天气比例,多云天气占比为53.33%,晴天气占比为26.67%,阴天气占比为13.33%,小雨天气占比为6.67%,
3.根据折线图了解海口市11月份的最高温度和最低温度趋势。
4.根据词云图的显示,可以了解当月的天气质量相关内容。

  • 综述:是通过Python爬虫技术获取天气预报数据,_数据爬取方面,通过Python编写爬虫程序,利用网络爬虫技术从天气网站上获取天气预报数据,并进行数据清洗和处理。_数据可视化方面,利用数据可视化工具,将存储的数据进行可视化展示,以便用户更直观地了解天气情况_因此用户更好地理解和应用天气数据,从而做出更准确的决策和规划。____

在这里插入图片描述


http://www.ppmy.cn/news/1520903.html

相关文章

VXLAN 为何采用UDP

VXLAN 简介 VXLAN是一种网络虚拟化技术&#xff0c;它通过在UDP数据包中封装MAC地址和IP信息&#xff0c;使得二层网络&#xff08;如以太网&#xff09;能够跨越三层网络&#xff08;如IP网络&#xff09;进行扩展。这种封装方式不仅支持TCP流量的传输&#xff0c;还能有效处…

网络通讯安全基础知识(加密+解密+验签+证书)

1、加密解密基本概念 通讯的加密和解密‌主要涉及将原始信息&#xff08;明文&#xff09;转换为不可直接理解的格式&#xff08;密文&#xff09;&#xff0c;以及将密文还原为原始信息的过程。这一过程通常包括三个基本步骤&#xff1a;加密、传输和解密&#xff0c;其中加密…

Python数据结构类型总结

文章目录 Dictionaries, Maps, and Hash Tablesdict:标准字典collections.OrderedDict: 记住键的插入顺序collections.defaultdict: 返回缺失键的默认值collections.ChainMap:将多个词典作为单个映射进行搜索types.MappingProxyType: 制作只读字典的封装器wrapper Array Data S…

C++---基础概念

1 命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存 在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c; 以避免命名冲突或名字污染&#xff0c;n…

鸿蒙开发基础知识 第二篇【页面布局】

鸿蒙开发基础知识 第二篇 1. 两端对齐 demo 2.交叉轴对齐方式 demo 3.列表项布局 demo 4.自适应伸缩布局 demo 自行练习 5.弹性布局 flex 换行布局 demo 案例 更多鸿蒙技能知识与案例 我已经整理到下面了 ↓↓↓ 快去看那看吧&#xff01; 点击下方↓↓↓↓↓↓↓…

奇偶校验、crc循环冗余检验

数据链路层 链路 从一个结点到相邻结点的一段物理线路&#xff0c;而中间没有任何其他的交换点 数据链路 是指把实现通信协议的硬件和软件加到链路上 帧 在数据链路上传输的数据包&#xff0c;称之为帧 数据链路层是以帧为单位进行传输和处理数据的 数据链路层的三个重…

持续改进的艺术:MySQL数据备份策略的优化之路

在快速变化的信息技术领域&#xff0c;数据备份策略的持续改进对于确保企业数据的安全性和可用性至关重要。MySQL作为流行的数据库管理系统&#xff0c;提供了多种工具和特性来支持数据备份。然而&#xff0c;随着业务需求的增长和技术环境的变化&#xff0c;定期评估和优化数据…

MFC的控件无法触发事件函数(ON_COMMAND_RANGE的映射范围冲突)

如果你在MFC中使用ON_COMMAND_RANGE为多个控件绑定了同一个函数&#xff0c;如果使用不当&#xff0c;可能会造成某些控件无法映射或错误映射到对应的事件函数 错误原因&#xff1a; 如下图&#xff0c;假设为所使用的两个ON_COMMAND_RANGE和一个ON_BN_CLICKED&#xff0c;从I…

github源码指引:共享内存、数据结构与算法:平衡二叉树set

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 相关专题&#xff1a;共享内存…

代码随想录算法训练营第五十九天 | 图论part09

47. 参加科学大会 使用邻接表和堆来优化dijkstra算法。原来的时间复杂度是 O ( n 2 ) O(n^2) O(n2)&#xff0c;n是节点数量。 使用堆优化&#xff0c;从宏观角度来说就是将每条边都加入堆&#xff0c;一共是E条边&#xff0c;每次操作的时间复杂度是 l o g ( E ) log(E) log(…

RISC-V (八)定时器中断

​​​​​​​riscv中断的分类 Core local INTerrupt: CLINT CLINT编程接口-寄存器 mtime寄存器&#xff0c;由中断触发的时钟&#xff0c;按照固定频率计数。

webpack--处理资源

在webpack.config.js中进行配置 const path require(path) module.exports {// 入口entry: ./src/main.js,// 输出output: {// 文件的输出路径path: path.resolve(__dirname, dist),// 入口文件打包输出的文件名filename: js/main.js,// 自动清空上次打包结果 原理&#xff…

【论文阅读】为大规模航空图像应用神经辐射场

【论文阅读】为大规模航空图像应用神经辐射场 ABSTRACTI. INTRODUCTIONV. EXPERIMENTSA. Evaluations on the entire datasetsA.1. State-of-the-Art comparisonA.2. Cloud-to-Cloud comparisonA.3. Accuracy and completeness B. Evaluations on the selected regionsB.1. Fi…

力扣62-不同路径(Java详细题解)

题目链接&#xff1a;62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没…

IT服务器安全规范 2024.08

安全配置建议 使用场景场景说明安全配置建议登录密钥服务器登录账号及密钥。建议设置为强密码形式&#xff1a;12位以上&#xff0c;同时包含数字、大小写字母、特殊符号远程登录端口22、3389端口分别用于服务器的Linux和Windows场景下的远程登录&#xff0c;需对这两端口进行安…

docker 安装 rabbitmq

参考文档&#xff1a; https://hub.docker.com/_/rabbitmq/ https://www.rabbitmq.com/docs/download https://www.kuangstudy.com/zl/rabbitmq#1366643532940484610 执行下面的命令 docker run -d -it --name myrabbit -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PA…

GaussDB 24.1.30 分布式3节点命令行方式部署

目录 GaussDB介绍 服务器环境 安装前准备 配置会话不中断 操作系统配置 关闭防火墙并禁止开机启动 设置时区和时间 检查时区和时间 java版本 expect root密码一致 root用户ssh连通性 上传软件包和安装脚本 安装脚本配置 修改 install_cluster.json 配置文件 安装…

鸿蒙系统为什么能安装安卓的APP

鸿蒙系统能够安装安卓的APP&#xff0c;主要得益于其设计理念和技术实现上的几个关键点&#xff1a; 一、设计理念 鸿蒙系统的设计初衷并非完全取代安卓系统&#xff0c;而是与其共存&#xff0c;并建立一个更加广泛的软件生态圈。这一理念体现在鸿蒙系统对安卓应用的兼容性上…

2024.9.3 作业

自己实现栈和队列 代码&#xff1a; /*******************************************/ 文件名&#xff1a;sq.h /*******************************************/ #ifndef SQ_H #define SQ_H #include <iostream> #include<cstring>using namespace std; class …

电路分析 ---- 电平移位电路

1 电平移位电路 如图所示的电平移位电路&#xff0c;用于ADC的前级驱动&#xff0c;它将一个变化范围为-10V ~ 10V的输入信号&#xff0c;线性变化成0.048V ~ 4.048V的信号&#xff0c;以满足ADC的输入范围要求。 2 电路说明 V R E F V_{REF} VREF​为电压基准源&#xff0c…