Python微博动态爬虫

本文是刘金路的《语言数据获取与分析基础》第十章的扩展,详细解释了如何利用Python进行微博爬虫,爬虫内容包括微博指定帖子的一级评论、评论时间、用户名、id、地区、点赞数。

整个过程十分明了,就是用户利用代码模拟Ajax请求,发送给服务器,服务器再处理该请求,返回相应的数据,最后在页面进行渲染。

本文所使用的第三方库有requests、openpyxl,请先自行安装。

偷懒的读者可以直接跳到第七章,直接复制代码运行。

效果图

2cef40a463764c738aca9f1e53c54a71.png

文章目录

???一、基本流程

???二、查看全部评论

???三、找到评论的数据接口

???四、分析数据接口内容

???五、获取内容

???六、批量获取内容

???七、完整代码

???八、微博的限制

8.1 评论数量的限制

8.2 访问的限制


一、基本流程

我们正常使用浏览器上网,通过前端浏览器这一用户界面方便地输入网址、点击链接等,相当于发送了HTTP请求,后端再进行数据返回。

而爬虫是通过代码模拟浏览器发送请求,请求的内容包含headers、cookies等自定义信息,而这些信息浏览器本身就自带的,所以我们正常上网就没必要考虑这么多。在发送请求后,如果服务器能正常响应,就会返回海量看似杂乱的数据。最后,我们需要解析这些数据,得到我们想要的。

模拟浏览器发送请求,我们使用Python的第三方库,requests库。下面我们对百度(https://www.baidu.com)进行访问。

import requestsurl = 'https://www.baidu.com'    response = requests.get(url=url)    #发送请求print(response.status_code)    #若结果返回200则表示正常
print(response.text)            #请求获得源代码

仔细观察返回内容可以发现内容不仅少,而且出现了乱码“o| °±¥é”,这是因为我们没有对请求进行伪装,被响应端发现了。因此我们需要再加上一些额外的自定义信息。

import requestsurl = 'https://www.baidu.com'headers={
'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.5.11051 SLBChan/10 SLBVPV/64-bit',
}response = requests.get(url=url,headers=headers)    #发送请求print(response.status_code)    #若结果返回200则表示正常
print(response.text)

其中的’User-agent’即用户代理,包含了用户所使用的操作系统版本、浏览器版本等信息。通过增加了headers(头部信息),瞒过了响应端,因此能正常返回源代码。

————————————————————————————————————————

上述情景只适用于静态网页,即所需要的信息在源代码里。

然而在我们进行微博评论爬虫的时候,我们所需要的数据并不在源代码内,而是动态加载的。

二、查看全部评论

以易烊千玺微博的最新帖子为例,我们需要点击查看全部评论,就会跳转到一个新的页面。

0af826a431e446939b99186cd1ecfeaa.png

鼠标右键<检查>或按F12打开浏览器的开发者模式,并勾选Disable cache(禁用缓存)。

刷新页面,如图,Name栏下有各种各样的数据接口,储存着不同的数据,我们的目的就是找到我们需要的数据接口,并拿到接口下的数据。

37741df8d30747a8987f6ff7ed9fa9ea.png

三、找到评论的数据接口

既然有这么多数据接口,那怎么找到我们需要的呢?最简单的方法就是复制评论一部分内容。复制了“祝全世界最帅的千千宝贝生日快乐”后,点击放大镜图标,再在左侧一列粘贴该内容,点击刷新图标。之后,双击接口,再点击Preview。

Preview内的数据是以json格式化展示,简明易读。黑色小三角形功能类似目录,可以进行展开、折叠。

7c5aef34b1f748398221729186db7c7d.png

四、分析数据接口内容

点开’data’后,可以发现有0-19条数据,里面的格式高度地统一,依次点开几个可以发现,我们需要的id、评论等数据都存储在一种类似Python字典格式的键值对里。

cf543390dc2347f5ae0fc3f06d5b84b4.jpeg

五、获取内容

首先进行伪装,即自定义请求信息,其中重要的包括’User-agent’、‘referer’(防盗链)、‘cookie’,不同网站有不同的限定。需要登陆的网站一般都要用到cookie,网站通过它识别用户登录身份。现在我们来找到自己的这些数据。

在上一步的浏览器开发者工具中,如图,我们复制这些数据。代码中的params与帖子有关,在开发者工具的Payload内,全部复制粘贴即可。

20eb774acffe4ab8a9493f7cd4edfc07.png

import requests
headers={
'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.5.11051 SLBChan/10 SLBVPV/64-bit',
#自行更改
'referer':'https://weibo.com/2653906910/P2d23mO3l', 
#自行更改
'cookie':'SINAGLOBAL=2437751658391.7534.1732613052480; XSRF-TOKEN=S9eYHPNYBb4EA4CdIq_CsaWG; SCF=AnvWdOkk8nI9JwyZmH86cW9gt7wNLX4DFiQqFt3_n9fGf4sNBNG7XKR5z9qPUIumCMmBA3d_mSh_9zSSYO2KkA8.; SUB=_2A25KQtf1DeRhGeFJ7VoX8ifNzj2IHXVpPlU9rDV8PUNbmtAbLRj1kW9Nf1irkxLTL3bKCn4suSuV-7E8sDlud4Jz; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W5vESPCc8VG.fle.Bw7Y00g5JpX5KzhUgL.FoMNSonceo.pSK22dJLoIEqLxKqL1KzL1K-LxKnLBKeL1hzLxK-LBKBLBKMLxK-L1-eLBoWjd5tt; ALF=02_1735275685; _s_tentry=weibo.com; Apache=9101971672823.17.1732683724233; ULV=1732683724323:2:2:2:9101971672823.17.1732683724233:1732613052488; WBPSESS=KeGgzHFKbGYlLSsXAQi6w6yIVnFklCB92g9IEwKcT6IFw9t3w4GlWYLNWnobudclqNZRGUlNn00rwRSM5bdBO4FLz3Qf7TPT6G0fBQoHQ4hZcFJP5XODD1aum01okGffqFku3aTug5eregoCSIz73Q=='}   
params ={'is_reload':'1','id': '5105261544737539','is_show_bulletin': '2','is_mix':'0','count':'10','uid': '3623353053','fetch_level': '0','locale': 'zh-CN',
}
response = requests.get('https://weibo.com/ajax/statuses/buildComments', params=params,headers=headers)for i in range(len(response.json()['data'])-1):time = response.json()['data'][i]['created_at']id = response.json()['data'][i]['id']comment = response.json()['data'][i]['text_raw']area = response.json()['data'][i]['source']like_counts = response.json()['data'][i]['like_counts']print(time)print(id)print(comment)print(area)print(like_counts)

偷懒点,读者只需要将cookie、referer更换为自己的就可以了。

六、批量获取内容

但是这些数量很少,于是我们就可以猜想,会不会其他的数据在类似名称的数据接口里?为了试验是否该帖子下的评论数据全部存储在以buildComments…为名的数据接口下,我们可以下拉评论区以便产生更多数据接口。在右侧的Filter输入框内输入buildComments,就能从海量数据接口中过滤出名称为buildComments的数据接口,如图。

1548e3157f91465aa6a88affcdd6937b.png

我们可以在Headers(HTTP请求头)内找到Request URL(请求网址),打开该网址,我们可以看到密密麻麻的海量数据,这些数据便是Preview内展开后的数据。

c4d49fd853ee4820bf00e05355324e18.png

依次复制前几个URL,如下:

https://weibo.com/ajax/statuses/buildCommentsis_reload=1&id=5105473521456009&is_show_bulletin=2&is_mix=0&count=10&uid=3623353053&fetch_level=0&locale=zh-CN

https://weibo.com/ajax/statuses/buildCommentsis_reload=1&id=5105473521456009&is_show_bulletin=2&is_mix=0&max_id=4998721601702697&count=20&uid=3623353053&fetch_level=0&locale=zh-CN

https://weibo.com/ajax/statuses/buildCommentsis_reload=1&id=5105473521456009&is_show_bulletin=2&is_mix=0&max_id=1218463186455944&count=20&uid=3623353053&fetch_level=0&locale=zh-CN

通过比对,我们可以发现以下规律:

https://weibo.com/ajax/statuses/buildComments这一部分均一致,之后的参数以’&’进行分隔;第一个数据接口的URL并不包含’max_id’这一参数,且该参数在不断变化;第一个数据接口的count=10,其余都为count=20。

那么max_id到底是什么呢?又如何找到max_id变化的规律呢?

返回开发者工具,点击第一个数据接口的Preview界面,我们可以发现它数据内存储着max_id,而且该值与第二个数据接口的URL的max_id一致。多验证几次,我们就能合理猜测前一个数据接口的max_id就是第二个数据接口URL的参数max_id的值。

6062ac34c88949b5ab0d642b2282de67.png

所以,我们还需要获取数据接口的max_id。

max_id = response.json()['max_id']

至此,整个逻辑已经非常清楚了。第一个数据接口的url不包含max_id;从第二个数据接口开始,url的max_id参数在前一个数据接口内。所以,我们在获取评论等数据的时候,还需要获取这一数据接口的max_id,从而在之后访问url之前,把max_id参数加进去。

七、完整代码

import time
import requests
import os
from openpyxl import Workbookheaders = {'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.3.5211 SLBChan/105','referer': 'https://weibo.com/2951605050/ODUbvvNAy','cookie':input('请输入你的cookies:')
}def fetch_weibo_comments(id, uid, max_id=None):params = {'id': id,'is_show_bulletin': '2','uid': uid,'fetch_level': '0','locale': 'zh-CN','max_id': max_id  # 如果有max_id,则添加到参数中}response = requests.get('https://weibo.com/ajax/statuses/buildComments', params=params,headers=headers)data = response.json()return datadef write_to_excel(data, ws):titles = ["用户", "时间", "ID", "评论", "地区", "点赞数"]for col_num, title in enumerate(titles, start=1):ws.cell(row=1, column=col_num, value=title)for index, comment in enumerate(data, start=2):ws[f'A{index}'] = comment['user']['screen_name']ws[f'B{index}'] = comment['created_at']ws[f'C{index}'] = comment['id']ws[f'D{index}'] = comment['text_raw']ws[f'E{index}'] = comment['source']ws[f'F{index}'] = comment['like_counts']def main():id = input('请输入主页id:')uid = input('请输入主页uid:')max_id_list = []comment_data = []for i in range(15):             #因为微博限制,只能爬取15页if i == 0:data = fetch_weibo_comments(id, uid)max_id_list.append(str(data['max_id']))comment_data.extend(data['data'])else:data = fetch_weibo_comments(id, uid, max_id_list[i - 1])max_id_list.append(str(data['max_id']))comment_data.extend(data['data'])print(f'成功自动爬取第{i + 1}页评论')time.sleep(1)# 写入Excelwb = Workbook()ws = wb.activewrite_to_excel(comment_data, ws)home_dir = os.path.expanduser("~")desktop_path = os.path.join(home_dir, 'Desktop')wb.save(desktop_path + './comment_list.xlsx')if __name__ == '__main__':main()

最后的结果会保存在桌面上,生成一个名为’comment_list’的excel文件。cookie、uid、id在下图位置找到。

51f44761721e401b81928b6c5a33dae1.jpeg

八、微博的限制

8.1 评论数量的限制

在代码中,我们只爬取了前15页评论,这是因为微博设限,只能加载前300条评论。

2786b6a1bc73468fa663c87efb620ae9.png

8.2 访问的限制

在试验的时候,我们可以发现第一个数据接口可以短时间内无限次访问,但是其他的数据接口短时间内访问会出现如下图的结果。

因此在代码实践过程中,我们需要格外注意这个限制。

8a961a49a4e54f6dbc9b8045f132eef1.png


有问题的可以一起交流

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫实战:利用代理ip爬取推特网站数据

引言 亮数据-网络IP代理及全网数据一站式服务商屡获殊荣的代理网络、强大的数据挖掘工具和现成可用的数据集。亮数据&#xff1a;网络数据平台领航者https://www.bright.cn/?promoRESIYEAR50/?utm_sourcebrand&utm_campaignbrnd-mkt_cn_csdn_yingjie202502 在跨境电商、社…

2.认识标签和去标签|下载boost库|建立项目结构

下载Boost库 Boost C Libraries 选择右边的Documentation 选择最新的1.87.0版本 可以在首页的这里下载最新版本 建立项目结构 新建目录boost_searcher mkdir boost_searcher移动到boost_searcher目录 cd boost_searcher下载rz命令 yum install lrzsz导入boost文件&…

Transformer 模型介绍(三)——自注意力机制 Self-Attention

Transformer 模型由 Vaswani 等人于2017年提出&#xff0c;主要应用于序列到序列的任务&#xff0c;最初应用于机器翻译。其核心思想是通过自注意力机制捕捉序列中的长期依赖关系&#xff0c;从而有效地进行任务建模 在著名的论文《Attention Is All You Need》中&#xff0c;…

《AI大模型开发笔记》Open-R1:对 DeepSeek-R1 的完全开源再现(翻译)

Open-R1&#xff1a;对 DeepSeek-R1 的完全开源再现&#xff08;翻译&#xff09; 原文链接&#xff1a;https://huggingface.co/blog/open-r1 什么是 DeepSeek-R1&#xff1f; 如果你曾经为一道艰难的数学题苦思冥想&#xff0c;那么你就知道花更多时间、仔细推理是多么有用…

Java虚拟机面试题:JVM调优

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

每日Attention学习23——KAN-Block

模块出处 [SPL 25] [link] [code] KAN See In the Dark 模块名称 Kolmogorov-Arnold Network Block (KAN-Block) 模块作用 用于vision的KAN结构 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as F import mathclass Swish(nn.Module)…

Centos安装php-8.0.24.tar

查看系统环境 cat /etc/redhat-release 预先安装必要的依赖 yum install -y \ wget \ gcc \ gcc-c \ autoconf \ automake \ libtool \ make \ libxml2 \ libxml2-devel \ openssl \ openssl-devel \ sqlite-devel yum update 1、下载解压 cd /data/ wget https:/…

百度千帆平台对接DeepSeek官方文档

目录 第一步&#xff1a;注册账号&#xff0c;开通千帆服务 第二步&#xff1a;创建应用&#xff0c;获取调用秘钥 第三步&#xff1a;调用模型&#xff0c;开启AI对话 方式一&#xff1a;通过API直接调用 方式二&#xff1a;使用SDK快速调用 方式三&#xff1a;在千帆大模…

linux-shell脚本

shell的编码语法 shell脚本的第一行内容是&#xff1a; #!/bin/bash&#xff0c;这句话相当于是一个导包语句&#xff0c;将shell的执行环境引入进去了。 shell中变量的命名要求&#xff1a; 只能使用数字、字母和下划线&#xff0c;且不能以数字开头 变量赋值是通过"&q…

免费deepseek的API获取教程及将API接入word或WPS中

免费deepseek的API获取教程: 1 https://cloud.siliconflow.cn/中注册时填写邀请码&#xff1a;GAejkK6X即可获取2000 万 Tokens; 2 按照图中步骤进行操作 将API接入word或WPS中 1 打开一个word&#xff0c;文件-选项-自定义功能区-勾选开发工具-左侧的信任中心-信任中心设置…

第1期 定时器实现非阻塞式程序 按键控制LED闪烁模式

第1期 定时器实现非阻塞式程序 按键控制LED闪烁模式 解决按键扫描&#xff0c;松手检测时阻塞的问题实现LED闪烁的非阻塞总结补充&#xff08;为什么不会阻塞&#xff09; 参考江协科技 KEY1和KEY2两者独立控制互不影响 阻塞&#xff1a;如果按下按键不松手&#xff0c;程序就…

Mybatisplus——Mybatisplus3.5.2版本使用Page分页插件查询,records有数据但是total显示0

目录 一、问题背景 debug 执行Mybatisplus使用Page分页插件查询时&#xff0c;发现 Page 里面的records有数据但是total显示0。 二、问题产生的原因 未配置MybatisPlus的分页插件拦截器导致的或者因mybatis-plus版本3.4或3.5版本导致原先的分页插件paginationInterceptor无法…

Windows安装 WSL2、Ubuntu 、docker(详细步骤 , 弃用 docker desktop )

前言 在现代软件开发领域&#xff0c;容器化技术已经成为提升应用部署效率和环境一致性的关键手段。Docker 作为一款卓越且被广泛应用的容器化平台&#xff0c;凭借其独特的技术架构&#xff0c;允许开发者将应用程序及其所需的全部依赖项&#xff0c;完整地打包进一个高度可移…

移动端测试的挑战与解决方案:兼容性、网络问题及实战策略

引言 移动应用已成为用户触达服务的核心入口,但移动端测试面临设备多样性、网络波动、用户场景复杂等多重挑战。据Statista统计,2023年全球活跃移动设备超180亿台,操作系统(Android/iOS)版本碎片化率超30%,这对测试工程师提出了极高要求。本文深度解析移动端测试的核心痛…

kron积计算mask类别矩阵

文章目录 1. 生成类别矩阵如下2. pytorch 代码3. 循环移动矩阵 1. 生成类别矩阵如下 2. pytorch 代码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_printoptions(precision3, sci_modeFalse)if __name__ "__main__":run_code 0…

DeepSeek 概述与本地化部署【详细流程】

目录 一、引言 1.1 背景介绍 1.2 本地化部署的优势 二、deepseek概述 2.1 功能特点 2.2 核心优势 三、本地部署流程 3.1 版本选择 3.2 部署过程 3.2.1 下载Ollama 3.2.2 安装Ollama 3.2.3 选择 r1 模型 3.2.4 选择版本 3.2.5 本地运行deepseek模型 3.3.6 查看…

foobar2000设置DSP使用教程及软件推荐

foobar2000安卓中文版&#xff1a;一款高品质手机音频播放器 foobar2000安卓中文版是一款备受好评的高品质手机音频播放器。 几乎支持所有的音频格式&#xff0c;包括 MP3、MP4、AAC、CD 音频等。不论是经典老歌还是最新的流行音乐&#xff0c;foobar2000都能完美播放。除此之…

制作一个项目用于研究elementUI的源码

需求&#xff1a;修改el-tooltip的颜色&#xff0c;发现传递参数等方法都不太好用&#xff0c;也可以使用打断点的方式&#xff0c;但也有点麻烦&#xff0c;因此打算直接修改源码&#xff0c;把组件逻辑给修改了 第一步下载源码 源码地址 GitHub - ElemeFE/element: A Vue.j…

DDoS技术解析

这里是Themberfue 今天我们不聊别的&#xff0c;我们聊聊著名的网络攻击手段之一的 DDoS&#xff0c;看看其背后的技术细节。 DoS 了解 DDoS 前&#xff0c;先来讲讲 DoS 是什么&#xff0c;此 DoS 而不是 DOS 操作系统啊。1996年9月6日&#xff0c;世界第三古老的网络服务提供…

【学习资源】时间序列数据分析方法(1)

时间序列数据分析是一个有趣的话题&#xff0c;让我们多花一些时间来研究。此篇为第一篇文章。主要介绍特征提取方法、深度学习时序数据分析模型、参考资源。期望能帮助大家解决工业领域的相关问题。 1 特征提取方法&#xff1a;信号处理 (来源:INTELLIGENT FAULT DIAGNOSIS A…