Python網絡爬蟲——爬取誇克熱搜排行榜
一、 選題的背景
為什么要選擇此選題?要達到的數據分析的預期目標是什么?(10分)
從社會、經濟、技術、數據來源等方面進行描述(200字以內)
疫情的爆發使無數的人無法離開家門,那么他們都依靠什么來緩解焦慮呢。阿里巴巴旗下智能搜索APP誇克發布的數據報告顯示,我們熟悉的生活卻從未走遠:有人走進廚房用美食治愈自己,有人關注和萌寵的相處之道,還有人規划起了疫情之后的旅行。
二、主題式網絡爬蟲設計方案(10分)
1.主題式網絡爬蟲名稱
Python網絡爬蟲——爬取誇克熱搜排行榜
2.主題式網絡爬蟲爬取的內容與數據特征分析
爬取今日的熱搜數據做可視化處理
3.主題式網絡爬蟲設計方案概述(包括實現思路與技術難點)
步驟:首先,先確定此次的選題的主題內容,然后爬取誇克熱搜排行,設計爬取程序進行爬取(爬取內容時會遇到爬出來的數據為***萬人,思考如何將此數據變成數字),將爬取的數據做成xsl表格時(
1. 創建workbook2.創建worsheet3.數據寫入sheet4.數據寫入sheet5.保存到excel),接着進行可視化處理。最后,保存數據。
三、主題頁面的結構特征分析
1.主題頁面的結構與特征分析
我們所需的網站誇克熱搜排行榜(https://quark.sm.cn/sfrom=kkframenew&predict=1&search_id=AAM0gYl%2BOkyU46PzPXUuYxYWwBPQa8ML6I6ZHAjFAA%2Faew%3D%3D_1640440403736&round_id=-1&pdtt=1640440403&uc_param_str=dnntnwvepffrgibijbprsvpidsdichei&q=%E7%83%AD%E6%90%9C%E6%8E%92%E8%A1%8C%E6%A6%9C&hid=72c443e2f1354914d23bba5bb0635f26)從此獲取熱搜的排名,熱搜事件和熱度
尋找出我們需要爬取的東西。
2.htmls頁面解析

3.節點(標簽)查找方法與遍歷方法(必要時畫出節點樹結構)

四、網絡爬蟲程序設計
from bs4 import BeautifulSoup
import re import urllib.request,urllib.error import xlwt import sqlite3 def getData(url): datalist = [] html = askURL(url) soup = BeautifulSoup(html,"html.parser") i=1 for item in soup.find_all('a', class_="news-top-list-item c-padding-top-l c-border-bottom c-padding-bottom-l"): data = [] item = str(item) pm = i i=i+1 data.append(pm) #測試print(item) findbt = re.compile(r'</span>(.*?)<span class="news-top-list-item-number') bt = re.findall(findbt, item)[0] data.append(bt) findrs = re.compile(r'dark">(.*?)<i class="news-top-list-item-trend') rs = re.findall(findrs, item)[0].replace("萬人", "0000") data.append(rs) datalist.append(data) print(data) return datalist def askURL(url): head = { "User-Agent": "Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome / 96.0.4664.110 Safari / 537.36" } request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html #askURL("https://quark.sm.cn/s?from=kkframenew&predict=1&search_id=AAM0gYl%2BOkyU46PzPXUuYxYWwBPQa8ML6I6ZHAjFAA%2Faew%3D%3D_1640440403736&round_id=-1&pdtt=1640440403&uc_param_str=dnntnwvepffrgibijbprsvpidsdichei&q=%E7%83%AD%E6%90%9C%E6%8E%92%E8%A1%8C%E6%A6%9C&hid=72c443e2f1354914d23bba5bb0635f26") url = ("https://quark.sm.cn/s?from=kkframenew&predict=1&search_id=AAM0gYl%2BOkyU46PzPXUuYxYWwBPQa8ML6I6ZHAjFAA%2Faew%3D%3D_1640440403736&round_id=-1&pdtt=1640440403&uc_param_str=dnntnwvepffrgibijbprsvpidsdichei&q=%E7%83%AD%E6%90%9C%E6%8E%92%E8%A1%8C%E6%A6%9C&hid=72c443e2f1354914d23bba5bb0635f26") html=askURL(url) datalist = getData(url) print(datalist) print("爬取完畢!")
輸出結果圖:

將爬取的數據輸入excle
savepath = ".\\誇克熱搜排行榜.xls"
book = xlwt.Workbook(encoding="utf-8",style_compression=0)
#創建workbook對象
sheet = book.add_sheet('誇克熱搜排行榜',cell_overwrite_ok=True)
#創建工作表
col = ("排名","標題","熱度")
for i in range(0,3):
sheet.write(0,i,col[i]) #列名
for i in range(0,100):
#測試 print("第%d條" %(i+1))
data = datalist[i]
for j in range(0,3):
sheet.write(i+1,j,data[j])
#數據
book.save(savepath)
print('已輸出表格!')
excle輸出結果圖:

進行數據清洗
1 #導入數據 2 import pandas as pd 3 import numpy as np 4 import seaborn as sns 5 import sklearn 6 #導入數據 7 ranking=pd.DataFrame(pd.read_excel(r'C:\Users\86198\誇克熱搜排行榜.xls')) 8 #顯示數據前五行 9 ranking.head() 10 11 #查找重復值 2 ranking.duplicated() 12 13 14 #刪除重復值 15 ranking=ranking.drop_duplicates() 16 #輸出數據前五行 17 ranking.head()

異常值查詢
#導入數據 import pandas as pd import numpy as np import seaborn as sns import sklearn #導入數據 ranking=pd.DataFrame(pd.read_excel(r'C:\Users\86198\誇克熱搜排行榜.xls')) #顯示數據前五行 ranking.head() #查找重復值 2 ranking.duplicated() #刪除重復值 ranking=ranking.drop_duplicates() #輸出數據前五行 ranking.head() ranking.describe()

4.數據分析與可視化
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
kuake_df=pd.read_excel(r'C:\Users\86198\誇克熱搜排行榜.xls')
data=np.array(kuake_df['熱度'][0:10])
#索引
index=np.arange(1,11)
#用來正常顯示中文標簽
plt.rcParams['font.sans-serif']=['Arial Unicode MS']
#用來正常顯示負號
plt.rcParams['axes.unicode_minus']=False
#修改x軸字體大小為12
plt.xticks(fontsize=12)
#修改y軸字體大小為12
plt.yticks(fontsize=12)
print(data)
print(index)
#x標簽
plt.xlabel('排名')
#y標簽
plt.ylabel('熱度')
plt.rcParams['font.sans-serif']=['SimHei']
s = pd.Series(data, index)
s.plot(kind='bar',color='g')
plt.grid()
plt.show()
輸出結果

5.散點圖
#散點圖、折線圖
kuake_df=pd.read_excel(r'C:\Users\86198\誇克熱搜排行榜.xls')
plt.rcParams['font.sans-serif']=['Arial Unicode MS'] plt.rcParams['axes.unicode_minus']=False plt.xticks(fontsize=12) plt.yticks(fontsize=12) #散點 plt.scatter(kuake_df.排名, kuake_df.熱度,color='b') #折線 plt.plot(kuake_df.排名, kuake_df.熱度,color='r') #x標簽 plt.xlabel('paiming') #y標簽 plt.ylabel('redu') plt.show()

線性回歸方程
from sklearn.linear_model import LinearRegression
zhihu_df=pd.read_excel(r'C:\Users\86198\誇克熱搜排行榜.xls') predict_model=LinearRegression() X=kuake_df[["排名"]] Y=kuake_df["熱度"] predict_model.fit(X,Y) print("回歸方程系數為{}".format( predict_model.coef_)) print("回歸方程截距:{0:2f}".format( predict_model.intercept_))

import matplotlib.pyplot as plt
import matplotlib import numpy as np import scipy.optimize as opt kuake_df=pd.read_excel(r'C:\Users\86198\誇克熱搜排行榜.xls') x0=np.array(kuake_df['排名'][0:10]) y0=np.array(kuake_df['熱度'][0:10]) def func(x,c0): a,b,c=c0 return a*x**2+b*x+c def errfc(c0,x,y): return y-func(x,c0) c0=[0,2,3] c1=opt.leastsq(errfc,c0,args=(x0,y0))[0] a,b,c=c1 print(f"擬合方程為:y={a}*x**2+{b}*x+{c}") chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc') plt.plot(x0,y0,"ob",label="樣本數據") plt.plot(x0,func(x0,c1),"r",label="擬合曲線") plt.legend(loc=3,prop=chinese) plt.show()

7、總代碼
from bs4 import BeautifulSoup #進行網頁解析 import re #進行文字匹配 import urllib.request,urllib.error #制定URL,獲取網頁數據 import xlwt #進行excel操作 import sqlite3 #進行SQLite數據庫操作 def getData(url): datalist = [] html = askURL(url) soup = BeautifulSoup(html,"html.parser") i=1 for item in soup.find_all('a', class_="news-top-list-item c-padding-top-l c-border-bottom c-padding-bottom-l"): data = [] item = str(item) pm = i i=i+1 data.append(pm) #測試print(item) findbt = re.compile(r'</span>(.*?)<span class="news-top-list-item-number') bt = re.findall(findbt, item)[0] data.append(bt) findrs = re.compile(r'dark">(.*?)<i class="news-top-list-item-trend') rs = re.findall(findrs, item)[0].replace("萬人", "0000") data.append(rs) datalist.append(data) print(data) return datalist def askURL(url): head = { "User-Agent": "Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome / 96.0.4664.110 Safari / 537.36" } request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html #askURL("https://quark.sm.cn/s?from=kkframenew&predict=1&search_id=AAM0gYl%2BOkyU46PzPXUuYxYWwBPQa8ML6I6ZHAjFAA%2Faew%3D%3D_1640440403736&round_id=-1&pdtt=1640440403&uc_param_str=dnntnwvepffrgibijbprsvpidsdichei&q=%E7%83%AD%E6%90%9C%E6%8E%92%E8%A1%8C%E6%A6%9C&hid=72c443e2f1354914d23bba5bb0635f26") url = ("https://quark.sm.cn/s?from=kkframenew&predict=1&search_id=AAM0gYl%2BOkyU46PzPXUuYxYWwBPQa8ML6I6ZHAjFAA%2Faew%3D%3D_1640440403736&round_id=-1&pdtt=1640440403&uc_param_str=dnntnwvepffrgibijbprsvpidsdichei&q=%E7%83%AD%E6%90%9C%E6%8E%92%E8%A1%8C%E6%A6%9C&hid=72c443e2f1354914d23bba5bb0635f26") html=askURL(url) datalist = getData(url) print(datalist) print("爬取完畢!") savepath = ".\\誇克熱搜排行榜.xls" book = xlwt.Workbook(encoding="utf-8",style_compression=0) #創建workbook對象 sheet = book.add_sheet('誇克熱搜排行榜',cell_overwrite_ok=True) #創建工作表 col = ("排名","標題","熱度") for i in range(0,3): sheet.write(0,i,col[i]) #列名 for i in range(0,100): data = datalist[i] for j in range(0,3): sheet.write(i+1,j,data[j]) #數據 book.save(savepath) print('已輸出表格!') #導入數據 ranking=pd.DataFrame(pd.read_excel(r'C:\Users\86198\誇克熱搜排行榜.xls')) #顯示數據前五行 ranking.head() #刪除重復值 ranking=ranking.drop_duplicates() #輸出數據前五行 ranking.head() ranking.describe() #制作柱形圖 kuake_df=pd.read_excel(r'C:\Users\86198\誇克熱搜排行榜.xls') data=np.array(kuake_df['熱度'][0:10]) #索引 index=np.arange(1,11) #用來正常顯示中文標簽 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] #用來正常顯示負號 plt.rcParams['axes.unicode_minus']=False #修改x軸字體大小為12 plt.xticks(fontsize=12) #修改y軸字體大小為12 plt.yticks(fontsize=12) print(data) print(index) #x標簽 plt.xlabel('排名') #y標簽 plt.ylabel('熱度') plt.rcParams['font.sans-serif']=['SimHei'] s = pd.Series(data, index) s.plot(kind='bar',color='g') plt.grid() plt.show() #散點圖、折線圖 kuake_df=pd.read_excel(r'C:\Users\86198\誇克熱搜排行榜.xls') plt.rcParams['font.sans-serif']=['Arial Unicode MS'] plt.rcParams['axes.unicode_minus']=False plt.xticks(fontsize=12) plt.yticks(fontsize=12) #散點 plt.scatter(kuake_df.排名, kuake_df.熱度,color='b') #折線 plt.plot(kuake_df.排名, kuake_df.熱度,color='r') #x標簽 plt.xlabel('排名') #y標簽 plt.ylabel('熱度') plt.rcParams['font.sans-serif']=['SimHei'] plt.show() #回歸方程 from sklearn.linear_model import LinearRegression kuake_df=pd.read_excel(r'C:\Users\86198\誇克熱搜排行榜.xls') predict_model=LinearRegression() X=kuake_df[["排名"]] Y=kuake_df["熱度"] predict_model.fit(X,Y) print("回歸方程系數為{}".format( predict_model.coef_)) print("回歸方程截距:{0:2f}".format( predict_model.intercept_)) kuake_df=pd.read_excel(r'C:\Users\86198\誇克熱搜排行榜.xls') x0=np.array(kuake_df['排名'][0:10]) y0=np.array(kuake_df['熱度'][0:10]) def func(x,c0): a,b,c=c0 return a*x**2+b*x+c def errfc(c0,x,y): return y-func(x,c0) c0=[0,2,3] c1=opt.leastsq(errfc,c0,args=(x0,y0))[0] a,b,c=c1 print(f"擬合方程為:y={a}*x**2+{b}*x+{c}") chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc') plt.plot(x0,y0,"ob",label="樣本數據") plt.plot(x0,func(x0,c1),"r",label="擬合曲線") plt.legend(loc=3,prop=chinese) plt.show()
五、總結(10分)
1、經過對誇克熱搜的數據分析與可視化,我們可以得到大部分人的興趣愛好是什么,可以得知人們對什么事情感興趣,大眾的關注點是什么,經過倆天的爬取我發現每一天的熱搜排行都有着十分大的變化,可能僅僅幾個小時的時間就可能會出來一條上百萬的熱搜新聞。可以達到預期的目標,觀測出人們的興趣愛好,從而幫助那些因為疫情待在家中無聊的人們尋找一些樂趣,以及一些重要的國家大事
2、在完成此設計過程中,我了解到了網絡爬蟲的一些重要意義,可以幫助我們獲取網站中我們所需的內容。對於爬取還是太過於生疏了,並且還有許多網站不會爬,在未來的日子學習更多的知識去擴大自己的知識面。
