一.主題式網絡爬蟲設計方案
1.主題式網絡爬蟲名稱:爬取藝龍網站泉州酒店信息
2.主題式網絡爬蟲的內容與數據特征分析:爬取藝龍網站泉州酒店的名稱,價格和評分
3.主題式網絡爬蟲設計方案概述(包括實現思路與技術難點):
實現思路:本次設計方案主要使用request庫爬取網頁信息和beautifulSoup庫來提取泉州酒店信息,將其存入Excel文件里,並對其進行數據清理,模型分析和數據可視化。
技術難度:對藝龍網站泉州酒店頁面分析和信息采集以及數據可視化
二.主題頁面的結構特征分析
1.主題'頁面的結構與特征分析:通過HTML頁面的分析我們可以知道每個酒店的信息都在class="h_list"的子標簽中,然后我們所要的信息都在於class="h_info_text"中,接着我們可以利用find_all逐一將需要的信息篩選出來。
2.HTML的頁面解析


三.網絡爬蟲程序設計
1.數據爬取與采集
1 import requests 2 import pandas as pd 3 from bs4 import BeautifulSoup 4 5 url='http://hotel.elong.com/quanzhou/' 6 header = {"User-Agent": "huang"} 7 r = requests.get(url, timeout=30, headers=header) 8 r.raise_for_status() # 產生異常信息 9 r.encoding = r.apparent_encoding # 修改編碼 10 html = r.text 11 soup=BeautifulSoup(html,'html.parser') 12 #創建空列表 13 name=[] 14 level=[] 15 price=[] 16 hotellist=[] 17 18 #酒店名稱 19 for span in soup.find_all("span","info_cn"): 20 name.append(span.string) 21 #酒店評分 22 for i in soup.find_all("i","t20 c37e"): 23 level.append(i.string) 24 #酒店價格 25 for span in soup.find_all("span","h_pri_num"): 26 price.append(span.string) 27 print("{:^60}".format("泉州酒店信息")) 28 print("{:^5}\t{:^20}\t{:^10}\t{:^10}".format("序列","酒店名稱","酒店評分","酒店價格")) 29 #將數據進行整合 30 for i in range(20): 31 print("{:^5}\t{:^20}\t{:^10}\t{:^10}".format(i+1,name[i],level[i],price[i])) 32 hotellist.append([i+1,name[i],level[i],price[i]]) 33 #對數據進行保存 34 df = pd.DataFrame(hotellist,columns = ['序列','酒店名稱','酒店評分','酒店價格']) 35 df.to_excel('藝龍網站泉州酒店信息.xlsx')


2.對數據進行清洗和處理
(1).刪除酒店價格
1 df=pd.read_excel('藝龍網站泉州酒店信息.xlsx') 2 df.drop('酒店名稱',axis=1,inplace=True) #刪除酒店名稱 3 df.head(20)

(2).重復值處理
1 df.duplicated() #重復值處理

(3).空值與缺失值處理
1 a=df['酒店價格'].isnull().value_counts() #檢查是否有空值或缺失值 2 print(a)

(4).異常值處理
1 df.describe() #檢查是否有異常值

3.數據分析與可視化
(1)散點圖
1 #散點圖 2 x = df.酒店價格 3 y = df.酒店評分 4 plt.xlabel("酒店價格") 5 plt.ylabel("酒店評分") 6 plt.scatter(x,y,color="red",label="散點") 7 plt.title("酒店價格與酒店評分的散點圖") 8 plt.legend() 9 plt.show()

(2).柱狀圖(各酒店評分分布)
1 #柱形圖 2 name_list = df.酒店名稱 3 num_list = df.酒店評分 4 plt.barh(range(len(num_list)), num_list,tick_label = name_list) 5 plt.title("各酒店評分分布") 6 plt.show()

(3).直方圖(各酒店價格分布)
1 #直方圖 2 plt.hist(x = df.酒店價格, 3 bins = 20, 4 color = 'steelblue', 5 edgecolor = 'black' 6 ) 7 plt.xlabel('酒店價格') 8 plt.ylabel('酒店個數') 9 plt.title("各酒店價格分布") 10 plt.show()

4.數據之間的關系與相關系數
1 import numpy as np 2 import pandas as pd 3 import seaborn as sns 4 import sklearn 5 df=pd.read_excel('藝龍網站泉州酒店信息.xlsx') 6 df.head(20) 7 from sklearn.linear_model import LinearRegression 8 X=df.drop("酒店名稱",axis=1) 9 predict_model=LinearRegression() 10 predict_model.fit(X,df['酒店價格']) 11 print("回歸系數為:",predict_model.coef_) #判斷相關性 12 sns.regplot(df.酒店價格,df.序列)

5.將代碼匯總,附上完整代碼
1 import requests 2 import pandas as pd 3 from bs4 import BeautifulSoup 4 5 url='http://hotel.elong.com/quanzhou/' 6 header = {"User-Agent": "huang"} 7 r = requests.get(url, timeout=30, headers=header) 8 r.raise_for_status() # 產生異常信息 9 r.encoding = r.apparent_encoding # 修改編碼 10 html = r.text 11 soup=BeautifulSoup(html,'html.parser') 12 #創建空列表 13 name=[] 14 level=[] 15 price=[] 16 hotellist=[] 17 18 #酒店名稱 19 for span in soup.find_all("span","info_cn"): 20 name.append(span.string) 21 #酒店評分 22 for i in soup.find_all("i","t20 c37e"): 23 level.append(i.string) 24 #酒店價格 25 for span in soup.find_all("span","h_pri_num"): 26 price.append(span.string) 27 print("{:^60}".format("泉州酒店信息")) 28 print("{:^5}\t{:^20}\t{:^10}\t{:^10}".format("序列","酒店名稱","酒店評分","酒店價格")) 29 #將數據進行整合 30 for i in range(20): 31 print("{:^5}\t{:^20}\t{:^10}\t{:^10}".format(i+1,name[i],level[i],price[i])) 32 hotellist.append([i+1,name[i],level[i],price[i]]) 33 #對數據進行保存 34 df = pd.DataFrame(hotellist,columns = ['序列','酒店名稱','酒店評分','酒店價格']) 35 df.to_excel('藝龍網站泉州酒店信息.xlsx') 36 #對數據進行讀取 37 import pandas as pd 38 df=pd.read_excel('藝龍網站泉州酒店信息.xlsx') 39 print(df) 40 #對數據進行清洗和處理 41 #刪除酒店價格 42 df.drop('酒店名稱',axis=1,inplace=True) 43 df.head(20) 44 #檢查是否有重復值 45 df.duplicated() 46 #檢查是否有空值或缺失值 47 a=df['酒店價格'].isnull().value_counts() 48 print(a) 49 #檢查是否有異常值 50 df.describe() 51 52 #對數據分析與可視化 53 import pandas as pd 54 import numpy as np 55 import matplotlib.pyplot as plt 56 import seaborn as sns 57 df = pd.DataFrame(pd.read_excel('藝龍網站泉州酒店信息.xlsx')) 58 #散點圖 59 x = df.酒店價格 60 y = df.酒店評分 61 plt.xlabel("酒店價格") 62 plt.ylabel("酒店評分") 63 plt.scatter(x,y,color="red",label="散點") 64 plt.title("酒店價格與酒店評分的散點圖") 65 plt.legend() 66 plt.show() 67 #柱形圖 68 name_list = df.酒店名稱 69 num_list = df.酒店評分 70 plt.barh(range(len(num_list)), num_list,tick_label = name_list) 71 plt.title("各酒店評分分布") 72 plt.show() 73 #直方圖 74 plt.hist(x = df.酒店價格, 75 bins = 20, 76 color = 'steelblue', 77 edgecolor = 'black' 78 ) 79 plt.xlabel('酒店價格') 80 plt.ylabel('酒店個數') 81 plt.title("各酒店價格分布") 82 plt.show() 83 84 #數據之間的關系與相關系數 85 import numpy as np 86 import pandas as pd 87 import seaborn as sns 88 import sklearn 89 df=pd.read_excel('藝龍網站泉州酒店信息.xlsx') 90 df.head(20) 91 from sklearn.linear_model import LinearRegression 92 X=df.drop("酒店名稱",axis=1) 93 predict_model=LinearRegression() 94 predict_model.fit(X,df['酒店價格']) 95 print("回歸系數為:",predict_model.coef_) #判斷相關性 96 sns.regplot(df.酒店價格,df.序列)
四.結論
1.經過對主題數據的分析與可視化,我發現酒店的價格跟酒店的評分不相關。
2.通過這次的練習讓我懂得了不少知識,也對自己的不足之處更加了解。對於本次的編程對象方面由於沒有充足了解,導致其數據可視化方面較少,其相關性不明顯,總的方面做的還是有些不足。雖說有些不完美,但還是收獲了不少,對Python越來越感興趣,希望今后能學到更多方面的知識提升自己的不足。
