一、主題式網絡爬蟲設計方案
1.爬蟲名稱:爬取百度實時熱點
2.爬蟲爬取的內容:百度實時熱點排行榜的排名,標題,熱度。
3.爬蟲設計方案概述:用requests.get(url)命令向服務器提交請求,然后將響應的網頁信息交給BeatifulSoup庫解析,獲取自己想要的內容。然后使用pandans保存數據,並生成csv文件。然后讀取文件,清洗數據,數據分析與可視化,最后用最小二乘法分析兩個變量之間的相關系數並建立變量之間的回歸方程。
二、主題頁面的結構特征分析
1.主題頁面的結構與特征分析:觀察發現每個標題的各個元素是一個個td被包裝在一個tr標簽里面,每一個標題都是一個tr,排名 :td class="first";關鍵詞:td cass="keyword";搜索指數:td class = "last"。
2.Htmls頁面解析三、網絡爬蟲程序設計
1.數據爬取與采集
import requests from bs4 import BeautifulSoup import bs4 #定義獲取頁面信息函數 def get_html(url,headers): r = requests.get(url,headers=headers) r.encoding = r.apparent_encoding#解決中文字符編碼問題 return r.text #建立空表格 准備數據填充 name=[] rank=[] times=[] #定義解析頁面函數 def get_pages(html): soup = BeautifulSoup(html,'html.parser')#使用BeautifulSoup庫解析頁面 all_topics=soup.find_all('tr')[1:] #獲取標簽內容 for each_topic in all_topics: topic_times = each_topic.find('td',class_='last')#熱度 topic_rank = each_topic.find('td',class_='first')#排名 topic_name = each_topic.find('td',class_='keyword')#標題目 if topic_rank != None and topic_name!=None and topic_times!=None: topic_rank = each_topic.find('td',class_='first').get_text().replace(' ','').replace('\n','') rank.append(topic_rank)#填充數據 topic_name = each_topic.find('td',class_='keyword').get_text().replace(' ','').replace('\n','') name.append(topic_name) topic_times = each_topic.find('td',class_='last').get_text().replace(' ','').replace('\n','') times.append(topic_times) tplt = "排名:{0:^4}\t標題:{1:{3}^15}\t熱度:{2:^8}" #定義主函數 def main(): url = 'http://top.baidu.com/buzz?b=1&fr=20811' headers= {'User-Agent':'Mozilla/5.0'}#表頭信息 html = get_html(url,headers) get_pages(html) if __name__=='__main__': main() print(times) print(name) print(rank) #使用pandans保存數據 from pandas.core.frame import DataFrame D={"排名":rank, "標題":name, "熱度":times} data=DataFrame(D) print(data) #生成CSV文件 filename="redian.csv" data.to_csv(filename,index=False)
2.對數據進行清洗和處理
(1)、讀取文件
import pandas as pd #讀取文件 df=pd.DataFrame(pd.read_csv('redian.csv')) print(df)
(2)、刪除無效列與行
#刪除無效列與行 df.drop('標題', axis=1, inplace = True) df.head()
(3)、重復值處理
#重復值處理 df.duplicated()
(4)、空值與缺失值處理
#空值與缺失值處理 print(df['熱度'].isnull().value_counts()) df[df.isnull().values==True]
(5)、異常值處理
#異常值處理 df.describe()
3.數據分析與可視化
#數據處理與可視化 import numpy as np import pandas as pd import sklearn from sklearn.linear_model import LinearRegression X=df.drop("排名",axis=1) predict_model=LinearRegression() #訓練模型 predict_model.fit(X,df['熱度']) #判斷相關性 print("回歸系數為:",predict_model.coef_)
回歸圖
#排名與熱度的回歸圖 import seaborn as sns sns.regplot(df.排名,df.熱度) sns.set(font='SimHei') # 解決Seaborn中文顯示問題
柱狀圖
#繪制柱狀圖 import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號 plt.figure() plt.bar(df.排名,df.熱度,color='green') plt.xlabel('排名') plt.ylabel('熱度') plt.title("熱榜數據") plt.show()
散點圖
#繪制散點圖 plt.figure() plt.scatter(df.排名,df.熱度,color='blue', s=25, marker="o") plt.xlabel("排名") plt.ylabel("熱度") plt.title("熱榜數據") plt.show()
折線圖
#繪制折線圖 plt.figure() plt.plot(df.排名,df.熱度,color='green') plt.xlabel('排名') plt.ylabel('熱度') plt.title("熱榜數據") plt.show()
4.建立排名與熱度之間的回歸方程
import numpy as np import scipy as sp import matplotlib.pyplot as plt import matplotlib from scipy.optimize import leastsq from numpy import genfromtxt X=df.排名 Y=df.熱度 #構建一元一次方程 def func(p,x): k,b=p return k*x+b #設置誤差函數 def error_func(p,x,y): return func(p,x)-y p0=[1,0] Para=leastsq(error_func,p0,args=(X,Y)) k,b=Para[0] print("k=",k,"b=",b) #設置畫布大小 plt.figure(figsize=(10,6)) #繪制數據散點分布圖 plt.scatter(X,Y,color="green",label=u"樣本數據",linewidth=2) #繪制擬合直線 x=np.linspace(1,49,50) y=k*x+b plt.plot(x,y,color="red",label=u"擬合直線") plt.legend() plt.title("排名與熱度的回歸直線圖") plt.grid() plt.show()
5.代碼總匯
import requests from bs4 import BeautifulSoup import bs4 #定義獲取頁面信息函數 def get_html(url,headers): r = requests.get(url,headers=headers) r.encoding = r.apparent_encoding#解決中文字符編碼問題 return r.text #建立空表格 准備數據填充 name=[] rank=[] times=[] #定義解析頁面函數 def get_pages(html): soup = BeautifulSoup(html,'html.parser')#使用BeautifulSoup庫解析頁面 all_topics=soup.find_all('tr')[1:] #獲取標簽內容 for each_topic in all_topics: topic_times = each_topic.find('td',class_='last')#熱度 topic_rank = each_topic.find('td',class_='first')#排名 topic_name = each_topic.find('td',class_='keyword')#標題目 if topic_rank != None and topic_name!=None and topic_times!=None: topic_rank = each_topic.find('td',class_='first').get_text().replace(' ','').replace('\n','') rank.append(topic_rank)#填充數據 topic_name = each_topic.find('td',class_='keyword').get_text().replace(' ','').replace('\n','') name.append(topic_name) topic_times = each_topic.find('td',class_='last').get_text().replace(' ','').replace('\n','') times.append(topic_times) tplt = "排名:{0:^4}\t標題:{1:{3}^15}\t熱度:{2:^8}" #定義主函數 def main(): url = 'http://top.baidu.com/buzz?b=1&fr=20811' headers= {'User-Agent':'Mozilla/5.0'}#表頭信息 html = get_html(url,headers) get_pages(html) if __name__=='__main__': main() print(times) print(name) print(rank) #使用pandans保存數據 from pandas.core.frame import DataFrame D={"排名":rank, "標題":name, "熱度":times} data=DataFrame(D) print(data) #生成CSV文件 filename="redian.csv" data.to_csv(filename,index=False) import pandas as pd #讀取文件 df=pd.DataFrame(pd.read_csv('redian.csv')) print(df) #刪除無效列與行 df.drop('標題', axis=1, inplace = True) df.head() #重復值處理 df.duplicated() #空值與缺失值處理 print(df['熱度'].isnull().value_counts()) df[df.isnull().values==True] #異常值處理 df.describe() #數據處理與可視化 import numpy as np import pandas as pd import sklearn from sklearn.linear_model import LinearRegression X=df.drop("排名",axis=1) predict_model=LinearRegression() #訓練模型 predict_model.fit(X,df['熱度']) #判斷相關性 print("回歸系數為:",predict_model.coef_) #排名與熱度的回歸圖 import seaborn as sns sns.regplot(df.排名,df.熱度) sns.set(font='SimHei') # 解決Seaborn中文顯示問題 #繪制柱狀圖 import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號 plt.figure() plt.bar(df.排名,df.熱度,color='green') plt.xlabel('排名') plt.ylabel('熱度') plt.title("熱榜數據") plt.show() #繪制散點圖 plt.figure() plt.scatter(df.排名,df.熱度,color='blue', s=25, marker="o") plt.xlabel("排名") plt.ylabel("熱度") plt.title("熱榜數據") plt.show() #繪制折線圖 plt.figure() plt.plot(df.排名,df.熱度,color='green') plt.xlabel('排名') plt.ylabel('熱度') plt.title("熱榜數據") plt.show() #建立排名和熱度之間的回歸方程 import numpy as np import scipy as sp import matplotlib.pyplot as plt import matplotlib from scipy.optimize import leastsq from numpy import genfromtxt X=df.排名 Y=df.熱度 #構建一元一次方程 def func(p,x): k,b=p return k*x+b #設置誤差函數 def error_func(p,x,y): return func(p,x)-y p0=[1,0] Para=leastsq(error_func,p0,args=(X,Y)) k,b=Para[0] print("k=",k,"b=",b) #設置畫布大小 plt.figure(figsize=(10,6)) #繪制數據散點分布圖 plt.scatter(X,Y,color="green",label=u"樣本數據",linewidth=2) #繪制擬合直線 x=np.linspace(1,49,50) y=k*x+b plt.plot(x,y,color="red",label=u"擬合直線") plt.legend() plt.title("排名與熱度的回歸直線圖") plt.grid() plt.show()
四、結論
1..經過對主題數據的分析與可視化,可以更加清晰的看出排名與熱度之間的關系,排名越靠前的熱度越高。數據的分析與可視化有助於對數據的理解與分析,讓我們更直觀的看出數據之間的關系。
2.小結:通過這次的程序設計任務,我深刻的認識到自己的不足,在過程中遇到了很多困難,通過查閱課本、回看老師上課視頻、百度搜索不斷解決了遇到的問題,也學會了很多東西,更提高了對python的興趣。