一.主題式網絡爬蟲設計方案
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.對本次程序設計任務完成的情況做一個簡單的小結。
函數運用不熟練,局部變量變全局變量學習到了,把握住了可視化的規律。