爬取知乎熱度並且進行數據分析和可視化


一、設計方案
1、名稱:爬取知乎熱榜的數據與做數據分析和可視化操作


2、內容:知乎的熱門話題前16個,包括它的熱度值


3、方案概況:(1)、思路:先去知乎熱點網站上查看源代碼,找到自己想要的數據和標簽,開始動手寫爬蟲,爬去數據后,建立一個簡便的可讓人打開的文檔或文件夾,
再進行數據的處理,分析,和可視化。完成整個設計

(2)、技術難點 1):分析網頁時難以快速且准確的找到自己想要抓取的標簽和抓取項目
2):對數據分析理解不夠,以至於線性回歸方程部分沒寫







#分析網頁源代碼

分析得知,所有要抓取的內容均在table標簽中
在這個標簽中找到需要的內容






二、進行爬蟲

#爬去所有需要的數據
url='https://tophub.today/n/mproPpoq6O'
#偽裝一個標題,能夠爬取內容
headers={'user-agent':'45545454'}
#設置延遲
response=requests.get(url,headers=headers,timeout=30)
#獲取內容
html=response.text
biaoti=re.findall('<a href=.*? target="_blank" .*?>(.*?)</a>',html)[3:20]
redu=re.findall('<td>(.*?)</td>',html)[0:17]
#print(biaoti)
#print(redu)

#讓數據更美觀和有條理並且創建一個文件夾

#創建字典
dict = {'內容':biaoti,'閱讀數量':redu}
x = pd.DataFrame(dict)
#print(x)

 
         


dict=[]
for i in range(16):
dict.append([i+1,biaoti[i],redu[i][:-3]])

#建立一個有關文件夾
file=pd.DataFrame(dict,columns=['排名','知乎今日熱榜','熱度(單位:萬)'])
print(file)
#file.to_csv('/Users/xiaonico/Desktop/知乎熱榜數據.csv')




三、處理文件

對數據的處理
#讀取csv文件
df=pd.DataFrame(pd.read_csv('/Users/xiaonico/Desktop/知乎熱榜數據.csv'))
df.head()


#數據清洗

#進行清洗,去除無效數據
df.drop('知乎今日熱榜',axis=1,inplace=Ture)
df.head()
df.isnull().sum()#空值
#缺失值
df[df.isnull().values==True]
#describe()顯示描述性統計指標
df.describe()










#進行相關數問題

#相關系數問題
df.corr()




四、數據可視化

#排名和熱度之間的線性關系
sns.lmplot(x='排名',y='熱度(單位:萬)',data=df)

 
         

 

#繪制條形統計圖
def build():
file_path = "'知乎熱榜數據.csv'"
x = df['排名']
y = df['熱度(單位:萬)']
plt.xlabel('排名')
plt.ylabel('熱度(單位:萬)')
plt.bar(x,y)
plt.title("繪制排名與熱度條形圖")
plt.show()
build()

 

#畫散點圖
def sandian():
x = df['排名']
y = df['熱度(單位:萬)']
plt.xlabel('排名')
plt.ylabel('熱度(單位:萬)')
plt.scatter(x,y,color="red",label=u"熱度分布數據",linewidth=2)
plt.title("排名與熱度散點圖")
plt.legend()
plt.show()
sandian()

 
         

 





#畫折線圖
def zhexian():
x = df['排名']
y = df['熱度(單位:萬)']
plt.xlabel('排名')
plt.ylabel('熱度(單位:萬)')
plt.plot(x,y)
plt.scatter(x,y)
plt.title("排名與熱度折線圖")
plt.show()
zhexian()





#進行數據的回歸方程不會



















五、全部代碼
#
導入需要的庫 import requests import re import os import pandas as pd from bs4 import BeautifulSoup import seaborn as sns #一、爬去所有需要的數據 url='https://tophub.today/n/mproPpoq6O' #偽裝一個標題,能夠爬取內容 headers={'user-agent':'45545454'} #設置延遲 response=requests.get(url,headers=headers,timeout=30) #獲取內容 html=response.text biaoti=re.findall('<a href=.*? target="_blank" .*?>(.*?)</a>',html)[3:20] redu=re.findall('<td>(.*?)</td>',html)[0:17] #print(biaoti) #print(redu) #print(html) #用bs4對需要的內容進行編輯 soup=BeautifulSoup(html,'html.parser') title=soup.find_all('a',class_='list-title') point=soup.find_all('align',class_='inco_rise') #print(':^55}'.format('知乎熱榜川 #print('t{:^40}\t{:^10}.format( '標題,熱度"》 #創建字典 dict = {'內容':biaoti,'閱讀數量':redu} x = pd.DataFrame(dict) #print(x) dict=[] for i in range(16): dict.append([i+1,biaoti[i],redu[i][:-3]]) #建立一個有關文件夾 file=pd.DataFrame(dict,columns=['排名','知乎今日熱榜','熱度(單位:萬)']) print(file) #file.to_csv('/Users/xiaonico/Desktop/知乎熱榜數據.csv') #二、對數據的處理 #讀取csv文件 df=pd.DataFrame(pd.read_csv('/Users/xiaonico/Desktop/知乎熱榜數據.csv')) df.head() #進行清洗,去除無效數據 df.drop('知乎今日熱榜',axis=1,inplace=Ture) df.head() df.isnull().sum()#空值 #缺失值 df[df.isnull().values==True] #describe()顯示描述性統計指標 df.describe() #相關系數問題 df.corr() #三、數據可視化 #排名和熱度之間的線性關系 sns.lmplot(x='排名',y='熱度(單位:萬)',data=df) #繪制條形統計圖 def build(): file_path = "'知乎熱榜數據.csv'" x = df['排名'] y = df['熱度(單位:萬)'] plt.xlabel('排名') plt.ylabel('熱度(單位:萬)') plt.bar(x,y) plt.title("繪制排名與熱度條形圖") plt.show() build() #畫散點圖 def sandian(): x = df['排名'] y = df['熱度(單位:萬)'] plt.xlabel('排名') plt.ylabel('熱度(單位:萬)') plt.scatter(x,y,color="red",label=u"熱度分布數據",linewidth=2) plt.title("排名與熱度散點圖") plt.legend() plt.show() sandian() #畫折線圖 def zhexian(): x = df['排名'] y = df['熱度(單位:萬)'] plt.xlabel('排名') plt.ylabel('熱度(單位:萬)') plt.plot(x,y) plt.scatter(x,y) plt.title("排名與熱度折線圖") plt.show() zhexian()




六、總結:
對於所有的折線圖,散點圖,和數據分析,可以判斷出,排名時隨着熱度的增長而增長的

小結:
對數據的抓取和分析,還有進行清洗與可視化讓我們更加直觀的看出來熱度標題的數據,能夠獲取有用的數據,能夠畫出對於數據的各式圖形,
可以讓分析更加的快捷和方便,對於有需求的人來說是非常快捷而且方便的。






 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM