泉州未来的天气及特产爬取与预测可视化分析
Python 网络爬虫课程设计要求
用 Python 实现一个面向主题的网络爬虫程序,并完成以下内容:
【要求:】
●每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台。
●课程设计要求独立完成,可以参考网络资源,但不能全盘抄袭,整个设计代码
应有一定的规模(300 行左右)。
●课程设计占总成绩的 60%。
一、选题的背景 (10 分)
通过爬取天气网网站,获取的数据来分析现在在福建泉州地区的天气温度以及一些泉州特产等信息,帮助广大旅行爱好者以此了解泉州地区的未来天气温度和一些特色美食等数据,并提前作出规划和部署。
二、主题式网络爬虫设计方案(10 分)
1、名称:泉州未来的天气及特产爬取与预测可视化分析
2、爬取内容的数据与分析特征
此次爬取的内容数据有:日期,天气温度,美食特产
3、爬虫设计方案
- 通过selenium技术爬取未来30天天气数据;
- 将天气数据保存到本地;
3.读取天气数据中的最高气温和最低气温画出各种可视化图。
三、主题页面的结构特征分析(10 分)
1.主题页面的结构与特征分析
- 顺序结构:先通过selenium爬取天气数据;其次保存数据;最后读取数据进行可视化。
循环结构:在保存数据读取数据可判断时用到了for循环。
2.Htmls 页面解析



3.节点(标签)查找方法与遍历方法
查找方法:find
遍历方法:for循环
四、网络爬虫程序设计(60 分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后,面提供输出结果的截图。
- 数据爬取与采集
from selenium import webdriver
import time
import openpyxl
from openpyxl import load_workbook
from openpyxl import Workbook
#数据可视化
from matplotlib import pyplot as plt
#显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
all_weather = []
date = []
def get_tem():
wd = webdriver.Chrome(r'D:\chromedriver.exe')
wd.implicitly_wait(10)
wd.maximize_window()
wd.get('https://www.tianqi.com/quanzhou/30/')
all_mess = wd.find_elements_by_css_selector('[class="weaul_z"]')
for i in all_mess:
print(i.text)
all_weather.append(i.text)
dates = wd.find_elements_by_css_selector('[class="fl"]')
for i in dates:
print(i.text)
date.append(i.text)
get_tem()#爬取数据



2.对数据进行清洗和处理
#保存数据
wb = Workbook()
sheet = wb.active
condition = []
temp = []
date = date[:30]
for i in range(len(all_weather)):
if i%2 == 0:
condition.append(all_weather[i])
if i%2 != 0:
temp.append(all_weather[i])
sheet.append(['日期','天气','温度'])
for i in range(30):
sheet.cell(i+2,1).value = date[i]
sheet.cell(i+2,2).value = condition[i]
sheet.cell(i+2,3).value = temp[i]
wb.save(r'D:\天气数据爬取与可视化\泉州未来30天天气.xlsx')
print(date)
print(condition)
print(temp)

#读取数据可视化
wb1 = load_workbook(r'D:\天气数据爬取与可视化\泉州未来30天天气.xlsx')
sheet1 = wb1.get_sheet_by_name('Sheet')
rows = sheet1.max_row
columns = sheet1.max_column
print((rows,columns))
x = []
y1 = []
y2 = []
for i in range(2,rows+1):
x.append(sheet1.cell(i,1).value)
y1.append(int(sheet1.cell(i,3).value.replace('℃','').split('~')[0]))
y2.append(int(sheet1.cell(i,3).value.replace('℃','').split('~')[1]))
print(x)
print(y1)
print(y2)
# print(sheet1.cell(2,3).value.replace('℃','').split('~'))
print(len(x))
print(len(y1))
print(len(y2))
3.文本分析(可选):jieba 分词、wordcloud 的分词可视化
4.数据分析与可视化(例如:数据柱形图、直方图、散点图、盒图、分布图)
#画图
fig = plt.figure(dpi=128,figsize=(10,6))
plt.plot(x,y1, c='red',alpha=0.5,label = '最低气温')
plt.plot(x,y2, c='blue',alpha=0.5,label = '最高气温')
# plt.fill_between(x,y1,y2,facecolor='blue',alpha=0.2)
#图表格式
#设置图形格式
plt.title('泉州未来30天天气预报',fontsize=24)
plt.xlabel('日期',fontsize=12)
fig.autofmt_xdate() #绘制斜的日期标签,避免重叠
plt.ylabel('气温',fontsize=12)
plt.tick_params(axis='both',which='major',labelsize=10)
#修改刻度
plt.xticks(x[::1])
#显示折线图
plt.show()

#画高温与低温回归图
plt.figure(figsize=(18.5, 9), dpi=180)
plt.xlabel('高温/℃', size=24)
plt.ylabel('低温/℃', size=24)
plt.title('高温与低温关系回归图', size=36)
sns.regplot(max_d,min_d)
#保存图片
plt.savefig('回归图.png')

#画高温与日期变化关系
plt.figure(figsize=(18.5, 9), dpi=180)
plt.xlabel('日期', size=24)
plt.ylabel('温度/℃', size=24)
plt.title('泉州未来30天日期与最高温度变化关系', size=36)
plt.plot(date,max_d,label='最高温',color='r',marker='*')
plt.xticks(range(30), date, rotation=315)
#显示图例
plt.legend(loc='upper left',borderpad=2,labelspacing=1.2,handlelength=5)
#保存图片
plt.savefig('高温.png')
plt.show()
#画低温与日期变化关系
plt.figure(figsize=(18.5, 9), dpi=180)
plt.xlabel('日期', size=24)
plt.ylabel('温度/℃', size=24)
plt.title('泉州未来30天日期与最低温度变化关系', size=36)
plt.plot(date,min_d,label='最低温',color='b',marker='h')
plt.xticks(range(30), date, rotation=315)
#显示图例
plt.legend(loc='upper left',borderpad=2,labelspacing=1.2,handlelength=5)
#保存图片
plt.savefig('低温.png')
plt.show()


5.根据数据之间的关系,分析两个变量之间的相关系数,画出散点图,并建立变
量之间的回归方程(一元或多元)
#散点图
plt.title('泉州未来30天最高温与最低温散点图',fontsize=20)
plt.xlabel('最高温度',fontsize=12)
plt.ylabel('最低温度',fontsize=12)
plt.scatter(y2,y1,color='purple',linewidth=1)
plt.show()
。

5.数据持久化
#保存数据
wb = Workbook()
sheet = wb.active
condition = []
temp = []
date = date[:30]
for i in range(len(all_weather)):
if i%2 == 0:
condition.append(all_weather[i])
if i%2 != 0:
temp.append(all_weather[i])
sheet.append(['日期','天气','温度'])
for i in range(30):
sheet.cell(i+2,1).value = date[i]
sheet.cell(i+2,2).value = condition[i]
sheet.cell(i+2,3).value = temp[i]
wb.save(r'D:\天气数据爬取与可视化\泉州未来30天天气.xlsx')
print(date)
print(condition)
print(temp)
6.将以上各部分的代码汇总,附上完整程序代码
from selenium import webdriver
import time
import openpyxl
from openpyxl import load_workbook
from openpyxl import Workbook
from pandas import DataFrame
from sklearn import linear_model
import numpy as np
#数据可视化
from matplotlib import pyplot as plt
#显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
all_weather = []
date = []
def get_tem():
wd = webdriver.Chrome(r'D:\chromedriver.exe')
wd.implicitly_wait(10)
wd.maximize_window()
wd.get('https://www.tianqi.com/quanzhou/30/')
all_mess = wd.find_elements_by_css_selector('[class="weaul_z"]')
for i in all_mess:
print(i.text)
all_weather.append(i.text)
dates = wd.find_elements_by_css_selector('[class="fl"]')
for i in dates:
print(i.text)
date.append(i.text)
get_tem()#爬取数据
# 整理数据,获取最高温与最低温
max_d = [int(i.split('~')[1]) for i in temperature]
min_d = [int(i.split('~')[0]) for i in temperature]
#保存数据
wb = Workbook()
sheet = wb.active
condition = []
temp = []
date = date[:30]
for i in range(len(all_weather)):
if i%2 == 0:
condition.append(all_weather[i])
if i%2 != 0:
temp.append(all_weather[i])
sheet.append(['日期','天气','温度'])
for i in range(30):
sheet.cell(i+2,1).value = date[i]
sheet.cell(i+2,2).value = condition[i]
sheet.cell(i+2,3).value = temp[i]
wb.save(r'D:\天气数据爬取与可视化\泉州未来30天天气.xlsx')
#读取数据可视化
wb1 = load_workbook(r'D:\天气数据爬取与可视化\泉州未来30天天气.xlsx')
sheet1 = wb1.get_sheet_by_name('Sheet')
rows = sheet1.max_row
columns = sheet1.max_column
print((rows,columns))
x = []
y1 = []
y2 = []
for i in range(2,rows+1):
x.append(sheet1.cell(i,1).value)
y1.append(int(sheet1.cell(i,3).value.replace('℃','').split('~')[0]))
y2.append(int(sheet1.cell(i,3).value.replace('℃','').split('~')[1]))
print(x)
print(y1)
print(y2)
# print(sheet1.cell(2,3).value.replace('℃','').split('~'))
print(len(x))
print(len(y1))
print(len(y2))
#画图
fig = plt.figure(dpi=128,figsize=(10,6))
plt.plot(x,y1, c='red',alpha=0.5,label = '最低气温')
plt.plot(x,y2, c='blue',alpha=0.5,label = '最高气温')
# plt.fill_between(x,y1,y2,facecolor='blue',alpha=0.2)
#图表格式
#设置图形格式
plt.title('泉州未来30天天气预报',fontsize=24)
plt.xlabel('日期',fontsize=12)
fig.autofmt_xdate() #绘制斜的日期标签,避免重叠
plt.ylabel('气温',fontsize=12)
plt.tick_params(axis='both',which='major',labelsize=10)
#修改刻度
plt.xticks(x[::1])
#显示折线图
plt.show()
#散点图
plt.title('泉州未来30天最高温与最低温散点图',fontsize=20)
plt.xlabel('最高温度',fontsize=12)
plt.ylabel('最低温度',fontsize=12)
plt.scatter(y2,y1,color='purple',linewidth=1)
plt.show()
#画高温与日期变化关系
plt.figure(figsize=(18.5, 9), dpi=180)
plt.xlabel('日期', size=24)
plt.ylabel('温度/℃', size=24)
plt.title('泉州未来30天日期与最高温度变化关系', size=36)
plt.plot(date,max_d,label='最高温',color='r',marker='*')
plt.xticks(range(30), date, rotation=315)
#显示图例
plt.legend(loc='upper left',borderpad=2,labelspacing=1.2,handlelength=5)
#保存图片
plt.savefig('高温.png')
plt.show()
#画低温与日期变化关系
plt.figure(figsize=(18.5, 9), dpi=180)
plt.xlabel('日期', size=24)
plt.ylabel('温度/℃', size=24)
plt.title('泉州未来30天日期与最低温度变化关系', size=36)
plt.plot(date,min_d,label='最低温',color='b',marker='h')
plt.xticks(range(30), date, rotation=315)
#显示图例
plt.legend(loc='upper left',borderpad=2,labelspacing=1.2,handlelength=5)
#保存图片
plt.savefig('低温.png')
plt.show()
#画高温与低温回归图
plt.figure(figsize=(18.5, 9), dpi=180)
plt.xlabel('高温/℃', size=24)
plt.ylabel('低温/℃', size=24)
plt.title('高温与低温关系回归图', size=36)
sns.regplot(max_d,min_d)
#保存图片
plt.savefig('回归图.png')
五、总结(10 分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?是否达到预期的目标?
首先通过selenium爬取天气数据;其次保存数据;再次读取数据进行可视化;最终得到了泉州的未来30天的天气和美食特产。以上是经过对主题数据的分析与可视化得出的四点结论。根据分析达到了预期的目标。
2.在完成此设计过程中,得到哪些收获?以及要改进的建议?
本次网络爬虫课程设计的各个部分都已完成,首先运用selenium库爬取目标网页https://www.tianqi.com/quanzhou/30/的内容;再将所爬取的目标数据做成表格

存储到本地的ipynb文件,实现数据的持久化,可为未来使用和研究减少代码量的修改;再将完整的数据进行清洗,最后通过库对研究对象绘图分析。在完成课程设计中虽然有一些库没有完全安装和运行成功,但是发现了问题也就能及时查缺补漏,让我对Python这门语言有了更深的理解,让自己的实操能力能到提升和改进,也从中取得了不少经验。相信以后会更加得心应手。

浙公网安备 33010602011771号