利用python爬取微博熱搜並進行數據保存和數據清理以及數據可視化方案


一.主題式網絡主題式網絡爬蟲設計方案

1.主題式網絡爬蟲名稱:爬取微博熱搜排行榜並進行保存可視化

2.主題式網絡爬蟲爬取的內容:爬取微博熱搜排行榜前五十

3.主題式網絡爬蟲設計方案概述:

先使用代碼爬取網頁的結構:

import requests
from bs4 import BeautifulSoup
url='https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6'
def getHTMLText(url,timeout=30):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return'產生異常'
html=getHTMLText(url)
soup=BeautifulSoup(html,'html.parser')
print(soup.prettify())

然后打開所要爬取的網頁,進入開發者工具中

經過查找,發現我們所需的熱搜排名與熱搜的標題以及熱度分別藏在class="td-01 ranktop"與class="td_02"當中

接着進行爬取並采集數據:

#引入所需要到的第三方庫
import requests
from bs4 import BeautifulSoup
import pandas as pd
from pandas import DataFrame
import csv
#輸入所要爬取的網頁
url="https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6"
#偽裝爬蟲頭避免被檢測攔截
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
#請求網站
r=requests.get(url)
print(r.text)
#對頁面內容重新編碼
r.encoding=r.apparent_encoding
data=r.text
#使用BeautifulSoup
soup=BeautifulSoup(data,'html.parser')
#顯示網站結構
print(soup.prettify())
#解析網頁了解到熱搜排名和熱搜標題熱度分別放在兩個class當中,創建兩個個空列表
head=[]
index=[]
#把排名添加進空列表
for i in soup.find_all(class_="td-01 rank top"):
head.append(i.get_text().strip())
#把熱度標題添加進空列表
for k in soup.find_all(class_="td-02"):
index.append(k.get_text().strip())
data=[head,index]
print(data)
s=pd.DataFrame(data,index=["排名","標題\熱度數據"])
#將所得數據進行可視化
print(s.T)

接着進行數據的保存:

#將數據保存至本地並進行數據的清理
S="D:\愛剪輯\\wbrs2.xlsx"
df=pd.DataFrame(data,index=["排名","標題\熱度數據"])
print(df.T)
df.T.to_excel(S)

#進行數據處理
print(df.isnull())
print(df.duplicated())
print(df.isna().head())
print(df.describe())
titanic=pd.DataFrame(pd.read_excel('D:\愛剪輯\\wbrs2.xlsx'))
titanic.drop_duplicates()
titanic.head()
#將保存至本地的數據加載到DataFrame中
wbrs2_df=pd.read_excel('D:\愛剪輯\\wbrs2.xlsx',sheet_name='Sheet1')
wbrs2_df.head()
wbrs2_df.describe()

接着進行數據可視化:

#導入作圖所需的庫
import matplotlib
import pandas as pd
from matplotlib import pyplot as plt
#讀取並可視化數據
file_path="D:\愛剪輯\\wbrs2.xlsx"
df=pd.read_excel(file_path,name=['排名','標題','熱度數據'])
df.set_index('排名',inplace=True)
df.head()
print(df.head())
#做出數據前五散點圖
def Scatter_point():
x = ['羅志祥道歉','鍾南山說疫情擋不住航天豪情','純電動還是保時捷嗎','向往的生活定檔','宇宙第一次聽見中國聲音']
y = [5782383,1981852,1971252,1769837,1447369]
plt.scatter(x,y,color='red', s=25, marker="o")
plt.xlabel("熱搜標題")
plt.ylabel("熱搜熱度")
plt.title("熱搜標題與熱度散點圖")
plt.show()
Scatter_point()
#做出數據前五折線圖
def line_diagram():
x = ['羅志祥道歉','鍾南山說疫情擋不住航天豪情','純電動還是保時捷嗎','向往的生活定檔','宇宙第一次聽見中國聲音']
y = [5782383,1981852,1971252,1769837,1447369]
plt.xlabel('熱搜標題')
plt.ylabel('熱搜熱度')
plt.plot(x,y)
plt.scatter(x,y)
plt.title("熱搜標題與熱度折線圖")
plt.show()
line_diagram()
file_path="D:\愛剪輯\\wbrs2.xlsx"
#做出數據前五垂直柱狀圖
plt.rcParams['font.family']=['sans-serif']
plt.rcParams['font.sans-serif']=['SimHei']
plt.bar(['羅志祥道歉','鍾南山說疫情擋不住航天豪情','純電動還是保時捷嗎','向往的生活定檔','宇宙第一次聽見中國聲音'], [5782383,1981852,1971252,1769837,1447369])
plt.legend()
plt.xlabel("標題")
plt.ylabel("熱搜熱度")
plt.title('排名前五熱搜')
plt.show()

將數據作圖得出的圖像進行保存:

plt.savefig(fname="D:/微博熱搜前五排行圖.jpg",figsize=[1,1])
#保存圖像

建立線性回歸方程:

import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
#導入庫讀取爬取的數據前5
file_path="D:\愛剪輯\\wbrs2.xlsx"
df=pd.read_excel(file_path,name=['排名','標題與熱度'])
df.set_index('排名',inplace=True)
df.head()
print(df.head())
#設置相同的seed,每次生成的隨機數相同。如果不設置seed,則每次會生成不同的隨機數
np.random.seed(0)
chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
##樣本數據(Xi,Yi),需要轉換成數組(列表)形式
Xi=np.array([1,2,3,4,5])
Yi=np.array([5782383,1981852,1971252,1769837,1447369])
##需要擬合的函數func :指定函數的形狀 k= 0.42116973935 b= -8.28830260655
def fit_func(p,x):
k,b=p
return k*x+b
##偏差函數:x,y都是列表:這里的x,y和樣本數據Xi,Yi中是一一對應的
def error_func(p,x,y):
return fit_func(p,x)-y
#k,b的初始值,可以任意設定,但可以調整
p0=[1,20]
#使用leastsq()函數可以很快速地使用最小二乘法對數據進行擬合
Para=leastsq(error_func,p0,args=(Xi,Yi))
#讀取結果
k,b=Para[0] #k,b表示什么?
print("k=",k,"b=",b)
#畫樣本點
plt.figure(figsize=(8,6)) ##指定圖像比例: 8:6
plt.scatter(Xi,Yi,color="green",label=u"樣本數據",linewidth=2)
#畫擬合直線
x=np.linspace(150,190,100) ##在150-190直接畫100個連續點
y=k*x+b ##函數式
plt.plot(x,y,color="red",label=u"擬合直線",linewidth=2)
plt.legend(loc=3,prop=chinese) #繪制圖例
plt.show()

完整程序代碼:

import requests
from bs4 import BeautifulSoup
url='https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6'
def getHTMLText(url,timeout=30):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return'產生異常'
html=getHTMLText(url)
soup=BeautifulSoup(html,'html.parser')
print(soup.prettify())

#引入所需要到的第三方庫
import requests
from bs4 import BeautifulSoup
import pandas as pd
from pandas import DataFrame
import csv
#輸入所要爬取的網頁
url="https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6"
#偽裝爬蟲頭避免被檢測攔截
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
#請求網站
r=requests.get(url)
print(r.text)
#對頁面內容重新編碼
r.encoding=r.apparent_encoding
data=r.text
#使用BeautifulSoup
soup=BeautifulSoup(data,'html.parser')
#顯示網站結構
print(soup.prettify())
#解析網頁了解到熱搜排名和熱搜標題熱度分別放在兩個class當中,創建兩個個空列表
head=[]
index=[]
#把排名添加進空列表
for i in soup.find_all(class_="td-01 rank top"):
head.append(i.get_text().strip())
#把熱度標題添加進空列表
for k in soup.find_all(class_="td-02"):
index.append(k.get_text().strip())
data=[head,index]
print(data)
s=pd.DataFrame(data,index=["排名","標題\熱度數據"])
#將所得數據進行可視化
print(s.T)
#將數據保存至本地
S="D:\愛剪輯\\wbrs2.xlsx"
df=pd.DataFrame(data,index=["排名","標題\熱度數據"])
print(df.T)
df.T.to_excel(S)
#進行數據處理
print(df.isnull())
print(df.duplicated())
print(df.isna().head())
print(df.describe())
titanic=pd.DataFrame(pd.read_excel('D:\愛剪輯\\wbrs2.xlsx'))
titanic.drop_duplicates()
titanic.head()
#將保存至本地的數據加載到DataFrame中
wbrs2_df=pd.read_excel('D:\愛剪輯\\wbrs2.xlsx',sheet_name='Sheet1')
wbrs2_df.head()
wbrs2_df.describe()

#導入作圖所需的庫
import matplotlib
import pandas as pd
from matplotlib import pyplot as plt
#讀取並可視化數據
file_path="D:\愛剪輯\\wbrs2.xlsx"
df=pd.read_excel(file_path,name=['排名','標題','熱度數據'])
df.set_index('排名',inplace=True)
df.head()
print(df.head())
#做出數據前五散點圖
def Scatter_point():
x = ['羅志祥道歉','鍾南山說疫情擋不住航天豪情','純電動還是保時捷嗎','向往的生活定檔','宇宙第一次聽見中國聲音']
y = [5782383,1981852,1971252,1769837,1447369]
plt.scatter(x,y,color='red', s=25, marker="o")
plt.xlabel("熱搜標題")
plt.ylabel("熱搜熱度")
plt.title("熱搜標題與熱度散點圖")
plt.show()
Scatter_point()
#做出數據前五折線圖
def line_diagram():
x = ['羅志祥道歉','鍾南山說疫情擋不住航天豪情','純電動還是保時捷嗎','向往的生活定檔','宇宙第一次聽見中國聲音']
y = [5782383,1981852,1971252,1769837,1447369]
plt.xlabel('熱搜標題')
plt.ylabel('熱搜熱度')
plt.plot(x,y)
plt.scatter(x,y)
plt.title("熱搜標題與熱度折線圖")
plt.show()
line_diagram()
file_path="D:\愛剪輯\\wbrs2.xlsx"
#做出數據前五垂直柱狀圖
plt.rcParams['font.family']=['sans-serif']
plt.rcParams['font.sans-serif']=['SimHei']
plt.bar(['羅志祥道歉','鍾南山說疫情擋不住航天豪情','純電動還是保時捷嗎','向往的生活定檔','宇宙第一次聽見中國聲音'], [5782383,1981852,1971252,1769837,1447369])
plt.legend()
plt.xlabel("標題")
plt.ylabel("熱搜熱度")
plt.title('排名前五熱搜')
plt.show()

#保存圖像

plt.savefig(fname="D:/微博熱搜前五排行圖.jpg",figsize=[1,1])

#導入所需要的第三方庫用於做排名前五與熱度的回歸方程圖
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
#導入庫讀取爬取的數據前5
file_path="D:\愛剪輯\\wbrs2.xlsx"
df=pd.read_excel(file_path,name=['排名','標題與熱度'])
df.set_index('排名',inplace=True)
df.head()
print(df.head())
#設置相同的seed,每次生成的隨機數相同。如果不設置seed,則每次會生成不同的隨機數
np.random.seed(0)
chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
##樣本數據(Xi,Yi),需要轉換成數組(列表)形式
Xi=np.array([1,2,3,4,5])
Yi=np.array([5782383,1981852,1971252,1769837,1447369])
##需要擬合的函數func :指定函數的形狀 k= 0.42116973935 b= -8.28830260655
def fit_func(p,x):
k,b=p
return k*x+b
##偏差函數:x,y都是列表:這里的x,y和樣本數據Xi,Yi中是一一對應的
def error_func(p,x,y):
return fit_func(p,x)-y
#k,b的初始值,可以任意設定,但可以調整
p0=[1,20]
#使用leastsq()函數可以很快速地使用最小二乘法對數據進行擬合
Para=leastsq(error_func,p0,args=(Xi,Yi))
#讀取結果
k,b=Para[0] #k,b表示什么?
print("k=",k,"b=",b)
#畫樣本點
plt.figure(figsize=(8,6)) ##指定圖像比例: 8:6
plt.scatter(Xi,Yi,color="green",label=u"樣本數據",linewidth=2)
#畫擬合直線
x=np.linspace(150,190,100) ##在150-190直接畫100個連續點
y=k*x+b ##函數式
plt.plot(x,y,color="red",label=u"擬合直線",linewidth=2)
plt.legend(loc=3,prop=chinese) #繪制圖例
plt.show()

結論:經過對主題數據的分析可視化,可以更好地看出熱搜數據的體現,更簡單快捷地了解到數據,能更好地分析數據。

小結:通過對這次程序設計任務完成的情況,在程序設計的過程中,自己在python的許多方面的應用很生疏,需要多練,在python方面的知識儲備不足,導致需要大量的時間才能解決簡單的問題。

 


免責聲明!

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



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