微博热搜榜前20信息数据爬取进行数据分析与可视化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微博热搜榜前20信息数据爬取进⾏数据分析与可视化
⼀、设计⽅案
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的知识,通过本次任务提⾼了对代码的掌握程度,并且在完
成任务的过程中提⾼了实践能⼒,也是为以后编写代码打下⼀点基础。