爬取微博熱搜


一、主題式網絡爬蟲設計方案
1.主題式網絡爬蟲名稱

爬取微博熱搜
2.主題式網絡爬蟲爬取的內容與數據特征分析

爬取微博熱搜前十,熱度,排名。
3.主題式網絡爬蟲設計方案概述(包括實現思路與技術難點)

實現思路:確定爬取網頁,初始化信息,依靠request庫對目標頁面進行信息的爬取采集,用findall方法取標簽,將爬取數據保存到csv文件中。對數據進行清理處理,並對數據進行分析與可視化。

二、主題頁面的結構特征分析
1.主題頁面的結構與特征分析

2.Htmls頁面解析

三、網絡爬蟲程序設計
爬蟲程序主體要包括以下各部分,要附源代碼及較詳細注釋,並在每部分程序后面提供輸出結果的截圖。
1.數據爬取與采集

import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import re
#請求網頁
url = 'https://tophub.today/n/KqndgxeLl9'
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
response = requests.get(url,headers=headers)#發送get請求
html = response.content.decode('utf-8')#配置編碼
html = response.text
#print(html)
#解析網頁與抓取信息
titles = re.findall('<a href=.*? target="_blank" .*?>(.*?)</a>',html)[3:13]#正則表達
hot = re.findall('<td>(.*?)</td>',html)[0:10]
a = []#創建空列表
for i in range(10):
    a.append([i+1,titles[i],hot[i][:-1]])
#完成創建
file = pd.DataFrame(a,columns = ['排名','標題','熱度(單位:萬)'])
print(file)
file.to_csv('微博熱搜.csv')#保存文件

2.對數據進行清洗和處理

 

#使用read_excel方法讀取本地csv文件-微博熱搜.csv
rs = pd.DataFrame(pd.read_csv('微博熱搜.csv'))
rs.head()

#刪除無效列
rs.drop('熱度(單位:萬)',axis = 1,inplace=True)
rs.head()

#只顯示存在缺失值的行列,清楚確定缺失值位置
rs[rs.isnull().values==True].head()

#統計各列的空值情況
print('\n==各列的空值情況如下: ===')
rs.isnull().sum()

#查找重復值
rs.duplicated()

#統計缺失值NaN
rs.isna().head()

#使用describe查看統計信息
rs.describe()

3.數據分析與可視化(例如:數據柱形圖、直方圖、散點圖、盒圖、分布圖)

(1)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽
filename = '微博熱搜.csv'
colnames=["排名","熱度(單位:萬)","標題"]
df = pd.read_csv(filename,skiprows=1,names=colnames)
X=df.排名
Y=df.標題
#繪制散點圖
plt.scatter(X,Y,color='green',label="樣本數據",linewidth=2)
#繪制折線圖
plt.plot(X,Y,color='red',linewidth=2)
plt.xlabel("排名")
plt.ylabel("熱度(單位:萬)")
plt.grid()
plt.show()

(2)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#用來正常顯示中文標簽
data=np.array([431.3,135.5,128.0,114.0,112.8,97.0,95.5,93.1,89.9,89.3])
index=['1','2','3','4','5','6','7','8','9','10']
s = pd.Series(data,index)
s.name='微博熱搜條形圖'
s.plot(kind='bar',title='微博熱搜條形圖')
plt.xlabel(排名)
plt.ylabel(熱度)
plt.show()

 

(3)

import seaborn as sns 
rs = pd.read_csv('微博熱搜.csv')
sns.distplot(x,color="pink",bins=20,kde=True)
plt.xlabel("排名")
plt.ylabel("熱度")
plt.title("排名與熱度直方圖")
plt.show()

4.根據數據之間的關系,分析兩個變量之間的相關系數,畫出散點圖,並建立變量之間的回歸方程(一元或多元)

import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import matplotlib
from scipy.optimize import leastsq
filename = '微博熱搜.csv'
colnames=["排名","熱度(單位:萬)","標題"]
df = pd.read_csv(filename,skiprows=1,names=colnames)
X=df.排名
Y=df.標題
def fit_func(p,x):
    a,b,c=p
    return a*x*x+b*x+c
def error_func(p,x,y):
    return fit_func(p,x)-y
p0=[2,4,6]
para=leastsq(error_func,p0,args=(X,Y))
a,b,c=para[0]
plt.figure(figsize=(8,4))
plt.scatter(X,Y,color="pink",label=u"熱搜數據",linewidth=2)
x=np.linspace(0,25,20)
y=a*x*x+b*x+c
plt.plot(x,y,color="blue",label=u"擬合直線",linewidth=2)
plt.title("微博熱搜回歸方程")
plt.legend()
plt.show()

#使用corr()函數,判斷兩個屬性是否具有相關性
df['排名'].corr(df['標題'])

 

5.數據持久化

6.將以上各部分的代碼匯總,附上完整程序代碼

import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import re
#請求網頁
url = 'https://tophub.today/n/KqndgxeLl9'
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
response = requests.get(url,headers=headers)#發送get請求
html = response.content.decode('utf-8')#配置編碼
html = response.text
#print(html)
#解析網頁與抓取信息
titles = re.findall('<a href=.*? target="_blank" .*?>(.*?)</a>',html)[3:13]#正則表達
hot = re.findall('<td>(.*?)</td>',html)[0:10]
a = []#創建空列表
for i in range(10):
    a.append([i+1,titles[i],hot[i][:-1]])
#完成創建
file = pd.DataFrame(a,columns = ['排名','標題','熱度(單位:萬)'])
print(file)
file.to_csv('微博熱搜.csv')#保存文件


#使用read_excel方法讀取本地csv文件-微博熱搜.csv
rs = pd.DataFrame(pd.read_csv('微博熱搜.csv'))
rs.head()

#刪除無效列
rs.drop('熱度(單位:萬)',axis = 1,inplace=True)
rs.head()

#只顯示存在缺失值的行列,清楚確定缺失值位置
rs[rs.isnull().values==True].head()

#統計各列的空值情況
print('\n==各列的空值情況如下: ===')
rs.isnull().sum()

#查找重復值
rs.duplicated()

#統計缺失值NaN
rs.isna().head()

#使用describe查看統計信息
rs.describe()

#繪制散點圖和折線圖
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽
filename = '微博熱搜.csv'
colnames=["排名","熱度(單位:萬)","標題"]
df = pd.read_csv(filename,skiprows=1,names=colnames)
X=df.排名
Y=df.標題
#繪制散點圖
plt.scatter(X,Y,color='green',label="樣本數據",linewidth=2)
#繪制折線圖
plt.plot(X,Y,color='red',linewidth=2)
plt.xlabel("排名")
plt.ylabel("熱度(單位:萬)")
plt.grid()
plt.show()

#繪制條形圖
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#用來正常顯示中文標簽
data=np.array([431.3,135.5,128.0,114.0,112.8,97.0,95.5,93.1,89.9,89.3])
index=['1','2','3','4','5','6','7','8','9','10']
s = pd.Series(data,index)
s.name='微博熱搜條形圖'
s.plot(kind='bar',title='微博熱搜條形圖')
plt.xlabel(排名)
plt.ylabel(熱度)
plt.show()

#繪制直方圖
import seaborn as sns 
rs = pd.read_csv('微博熱搜.csv')
sns.distplot(x,color="pink",bins=20,kde=True)
plt.xlabel("排名")
plt.ylabel("熱度")
plt.title("排名與熱度直方圖")
plt.show()

#回歸方程
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import matplotlib
from scipy.optimize import leastsq
filename = '微博熱搜.csv'
colnames=["排名","熱度(單位:萬)","標題"]
df = pd.read_csv(filename,skiprows=1,names=colnames)
X=df.排名
Y=df.標題
def fit_func(p,x):
    a,b,c=p
    return a*x*x+b*x+c
def error_func(p,x,y):
    return fit_func(p,x)-y
p0=[2,4,6]
para=leastsq(error_func,p0,args=(X,Y))
a,b,c=para[0]
plt.figure(figsize=(8,4))
plt.scatter(X,Y,color="pink",label=u"熱搜數據",linewidth=2)
x=np.linspace(0,25,20)
y=a*x*x+b*x+c
plt.plot(x,y,color="blue",label=u"擬合直線",linewidth=2)
plt.title("微博熱搜回歸方程")
plt.legend()
plt.show()

#使用corr()函數,判斷兩個屬性是否具有相關性
df['排名'].corr(df['標題'])

 

四結論(10分)
1.經過對主題數據的分析與可視化,可以得到哪些結論?

通過對數據的分析與可視化,可以清楚的展現出微博熱搜排名與熱度的變化,更直觀的體現熱度的變化。
2.對本次程序設計任務完成的情況做一個簡單的小結。

通過此次的設計作業,學習到了細心和耐心,也一定程度上加深了我對python網絡爬蟲的了解,也對爬蟲更加的感興趣,發現爬取的數據更能真實反映出數據變化。對於此次設計作業,一開始代碼出現很多問題,通過不斷的回看上課視頻,查找資料,慢慢的能夠實質上的解決,但仍有很多不足之處。對於xpath,正則表達等不能很好地處理。

 

 


免責聲明!

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



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