一、設計方案
1.主題式網絡爬蟲名稱:微博熱搜榜前20信息數據爬取進行數據分析與可視化
2.爬取內容與數據特征分析:爬取微博熱搜榜前20熱搜事件、排名與熱度,數據呈一定規律排序。
3.設計方案概述:思路:首先打開目標網站,運用開發工具查看源代碼,尋找數據標簽,通過寫爬蟲代碼獲取所要的數據,將數據保存為csv或者xlsx文件,讀取文件對數據進行數據清洗處理、可視化等操作。
難點:網站數據的實時更新,信息容易變動;重點在於尋找數據標簽;對數據整理、可視化等代碼的掌握程度較低,需要觀看以往視頻或者上網搜索,進度慢。
二、主題頁面的結構特征分析
1.主題頁面的結構與特征:通過分析頁面得知所要獲取的數據分布於a標簽中,td為熱度標簽。
2.Htmls頁面解析
3.節點(標簽)查找方法與遍歷方法:通過re模塊的findall方法進行查找。
三、程序設計
1.數據爬取與采集
import re import requests import pandas as pd #爬取網站 url = 'https://tophub.today/n/KqndgxeLl9' #偽裝爬蟲 headers = {'user-Agent':""} #抓取網頁信息 response=requests.get(url,headers=headers,timeout=30) response = requests.get(url,headers = headers) #爬取內容 html = response.text titles = re.findall('<a href=".*?">.*?(.*?)</a>',html)[4:24] heat = re.findall('<td>(.*?)</td>',html)[:20] x = {'標題':titles,'熱度':heat} y = pd.DataFrame(x) #創建空列表 data=[] for i in range(20): #拷貝數據 data.append([i+1,titles[i],heat[i][:]]) #建立文件 file=pd.DataFrame(data,columns=['排名','熱搜事件','熱度(萬)']) print(file) #保存文件 file.to_excel('D:\\bbc\\微博熱搜榜.xlsx')
2.對數據進行清洗和處理
#讀取文件 df = pd.DataFrame(pd.read_excel('微博熱搜榜.xlsx')) df.head()
#缺失值處理 df.isnull().head() #True為缺失值,False為存在值
#空值處理# df.isnull().sum() #0表示無空值
#查找重復值 df.duplicated() #顯示表示已經刪除重復值
#查看統計信息 df.describe()
3.文本分析:無法安裝wordcloud庫
4.數據分析與可視化
#繪制條形圖 df = pd.read_excel('微博熱搜榜.xlsx') x = df['排名'] y = df['熱度(萬)'] plt.xlabel('排名') plt.ylabel('熱度(萬)') plt.bar(x,y) plt.title("微博熱搜排名與熱度條形圖") plt.show()
#繪制折線圖 df = pd.read_excel('微博熱搜榜.xlsx') x = df['排名'] y = df['熱度(萬)'] plt.xlabel('排名') plt.ylabel('熱度(萬)') plt.plot(x,y,color="blue",label="折線") plt.title("微博熱搜排名與熱度折線圖") plt.legend() plt.show()
#繪制散點圖 df = pd.read_excel('微博熱搜榜.xlsx') 排名 = (df['排名']) 熱度 = (df['熱度(萬)']) plt.figure(figsize=(6,5)) plt.scatter(排名,熱度,label=u"樣本數據",linewidth=2) plt.title("微博熱搜排名與熱度散點圖",color="green") plt.xlabel("排名") plt.ylabel("熱度(萬)") plt.legend() plt.grid() plt.show()
5.根據數據之間的關系,分析兩個變量之間的相關系數,畫出散點圖,並建立變量之間的回歸方程
#線性關系散點圖 df = pd.DataFrame(pd.read_excel('微博熱搜榜.xlsx')) sns.lmplot(x="排名",y= "熱度(萬)",data=df)
#回歸方程曲線圖 df = pd.DataFrame(pd.read_excel('微博熱搜榜.xlsx')) q = df['排名'] w = df['熱度(萬)'] def func(p,x): a,b,c=p return a*x*x+b*x+c def error_func(p,x,y): return func(p,x)-y p0=[0,0,0] Para=leastsq(error_func,p0,args=(q,w)) a,b,c=Para[0] plt.figure(figsize=(12,6)) plt.scatter(q,w,color="blue",label=u"熱度散點",linewidth=2) x=np.linspace(0,20,15) y=a*x*x+b*x+c plt.plot(x,y,color="green",label=u"回歸方程曲線",linewidth=2) plt.xlabel("排名") plt.ylabel("熱度(萬)") plt.title("微博熱搜排名與熱度回歸曲線圖") plt.legend() plt.show()
6.代碼匯總
import re import requests import pandas as pd import seaborn as sns import numpy as np from numpy import genfromtxt import scipy as sp import matplotlib.pyplot as plt from scipy.optimize import leastsq plt.rcParams['font.sans-serif']=['SimHei']#用來正常顯示中文 plt.rcParams['axes.unicode_minus']=False#用來正常顯示負號 #爬取網站 url = 'https://tophub.today/n/KqndgxeLl9' #偽裝爬蟲 headers = {'user-Agent':""} #抓取網頁信息 response=requests.get(url,headers=headers,timeout=30) response = requests.get(url,headers = headers) #爬取內容 html = response.text titles = re.findall('<a href=".*?">.*?(.*?)</a>',html)[4:24] heat = re.findall('<td>(.*?)</td>',html)[:20] x = {'標題':titles,'熱度':heat} y = pd.DataFrame(x) #創建空列表 data=[] for i in range(20): #拷貝數據 data.append([i+1,titles[i],heat[i][:]]) #建立文件 file=pd.DataFrame(data,columns=['排名','熱搜事件','熱度(萬)']) print(file) #保存文件 file.to_excel('D:\\bbc\\微博熱搜榜.xlsx') #讀取csv文件 df = pd.DataFrame(pd.read_excel('微博熱搜榜.xlsx')) df.head() #缺失值處理 df.isnull().head() #True為缺失值,False為存在值 #空值處理# df.isnull().sum() #0表示無空值 #查找重復值 df.duplicated() #顯示表示已經刪除重復值 #查看統計信息 df.describe() #繪制條形圖 df = pd.read_excel('微博熱搜榜.xlsx') x = df['排名'] y = df['熱度(萬)'] plt.xlabel('排名') plt.ylabel('熱度(萬)') plt.bar(x,y) plt.title("微博熱搜排名與熱度條形圖") plt.show() #繪制折線圖 df = pd.read_excel('微博熱搜榜.xlsx') x = df['排名'] y = df['熱度(萬)'] plt.xlabel('排名') plt.ylabel('熱度(萬)') plt.plot(x,y,color="blue",label="折線") plt.title("微博熱搜排名與熱度折線圖") plt.legend() plt.show() #繪制散點圖 df = pd.read_excel('微博熱搜榜.xlsx') 排名 = (df['排名']) 熱度 = (df['熱度(萬)']) plt.figure(figsize=(6,5)) plt.scatter(排名,熱度,label=u"樣本數據",linewidth=2) plt.title("微博熱搜排名與熱度散點圖",color="green") plt.xlabel("排名") plt.ylabel("熱度(萬)") plt.legend() plt.grid() plt.show() #線性關系散點圖 df = pd.DataFrame(pd.read_excel('微博熱搜榜.xlsx')) sns.lmplot(x="排名",y= "熱度(萬)",data=df) #回歸方程曲線圖 df = pd.DataFrame(pd.read_excel('微博熱搜榜.xlsx')) q = df['排名'] w = df['熱度(萬)'] def func(p,x): a,b,c=p return a*x*x+b*x+c def error_func(p,x,y): return func(p,x)-y p0=[0,0,0] Para=leastsq(error_func,p0,args=(q,w)) a,b,c=Para[0] plt.figure(figsize=(12,6)) plt.scatter(q,w,color="blue",label=u"熱度散點",linewidth=2) x=np.linspace(0,20,15) y=a*x*x+b*x+c plt.plot(x,y,color="green",label=u"回歸方程曲線",linewidth=2) plt.xlabel("排名") plt.ylabel("熱度(萬)") plt.title("微博熱搜排名與熱度回歸曲線圖") plt.legend() plt.show()
四、結論
1.結論:對主題數據的分析與可視化,能將數據變的更加直觀,更加容易觀察出數據的規律、關系等。此次微博熱榜的排名和熱度是呈正比的,但其實事件內容才是吸引大眾的關鍵因素。總之數據發分析與可視化直觀的展示信息的分析結果與構思,令抽象的數據具體化,便於我們觀察。
2.任務小結:本次程序設計任務完成時間較久,也是在一步一步學習熟悉python的知識,通過本次任務提高了對代碼的掌握程度,並且在完成任務的過程中提高了實踐能力,也是為以后編寫代碼打下一點基礎。