一、設計方案
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()
六、總結:
對於所有的折線圖,散點圖,和數據分析,可以判斷出,排名時隨着熱度的增長而增長的
小結:
對數據的抓取和分析,還有進行清洗與可視化讓我們更加直觀的看出來熱度標題的數據,能夠獲取有用的數據,能夠畫出對於數據的各式圖形,
可以讓分析更加的快捷和方便,對於有需求的人來說是非常快捷而且方便的。