爬取微博热搜榜并进行数据分析

news2024/12/22 17:07:01

设计方案

爬虫爬取的内容

:爬取微博热搜榜数据。

网络爬虫设计方案概述

用requests库访问页面用get方法获取页面资源,登录页面对页面HTML进行分析,用beautifulsoup库获取并提取自己所需要的信息。再讲数据保存到CSV文件中,进行数据清洗,数据可视化分析,绘制数据图表,并用最小二乘法进行拟合分析。

主题页面的结构特征分析

1.主题页面的结构与特征分析

:通过观察页面HTML源代码,可以发现每个热搜名称的标题都位于"td",class_='td-02’标签的子标签中,热度和排名则分布在"td",class_='td-03’和"td",class_='td-01’标签中,他们的关系是 class>a>span。按照标签的从属关系 可从标签中遍历出我们所需要的内容。

2.Htmls页面解析

通过页面定位分析发现这是标题所在标签位置,td",class_='td-02“的子标签a 中,我们可以通过find all 函数来提取我们所需要的标题信息
在这里插入图片描述
继续审查页面元素 发现热度和排名所在的标签位置,查到所需要的内容的标签位置后,就可以开始编写爬虫程序了
在这里插入图片描述
在这里插入图片描述

三、网络爬虫程序设计

1.数据爬取与采集

import requests
from bs4 import BeautifulSoup
import bs4
#定义函数第一步从网络上获取热搜排名网页内容
url = "https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6"
def getHTMLText(url):
    try:
        #设置表头信息
        kv={"User-Agent":"Mozilla/5.0"} 
        r = requests.get(url, headers=kv, timeout=30)  #请求时间30s
        # 解决乱码问题
        r.raise_for_status() 
        r.encoding=r.apparent_encoding  #修改编码方式
        return r.text
    except:
        return ""  #若出现异常则会返回空字符串
#使用BeautifulSoup工具解析页面
html = getHTMLText(url)
soup=BeautifulSoup(html,'html.parser')
# 爬取热搜名字
sou = soup.find_all("td",class_='td-02')
#创立空列表 把热搜名字数据填入
name = []
for x in sou:
    name.append(x.a.string)
# 获取热度排名 
# 同理创立空列表
paiming = []
top = soup.find_all('span')
for y in top:
    paiming.append(y.string)
#用字符串格式化输出数据
print('{:^40}'.format('微博热搜'))
print('{:^15}\t{:^25}\t{:^40}'.format('排名', '热搜内容', '热度'))
list = []
#输出数据的前20条
for i in range(21):
    print('{:^15}\t{:^25}\t{:^40}'.format(i+1, name[i], paiming[i]))
    list.append([i+1,name[i],paiming[i]])
#用pandas对数据进行储存,并生成文件
df= pd.DataFrame(list,columns = ['排名','热搜内容','热度'])
df.to_csv('resou.csv')

在这里插入图片描述
生成文件
在这里插入图片描述

2.对数据进行清洗和处理

读取文件


df = pd.DataFrame(pd.read_csv('resou.csv'))
#输出信息
print(df)

在这里插入图片描述
开始进行数据清洗
删除无效列与行


df.drop('热搜内容', axis=1, inplace = True)
df.head() #输出数据前五行

在这里插入图片描述
检查是否有重复值


df.duplicated() 

在这里插入图片描述
检查是否有空值


print(df['热度'].isnull().value_counts())
#若有则删除缺失值
df[df.isnull().values==True]
df.corr()

在这里插入图片描述
将数据统计信息打印出来

df.describe()

在这里插入图片描述

3.数据分析与可视化

继续数据分析与可视化
构建线性回归预测模型


from sklearn.linear_model import LinearRegression
X = df.drop("热度", axis = 1)
predict_model = LinearRegression()
predict_model.fit(X, df['排名'])    #训练模型
print("回归系数为:", predict_model.coef_)   # 判断相关性

在这里插入图片描述
绘制散点图


import matplotlib.pyplot as plt
from scipy.optimize import leastsq
import numpy as np
%matplotlib inline  
排名 = (df["排名"])
热度 = (df["热度"])
plt.rcParams['font.sans-serif']=['SimHei'] #用于正常显示中文标签
plt.figure(figsize=(8,5))
plt.scatter(排名,热度,color=[0,0,1,0.4],label=u"样本数据",linewidth=2)  #颜色用RGB值
plt.title("排名 scatter",color="blue")
plt.xlabel("排名")
plt.ylabel("热度")
plt.legend()
plt.grid()
plt.show()

在这里插入图片描述
回归散点图


import seaborn as sns
sns.regplot(df.排名,df.热度)
plt.title('排名热度回归散点图')

在这里插入图片描述
绘制柱状图


plt.figure()
x=np.arange(0,20)
y=df.loc['1':'20','热度']  #选取画图数据范围
plt.bar(x, y,color='c',alpha=0.5) #增加透明度 使图更加美观
plt.xlabel('排名')
plt.ylabel('热度')
plt.title("热搜数据")
plt.show()

在这里插入图片描述
绘制折线图


plt.figure()
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
x=np.arange(0,20)
y=df.loc['1':'20','热度']  #选取画图数据范围
plt.plot(x, y,'r-o',color='blue')
plt.xlabel('排名')
plt.ylabel('热度')
plt.title("热搜数据")
plt.show()

在这里插入图片描述
绘制盒图


def box():
    plt.title('热度与排名盒图')
    sns.boxplot(x='排名',y='热度', data=df)
box()

在这里插入图片描述
用Seaborn绘制各种分布图


import seaborn as sns
sns.jointplot(x="排名",y='热度',data = df, kind='kde', color='r')
sns.jointplot(x="排名",y='热度',data = df, kind='hex')
sns.distplot(df['热度'])

在这里插入图片描述
绘制单核密度图


sns.kdeplot(df['热度'])

在这里插入图片描述
绘制排名与热度的回归图


sns.regplot(df.排名,df.热度)

在这里插入图片描述

4…根据排名与热度数据之间的关系,分析两个变量拟合一元二次曲线,建立变量之间的回归方程

# 用最小二乘法得出一元二次拟合方程
import numpy as np
from numpy import genfromtxt
import scipy as sp
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
plt.figure(figsize=(13,6))
plt.scatter(排名,热度,color=[0,0,0.8,0.4],label=u"样本数据",linewidth=2)
plt.xlabel("排名")
plt.ylabel("热度")
plt.legend()
def func(p,x):
    a,b,c=p
    return a*(x**2)+(b*x)+c
def er_func(p,x,y):
    return func(p,x)-y
p0=[2,3,4]
P=leastsq(er_func,p0,args=(排名,热度))
a,b,c=P[0]
x=np.linspace(0,55,100)
y=a*(x**2)+(b*x)+c
plt.plot(x,y,color=[0,0,0.8,0.4],label=u"拟合直线",linewidth=2)
plt.scatter(x,y,color="c",label=u"样本数据",linewidth=2)
plt.legend()
plt.title('排名热度回归曲线')
plt.grid()
plt.show()

在这里插入图片描述

5.完整程序代码

import requests
from bs4 import BeautifulSoup
import bs4
import pandas as pd   #引入pandas用于数据可视化
from pandas import DataFrame
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
from sklearn.linear_model import LinearRegression
#定义函数第一步从网络上获取热搜排名网页内容
url = "https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6"
def getHTMLText(url):
    try:
        #设置表头信息
        kv={"User-Agent":"Mozilla/5.0"} 
        r = requests.get(url, headers=kv, timeout=30)  #请求时间30s
        # 解决乱码问题
        r.raise_for_status() 
        r.encoding=r.apparent_encoding  #修改编码方式
        return r.text
    except:
        return ""  #若出现异常则会返回空字符串


#使用BeautifulSoup工具解析页面
html = getHTMLText(url)
soup=BeautifulSoup(html,'html.parser')


# 爬取热搜名字
sou = soup.find_all("td",class_='td-02')


#创立空列表 把热搜名字数据填入
name = []
for x in sou:
    name.append(x.a.string)


# 获取热度排名 
# 同理创立空列表
paiming = []
top = soup.find_all('span')
for y in top:
    paiming.append(y.string)


#用字符串格式化输出数据
print('{:^40}'.format('微博热搜'))
print('{:^15}\t{:^25}\t{:^40}'.format('排名', '热搜内容', '热度'))
list = []


#输出数据的前20条
for i in range(21):
    print('{:^15}\t{:^25}\t{:^40}'.format(i+1, name[i], paiming[i]))
    list.append([i+1,name[i],paiming[i]])


#用pandas对数据进行储存,并生成文件
df= pd.DataFrame(list,columns = ['排名','热搜内容','热度'])
df.to_csv('resou.csv')


#读取文件
df = pd.DataFrame(pd.read_csv('resou.csv'))
#输出信息
print(df)


#开始进行数据清洗
#删除无效列与行
df.drop('热搜内容', axis=1, inplace = True)
df.head() #输出数据前五行



#检查是否有重复值
df.duplicated()   


#检查是否有空值
print(df['热度'].isnull().value_counts())
#若有则删除缺失值
df[df.isnull().values==True]
df.corr()


# 将数据统计信息打印出来
df.describe()


#进行数据分析与可视化
X = df.drop("热度", axis = 1)
predict_model = LinearRegression()
predict_model.fit(X, df['排名'])    #训练模型
print("回归系数为:", predict_model.coef_)   # 判断相关性



#绘制散点图
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
import numpy as np
%matplotlib inline  
排名 = (df["排名"])
热度 = (df["热度"])
plt.rcParams['font.sans-serif']=['SimHei'] #用于正常显示中文标签
plt.figure(figsize=(8,5))
plt.scatter(排名,热度,color=[0,0,1,0.4],label=u"样本数据",linewidth=2)  #颜色用RGB值
plt.title("排名 scatter",color="blue")
plt.xlabel("排名")
plt.ylabel("热度")
plt.legend()
plt.grid()
plt.show()


#回归散点图
import seaborn as sns
sns.regplot(df.排名,df.热度)
plt.title('排名热度回归散点图')


#绘制柱状图
plt.figure()
x=np.arange(0,20)
y=df.loc['1':'20','热度']  #选取画图数据范围
plt.bar(x, y,color='c',alpha=0.5) #增加透明度 使图更加美观
plt.xlabel('排名')
plt.ylabel('热度')
plt.title("热搜数据")
plt.show()


# 绘制折线图
plt.figure()
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
x=np.arange(0,20)
y=df.loc['1':'20','热度']  #选取画图数据范围
plt.plot(x, y,'r-o',color='blue')
plt.xlabel('排名')
plt.ylabel('热度')
plt.title("热搜数据")
plt.show()


#绘制盒图
def box():
    plt.title('热度与排名盒图')
    sns.boxplot(x='排名',y='热度', data=df)
box()


#用Seaborn绘制各种分布图
sns.jointplot(x="排名",y='热度',data = df, kind='kde', color='r')
sns.jointplot(x="排名",y='热度',data = df, kind='hex')
sns.distplot(df['热度'])


# 绘制单核密度图
sns.kdeplot(df['热度'])


#绘制排名与热度的回归图
sns.regplot(df.排名,df.热度)


# 用最小二乘法得出一元二次拟合方程
plt.figure(figsize=(13,6))
plt.scatter(排名,热度,color=[0,0,0.8,0.4],label=u"样本数据",linewidth=2)
plt.xlabel("排名")
plt.ylabel("热度")
plt.legend()
def func(p,x):
    a,b,c=p
    return a*(x**2)+(b*x)+c
def er_func(p,x,y):
    return func(p,x)-y
p0=[2,3,4]
P=leastsq(er_func,p0,args=(排名,热度))
a,b,c=P[0]
x=np.linspace(0,55,100)
y=a*(x**2)+(b*x)+c
plt.plot(x,y,color=[0,0,0.8,0.4],label=u"拟合直线",linewidth=2)
plt.scatter(x,y,color="c",label=u"样本数据",linewidth=2)
plt.legend()
plt.title('排名热度回归曲线')
plt.grid()
plt.show()

四、结论

1.通过对热搜主题的数据分析与可视化的回归曲线可以看出 热度和排名是成正相关的,数据的可视化与图表可以清晰明了的将数据的关系体现出来,让我们直观的了解热度和排名的变化。

2.此次程序设计对于我来还是有难度的,初期对HTML页面的不熟悉,我不断的去查阅资料和视频一次次的去解决,通过这次设计我了解学习了BeautifulSoup库的使用,BeautifulSoup库在用于HTML解析和提取相关信息方面是非常厉害的,BeautifulSoup库的学习对以后的爬虫设计上很有帮助

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/790933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《深度探索c++对象模型》第二章笔记

非原创,在学习 目录 2 构造函数语意学(The Semantics of Constructors) 2.1 Default Constructor的构建操作 “带有Default Constructor”的Member Class Object “带有Default Constructor”的Base Class “带有一个Virtual Function”的Class “带有一个Virtu…

机器学习深度学习——向量求导问题

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——图像分类数据集 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮助…

【低代码专题方案】iPaaS运维方案,助力企业集成平台智能化高效运维

01 场景背景 随着IT行业的发展和各家企业IT建设的需要,信息系统移动化、社交化、大数据、系统互联、数据打通等需求不断增多,企业集成平台占据各个企业领域,成为各业务系统数据传输的中枢。 集成平台承接的业务系统越多,集成平台…

详解zookeeper安装使用

目录 1.概述 1.1.功能 1.2.特点 1.3.数据结构 2.安装 2.1.Windows 2.2.Linux 3.基础操作 3.1.增 3.2.删 3.3.改 3.4.查 3.5.监听 4.JAVA操作Zookeeper 4.1.依赖 4.2.客户端 4.3.增 4.4.删 4.5.查 4.6.改 1.概述 1.1.功能 zookeeper,Apache旗下…

pytorch:使用tensorboardX可视化网络模型时add_graph位置报错

1.报错信息 TypeError: graph() got an unexpected keyword argument ‘use_strict_trace’ 提示 graph()这个函数多了一个参数’use_strict_trace’; 也觉得应该是tensorboardX版本问题,但uninstall 再insatall之后也不行,用另一台机子也…

STM32H5开发(3)----电源控制RCC

STM32H5开发----3.电源控制&RCC STM32H503 供电STM32H562/563/573 LDO 供电STM32H562/563/573 SMPS供电LDO/SMPS 供电PWR 特性电源电压监测温度监测低功耗模式低功耗模式-SLEEP 模式低功耗模式-STOP 模式低功耗模式-STANDBY模式低功耗模式监控管脚VBAT模式复位触发源时钟源…

主机漏洞利用演示MS17-010(永恒之蓝)

ms17-010危害:对被攻击方的电脑造成蓝屏! 申明:本篇文章的用意仅做学习使用 网络搭建环境: 软件:Vmware Workstation 17 攻击机:Kali 靶机环境:Windows 7 Nmap软件的基本功能: …

渐进式网络恢复调研

渐进式网络恢复调研 问题定义(PNR) 如果发生重大网络中断(例如由地震、洪水等大规模灾害),运营商必须通过一系列修复步骤来恢复其网络基础设施。优化这个序列以在恢复过程中最大化提供的服务数量的问题通常称为渐进式网络恢复&a…

Phong光照模型原理及着色器实现

现实世界中的照明极其复杂,取决于太多因素,我们无法以有限的处理能力来计算这些因素。 因此,OpenGL 中的光照基于使用简化模型的现实近似值,这些模型更容易处理并且看起来相对相似。 这些照明模型基于我们所理解的光物理学。 其中…

桥接模式-处理多维度变化

程序员小名去摆摊卖奶茶了,口味有香、甜。 型号有大、中、小。假如小名先在家里把这些奶茶装好,那么最少要装2x3 6杯奶茶,如果此时新增一个口味:酸,那么就需要多装3杯奶茶了。而且这样做,等客户买走一种&a…

c++网络编程:Boost.asio源码剖析

1、前言 Boost库是一个可移植、提供源代码的C库,作为标准库的后备,是C标准化进程的开发引擎之一。Boost库由C标准委员会库工作组成员发起,其中有些内容有望成为下一代C标准库内容。在C社区中影响甚大,是不折不扣的“准”标准库。…

HCIA练习4

题目如下: 目录 第一步:IP的规划 第二步:缺省路由 第三步:开启telnet 第四步:编写ACL表 第五步:测试 思路分析: 华为默认允许所有,所以我们可以先写拒绝要求,再写允…

MobaXterm通过SSH访问Ubuntu服务器遇到的一个问题

在Windows下的MobaXterm界面配置完ubuntuIP以后显示access denied,排查发现是因为在ubuntu那边忘记安装了SSH Serve,安装过程如下: 第一步:安装所需包 让我们从打开终端输入一些必要命令开始。 注意,在安装新的包或…

【独家解答】面试题曝光:Spring容器中的Bean会不会被GC?

大家好,我是你们的小米!今天,我们来聊一个有关Spring容器中的Bean的话题,也是面试中经常被问到的问题:“Spring 容器中的Bean是否会被GC呢?为什么?”让我们一起揭开这个神秘的面纱,解…

记录一次软件安全测试过程

一.前言 xx的安测已经过去一段时间了,这两天xx需求刚发布。xx的外呼需求文档还没确定,所以趁着这个时间,进行一下复盘。这次xx安测,全程参与,经历了3轮,从5月份开始,到6月底正式通过安测,实属不易。安测主要分为漏洞扫描、越权扫描、日志审查、软件版本基线检查下面也将…

Visual Studio 2022 程序员必须知道高效调试手段与技巧(上)

🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 📋 前言💬 什么是bug?💬 调试是什么?有多重要&#x…

css设置八等分圆

现需要上图样式的布局,我通过两张向右方的图片,通过定位和旋转完成了布局。 问题: 由于是通过旋转获取到的样式,实际的盒子是一个长方形,当鼠标移入对应的箭头时选中的可能是其他盒子,如第一张设计稿可以看…

uniapp 语音文本播报功能

最近uniapp项目上遇到一个需求 就是在接口调用成功的时候加上语音播报 , ‘创建成功’ ‘开始成功’ ‘结束成功’ 之类的。 因为是固定的文本 ,所以我先利用工具生成了 文本语音mp3文件,放入项目中,直接用就好了。 这里用到的工…

Android adb shell 查看App内存(java堆内存/vss虚拟内存/详细的内存状况/内存快照hprof)和系统可用内存

1.adb shell 获取app 进程的pid adb shell "ps|grep com.xxx包名"根据某个渠道包,去查询对应的pid,如下所示: 2.通过adb shell 查看设备的java dalvik 堆内存的最大值 执行命令行: adb shell getprop dalvik.vm.h…

【Java SE】继承与多态

目录 【1】继承 【1.1】为什么要继承 【1.2】继承概念 【1.3】继承的语法 【1.4】父类成员访问 【1.4.1】子类中访问父类的成员变量 【1.4.2】子类中访问父类的成员变量 【1.5】super关键字 【1.6】子类构造方法 【1.7】super和this 【1.8】再谈初始化 【1.9】prot…