一.主题式网络爬虫设计方案
1.主题式网络爬虫名称:华北天气数据分析
2.主题式网络爬虫爬取的内容:华北天气地点':place,'天气':weather,'风的数据':fen,'最高温度':max_c,'最低温度数据
3.设计方案概述:
实现思路:爬取网站内容,之后分析提取需要的数据,进行数据清洗,之后数据可视化,并计算评分和排名的相关系数
技术难点:爬取时数据过多,网页结构复杂,需要提取的数据特征会略有变化.
二、主题页面的结构特征分析
1.数据爬取
from bs4 import BeautifulSoup import requests import pandas as pd def get_temperature(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} # 设置头文件信息 response = requests.get(url, headers=headers).content # 提交requests get 请求 soup = BeautifulSoup(response, "lxml") # 用Beautifulsoup 进行解析 conmid = soup.find('div', class_='conMidtab') conmid2 = conmid.findAll('div', class_='conMidtab2') ce_name=[] content=[] for info in conmid2: tr_list = info.find_all('tr')[2:] # 使用切片取到第三个tr标签 for index, tr in enumerate(tr_list): # enumerate可以返回元素的位置及内容 td_list = tr.find_all('td') if index == 0: # 取每个标签的text信息,并使用replace()函数将换行符删除 province_name = td_list[0].text.replace('\n', '') city_name = td_list[1].text.replace('\n', '') weather = td_list[5].text.replace('\n', '') wind = td_list[6].text.replace('\n', '') max = td_list[4].text.replace('\n', '') min = td_list[7].text.replace('\n', '') m=[city_name, weather, wind, max, min] ce_name.append(m) else: city_name = td_list[0].text.replace('\n', '') weather = td_list[4].text.replace('\n', '') wind = td_list[5].text.replace('\n', '') max = td_list[3].text.replace('\n', '') min = td_list[6].text.replace('\n', '') q=[city_name, weather, wind, max, min] content.append(q) #print(content) place=[] weather=[] fen=[] max_c=[] min_c=[] for i in content: place.append(i[0]) weather.append(i[1]) fen.append(i[2]) max_c.append(i[3]) min_c.append(i[4]) if __name__=='__main__': urls = 'http://www.weather.com.cn/textFC/hb.shtml' get_temperature(url)
get_temperature(url)
2.数据存入Excel:
#建立文件 file=pd.DataFrame({'地点':place,'天气':weather,'风的数据':fen,'最高温度':max_c,'最低温度':min_c}) #保存文件 file.to_csv('E:/华北天气数据.csv')

3.数据清洗、处理
#读取csv文件
df = pd.DataFrame(pd.read_csv('E:/华北天气数据.csv'))df.head()
#缺失值处理 df.isnull().head() #True为缺失值,False为存在值
#查看统计信息 df.describe()
4.数据可视化
plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文 plt.rcParams['axes.unicode_minus']=False#用来正常显示负号 #绘制条形图 df = pd.read_csv('E:/华北天气数据.csv') x = df['地点'][:5] y = df['最低温度'][:5] plt.xlabel('地点') plt.ylabel('最低温度') plt.bar(x,y) plt.title("华北地区,最低温度条形图") plt.show()
#绘制折线图 df = pd.read_csv('E:/华北天气数据.csv') x = df['地点'][:5] y = df['最低温度'][:5] plt.xlabel('地点') plt.ylabel('最低温度') plt.plot(x,y,color="blue",label="折线") plt.title("华北地区,最低温度折线图") plt.legend() plt.show()
df = pd.read_csv('E:/华北天气数据.csv') 地点 = (df['地点']) 最低温度 = (df['最低温度']) plt.figure(figsize=(6,5)) plt.scatter(地点,最低温度,label=u"样本数据",linewidth=2) plt.title("华北地区,最低温度散点图",color="green") plt.xlabel("地点") plt.ylabel("最低温度") plt.legend() plt.grid() plt.show()
#线性关系散点图 import seaborn as sns df = pd.DataFrame(pd.read_csv('E:/华北天气数据.csv')) x = df['地点'][:5] y = df['最高温度'][:5] sns.lmplot(x="地点",y= "最高温度",data=df) #回归方程曲线图 df = pd.DataFrame(pd.read_csv('E:/华北天气数据.csv')) q = df['地点'] w = df['最高温度'] def func(p,x): a,b,c=p return a*x*x+b*x+c def error_func(p,x,y): return func(p,x)-y p0=[0,0,0] Para=leastsq(error_func,p0,args=(q,w)) a,b,c=Para[0] plt.figure(figsize=(12,6)) plt.scatter(q,w,color="blue",label=u"最高温度散点",linewidth=2) x=np.linspace(0,20,15) y=a*x*x+b*x+c plt.plot(x,y,color="green",label=u"回归方程曲线",linewidth=2) plt.xlabel("地点")[:10] plt.ylabel("最高温度")[:10] plt.title("华北地区,最低温度回归曲线图") plt.legend() plt.show()
ooo代码总结
from bs4 import BeautifulSoup import requests import pandas as pd import seaborn as sns import numpy as np from numpy import genfromtxt import scipy as sp import matplotlib.pyplot as plt from scipy.optimize import leastsq def get_temperature(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} # 设置头文件信息 response = requests.get(url, headers=headers).content # 提交requests get 请求 soup = BeautifulSoup(response, "lxml") # 用Beautifulsoup 进行解析 conmid = soup.find('div', class_='conMidtab') conmid2 = conmid.findAll('div', class_='conMidtab2') ce_name=[] content=[] for info in conmid2: tr_list = info.find_all('tr')[2:] # 使用切片取到第三个tr标签 for index, tr in enumerate(tr_list): # enumerate可以返回元素的位置及内容 td_list = tr.find_all('td') if index == 0: # 取每个标签的text信息,并使用replace()函数将换行符删除 province_name = td_list[0].text.replace('\n', '') city_name = td_list[1].text.replace('\n', '') weather = td_list[5].text.replace('\n', '') wind = td_list[6].text.replace('\n', '') max = td_list[4].text.replace('\n', '') min = td_list[7].text.replace('\n', '') m=[city_name, weather, wind, max, min] ce_name.append(m) else: city_name = td_list[0].text.replace('\n', '') weather = td_list[4].text.replace('\n', '') wind = td_list[5].text.replace('\n', '') max = td_list[3].text.replace('\n', '') min = td_list[6].text.replace('\n', '') q=[city_name, weather, wind, max, min] content.append(q) #print(content) place=[] weather=[] fen=[] max_c=[] min_c=[] for i in content: place.append(i[0]) weather.append(i[1]) fen.append(i[2]) max_c.append(i[3]) min_c.append(i[4]) #'地点','天气','风的数据','最高温度','最低温度' #建立文件 file=pd.DataFrame({'地点':place,'天气':weather,'风的数据':fen,'最高温度':max_c,'最低温度':min_c}) #保存文件 file.to_csv('E:/华北天气数据.csv') if __name__=='__main__': urls = 'http://www.weather.com.cn/textFC/hb.shtml' get_temperature(url) ##读取csv文件数据清洗 df = pd.DataFrame(pd.read_csv('E:/华北天气数据.csv')) print(df) #缺失值处理 df.isnull().head() #True为缺失值,False为存在值 #空值处理# df.isnull().sum() #0表示无空值 #查找重复值 df.duplicated() #显示表示已经删除重复值 #查看统计信息 df.describe() plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文 plt.rcParams['axes.unicode_minus']=False#用来正常显示负号 x = df['地点'][:5] y = df['最低温度'][:5] plt.xlabel('地点') plt.ylabel('最低温度') plt.bar(x,y) plt.title("华北地区,最低温度条形图") plt.show() #绘制折线图 df = pd.read_csv('E:/华北天气数据.csv') x = df['地点'][:5] y = df['最低温度'][:5] plt.xlabel('地点') plt.ylabel('最低温度') plt.plot(x,y,color="blue",label="折线") plt.title("华北地区,最低温度折线图") plt.legend() plt.show() #绘制散点图 df = pd.read_csv('E:/华北天气数据.csv') 地点 = (df['地点']) 最低温度 = (df['最低温度']) plt.figure(figsize=(6,5)) plt.scatter(地点,最低温度,label=u"样本数据",linewidth=2) plt.title("华北地区,最低温度散点图",color="green") plt.xlabel("地点") plt.ylabel("最低温度") plt.legend() plt.grid() plt.show() #线性关系散点图 import seaborn as sns df = pd.DataFrame(pd.read_csv('E:/华北天气数据.csv')) x = df['地点'][:5] y = df['最高温度'][:5] sns.lmplot(x="地点",y= "最高温度",data=df) #回归方程曲线图 df = pd.DataFrame(pd.read_csv('E:/华北天气数据.csv')) q = df['地点'] w = df['最高温度'] def func(p,x): a,b,c=p return a*x*x+b*x+c def error_func(p,x,y): return func(p,x)-y p0=[0,0,0] Para=leastsq(error_func,p0,args=(q,w)) a,b,c=Para[0] plt.figure(figsize=(12,6)) plt.scatter(q,w,color="blue",label=u"最高温度散点",linewidth=2) x=np.linspace(0,20,15) y=a*x*x+b*x+c plt.plot(x,y,color="green",label=u"回归方程曲线",linewidth=2) plt.xlabel("地点") plt.ylabel("最高温度") plt.title("华北地区,最低温度回归曲线图") plt.legend() plt.show()
四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?
数据可以很快收集导入表格中,在以后工作中可以提高工作效率,可视化可以更直观的了解数据间关系,很棒!
2.对本次程序设计任务完成的情况做一个简单的小结。
函数运用不熟练,局部变量变全局变量学习到了,把握住了可视化的规律。