一.主題式網絡主題式網絡爬蟲設計方案
1.爬蟲名稱:爬取百度熱搜榜Top50
2.爬取內容:熱點排名,熱門標題,搜索熱度
3.網絡爬蟲設計方案概述:
思路:通過分析網頁源代碼,找出數據所在的標簽,通過爬蟲讀取數據保存到excel文件中,讀取文件,對數據進行清洗和處理,數據分析與可視化處理。
技術難點:掌握知識不夠,操作過於生疏,對網頁爬取還有很多疑問
二.主題頁面的結構特征分析
1.主題頁面的結構與特征分析:爬取數據都分布在標簽'<div class="wrapper">…</div>'里面,排名標簽為num-top,標題標簽為'list-title',熱度標簽為'icon-rise'
2.Htmls頁面解析:
三、網絡爬蟲程序設計
1.數據爬取與采集:
import requests from bs4 import BeautifulSoup import bs4 import pandas as pd titles=[] hots=[] top=[] url='http://top.baidu.com/buzz?b=341&c=513&fr=topbuzz_b1_c513' #選擇要爬取的網站 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/69.0.3497.100 Safari/537.36'}#偽裝爬蟲 r=requests.get(url) #獲得url信息 r.raise_for_status() #失敗請求(非200響應)拋出異常 r.encoding = r.apparent_encoding #根據內容分析出的編碼方式,備選編碼; html = r.text #獲得的HTML文本 table = BeautifulSoup(html,"html.parser").find("table") #對獲得的文本進行html解析,查找<table>內的信息 soup=BeautifulSoup(html,'lxml') for m in soup.find_all(class_="keyword"): titles.append(m.get_text().strip()) for n in soup.find_all(class_="icon-rise"): hots.append(n.get_text().strip()) for k in soup.find_all(class_="first"): top.append(k.get_text().strip()) final=[top,titles,hots] print(final) df=pd.DataFrame(final,index=["排名","標題","熱度數據"]) #使用工具使其可視化 print(df.T) S="D:/ 百度排行榜.xlsx" df.T.to_excel(S)
2.對數據進行清洗和處理:
#數據清洗 print('\n====各列是否有缺失值情況如下:====') print(df.isnull()) #統計空值情況 print(df.duplicated()) #查找重復值 print(df.isna().head()) print(df.describe()) #描述數據
3.數據分析與可視化:
1
import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['font.sans-serif']=['SimHei'] x =['湖北高考時間公布','李沁挽張若昀','演員張沖霄去世','新型冠狀病毒','北京上空出現日暈','貓和老鼠導演去世','美國確診超69萬'] y = [1,2,3,4,5,6,7] plt.plot(x,y) plt.xlabel("標題") plt.ylabel("排名") plt.title('Top7熱點') plt.show()
2;柱狀圖
plt.rcParams['font.family']=['sans-serif'] plt.rcParams['font.sans-serif']=['SimHei'] plt.bar(['湖北高考時間公布','李沁挽張若昀','演員張沖霄去世','新型冠狀病毒','北京上空出現日暈','貓和老鼠導演去世','美國確診超69萬'], [288274,96157,91377,87846,75818,66756,64747]) plt.legend() plt.xlabel("熱搜事件") plt.ylabel("熱度指數") plt.title('Top7熱點') plt.show()
3:折線圖
#折線圖 def line_diagram(): x = ['湖北高考時間公布','李沁挽張若昀','演員張沖霄去世','新型冠狀病毒','北京上空出現日暈','貓和老鼠導演去世','美國確診超69萬'] y = [288274,96157,91377,87846,75818,66756,64747] plt.xlabel('事件') plt.ylabel('熱度') plt.plot(x,y) plt.scatter(x,y) plt.title("熱搜事件與熱度折線圖") plt.show() line_diagram()
4:散點圖
#散點圖 def Scatter_point(): x = ['湖北高考時間公布','李沁挽張若昀','演員張沖霄去世','新型冠狀病毒','北京上空出現日暈','貓和老鼠導演去世','美國確診超69萬'] y = [1,2,3,4,5,6,7] plt.scatter(x,y,color='pink', s=25, marker="o") plt.xlabel("事件") plt.ylabel("熱度") plt.title("熱搜事件與熱度散點圖") plt.show() Scatter_point()
5:一元二次方程
#一元二次方程 import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib from scipy.optimize import leastsq chinese=matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc') #調用中文 filename="D:/ 百度排行榜.xlsx" colnames=["排名","標題","熱度數據"] df=pd.read_excel(filename,skiprows=1,names=colnames) print(df) X=df.排名 Y=df.熱度數據 def func(p, x): a, b, c= p return a*x*x+b*x+c def error(p, x, y): return func(p, x) - y
p0=[1978,20] def main():
plt.figure(figsize=(10,6)) p0=[1980,300,1] Para=leastsq(error,p0,args=(X,Y)) a,b,c=Para[0] print("a=", a,"b=", b,"c=", c) plt.figure(figsize=(10,6)) plt.scatter(X, Y, color="green", label="樣本數據",linewidth=2) x=np.linspace(100000,600000,300) y=a*x*x+b*x+c plt.plot(X,Y,color="red",label=u"擬合直線",linewidth=2) plt.title(" 百度排行榜 ") plt.grid() plt.legend() plt.show()
main()
6:將以上各部分的代碼匯總,附上完整程序代碼:
import requests from bs4 import BeautifulSoup import bs4 import pandas as pd titles=[] hots=[] top=[] url='http://top.baidu.com/buzz?b=341&c=513&fr=topbuzz_b1_c513' #選擇要爬取的網站 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/69.0.3497.100 Safari/537.36'}#偽裝爬蟲 r=requests.get(url) #獲得url信息 r.raise_for_status() #失敗請求(非200響應)拋出異常 r.encoding = r.apparent_encoding #根據內容分析出的編碼方式,備選編碼; html = r.text #獲得的HTML文本 table = BeautifulSoup(html,"html.parser").find("table") #對獲得的文本進行html解析,查找<table>內的信息 soup=BeautifulSoup(html,'lxml') for m in soup.find_all(class_="keyword"): titles.append(m.get_text().strip()) for n in soup.find_all(class_="icon-rise"): hots.append(n.get_text().strip()) for k in soup.find_all(class_="first"): top.append(k.get_text().strip()) final=[top,titles,hots] print(final) df=pd.DataFrame(final,index=["排名","標題","熱度數據"]) #使用工具使其可視化 print(df.T) S="D:/ 百度排行榜.xlsx" df.T.to_excel(S) #數據清洗 print('\n====各列是否有缺失值情況如下:====') print(df.isnull()) #統計空值情況 print(df.duplicated()) #查找重復值 print(df.isna().head()) print(df.describe()) #描述數據 import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['font.sans-serif']=['SimHei'] x =['湖北高考時間公布','李沁挽張若昀','演員張沖霄去世','新型冠狀病毒','北京上空出現日暈','貓和老鼠導演去世','美國確診超69萬'] y = [1,2,3,4,5,6,7] plt.plot(x,y) plt.xlabel("標題") plt.ylabel("排名") plt.title('Top7熱點') plt.show() plt.rcParams['font.family']=['sans-serif'] plt.rcParams['font.sans-serif']=['SimHei'] plt.bar(['湖北高考時間公布','李沁挽張若昀','演員張沖霄去世','新型冠狀病毒','北京上空出現日暈','貓和老鼠導演去世','美國確診超69萬'], [288274,96157,91377,87846,75818,66756,64747]) plt.legend() plt.xlabel("熱搜事件") plt.ylabel("熱度指數") plt.title('Top7熱點') plt.show() #折線圖 def line_diagram(): x = ['湖北高考時間公布','李沁挽張若昀','演員張沖霄去世','新型冠狀病毒','北京上空出現日暈','貓和老鼠導演去世','美國確診超69萬'] y = [288274,96157,91377,87846,75818,66756,64747] plt.xlabel('事件') plt.ylabel('熱度') plt.plot(x,y) plt.scatter(x,y) plt.title("熱搜事件與熱度折線圖") plt.show() line_diagram() #散點圖 def Scatter_point(): x = ['湖北高考時間公布','李沁挽張若昀','演員張沖霄去世','新型冠狀病毒','北京上空出現日暈','貓和老鼠導演去世','美國確診超69萬'] y = [1,2,3,4,5,6,7] plt.scatter(x,y,color='pink', s=25, marker="o") plt.xlabel("事件") plt.ylabel("熱度") plt.title("熱搜事件與熱度散點圖") plt.show() Scatter_point() #一元二次方程 import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib from scipy.optimize import leastsq chinese=matplotlib.font_manager.FontProperties(fname='C:/Windows/Fonts/simsun.ttc') #調用中文
filename="D:/ 百度排行榜.xlsx" colnames=["排名","標題","熱度數據"] df=pd.read_excel(filename,skiprows=1,names=colnames) print(df) X=df.排名 Y=df.熱度數據 def func(p, x): a, b, c= p return a*x*x+b*x+c def error(p, x, y): return func(p, x) - y
p0=[1978,20] def main():
plt.figure(figsize=(10,6)) p0=[1980,300,1] Para=leastsq(error,p0,args=(X,Y)) a,b,c=Para[0] print("a=", a,"b=", b,"c=", c) plt.figure(figsize=(10,6)) plt.scatter(X, Y, color="green", label="樣本數據",linewidth=2) x=np.linspace(100000,600000,300) y=a*x*x+b*x+c plt.plot(X,Y,color="red",label=u"擬合直線",linewidth=2) plt.title(" 百度排行榜 ") plt.grid() plt.legend() plt.show() main() plt.savefig(fname="D:/百度熱搜榜排名和熱度關系圖.jpg",figsize=[1,1]) #保存圖像
四、結論
1.經過對主題數據的分析與可視化,可以得到哪些結論?
結論:python這門語言博大精深,雖然初學但是還是能感受到其中的奧秘以及難度,比起其他語言容易上手但但精通,我在數據處理這塊還是有很多問題需要解決。
2.小結:通過這次作業,了解到了自己的眾多不足,類似於回歸方程的擬合以及一元多次方程的畫法還掌握不當,這次任務加大了自己對python的興趣,希望自己以后可以努力學習,更上一層樓。