Python微博动态爬虫

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

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

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

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

效果图

2cef40a463764c738aca9f1e53c54a71.png

文章目录

???一、基本流程

???二、查看全部评论

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

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

???五、获取内容

???六、批量获取内容

???七、完整代码

???八、微博的限制

8.1 评论数量的限制

8.2 访问的限制


一、基本流程

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

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

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

import requests

url = 'https://www.baidu.com'    

response = requests.get(url=url)    #发送请求

print(response.status_code)    #若结果返回200则表示正常
print(response.text)            #请求获得源代码

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

import requests

url = '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 Workbook

headers = {
    '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 data

def 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)

    # 写入Excel
    wb = Workbook()
    ws = wb.active
    write_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


有问题的可以一起交流

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

时序数据库:Influxdb详解

文章目录 一、简介1、简介2、官网 二、部署1、安装2、配置&#xff08;1&#xff09;用户初始化 三、入门&#xff08;Web UI&#xff09;1、加载数据&#xff08;1&#xff09;上传数据文件&#xff08;2&#xff09;代码接入模板 2、管理存储桶&#xff08;1&#xff09;创建…

unity学习32:角色相关1,基础移动控制

目录 0 应用商店 1 角色上新增CharacterController 组件 1.1 角色上新增CharacterController 组件 1.2 如果没有这个则会报错 2 速度 2.1 默认速度&#xff0c;按帧率计算 2.2 修改速度为按时间计算 2.3 movespeed&#xff0c;基础是1米/秒&#xff0c;这个就是每 move…

Centos Ollama + Deepseek-r1+Chatbox运行环境搭建

Centos Ollama Deepseek-r1Chatbox运行环境搭建 内容介绍下载ollama在Ollama运行DeepSeek-r1模型使用chatbox连接ollama api 内容介绍 你好&#xff01; 这篇文章简单讲述一下如何在linux环境搭建 Ollama Deepseek-r1。并在本地安装的Chatbox中进行远程调用 下载ollama 登…

mysql8.0使用pxc实现高可用

环境准备 准备三台虚拟机&#xff0c;其对应的主机名和IP地址为 pxc-1192.168.190.129pxc-2192.168.190.133pxc-3192.168.190.134 解析,都要做解析 测试 下载pxc的安装包&#xff0c; 官网&#xff1a;https://www.percona.com/downloads 选择8.0的版本并下载&#xff0c;…

LabVIEW污水生化处理在线监测

污水处理是环保领域的重要工作&#xff0c;传统污水处理方法在监测方面存在实时性差、操作不便等问题。为解决这些问题&#xff0c;本项目设计并实现了一套基于LabVIEW的污水生化处理在线监测平台&#xff0c;能够实时监测污水处理过程中的关键参数&#xff0c;如温度、pH值、溶…

【AI学习】关于 DeepSeek-R1的几个流程图

遇见关于DeepSeek-R1的几个流程图&#xff0c;清晰易懂形象直观&#xff0c;记录于此。 流程图一 来自文章《Understanding Reasoning LLMs》&#xff0c; 文章链接&#xff1a;https://magazine.sebastianraschka.com/p/understanding-reasoning-llms?continueFlagaf07b1a0…

vs封装dll 给C#使用

一&#xff0c;vs创建控制台应用 创建控制台应用得好处时&#xff0c;我们可以自己测试接口&#xff0c;如果接口没有问题&#xff0c;改成dll重新编译一遍就可以。 二&#xff0c; 创建一个c 类&#xff0c;将所需提供得功能 封装到类中。 这样可以将 所有功能&#xff0c;进…

ubuntu20使用tigervnc远程桌面配置记录

一、安装tigervnc sudo apt install tigervnc-common sudo apt install tigervnc-standalone-server二、增加配置文件 安装完后新增配置文件&#xff1a;vim ~/.vnc/xstartup #!/bin/sh #Uncomment the following two lines for normal desktop: #unset SESSION_MANAGER #ex…

DeepSeek使用技巧大全(含本地部署教程)

在人工智能技术日新月异的今天&#xff0c;DeepSeek 作为一款极具创新性和实用性的 AI&#xff0c;在众多同类产品中崭露头角&#xff0c;凭借其卓越的性能和丰富的功能&#xff0c;吸引了大量用户的关注。 DeepSeek 是一款由国内顶尖团队研发的人工智能&#xff0c;它基于先进…

网络原理之HTTPS(如果想知道网络原理中有关HTTPS的知识,那么只看这一篇就足够了!)

前言&#xff1a;随着互联网安全问题日益严重&#xff0c;HTTPS已成为保障数据传输安全的标准协议&#xff0c;通过加密技术和身份验证&#xff0c;HTTPS有效防止数据窃取、篡改和中间人攻击&#xff0c;确保通信双方的安全和信任。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要…

MySQL 8.0.41 终端修改root密码

1.在 MySQL 命令行中&#xff0c;运行以下命令修改密码 ALTER USER rootlocalhost IDENTIFIED BY new_password; 其中&#xff0c;new_password替换为你想要设置的新密码 2.退出 MySQL终端&#xff0c;重新打开&#xff0c;使用新密码进入&#xff0c;修改成功

TCP服务器与客户端搭建

一、思维导图 二、给代码添加链表 【server.c】 #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <fcntl.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.…

JVM春招快速学习指南

1.说在前面 在Java相关岗位的春/秋招面试过程中&#xff0c;JVM的学习是必不可少的。本文主要是通过《深入理解Java虚拟机》第三版来介绍JVM的学习路线和方法&#xff0c;并对没有过JVM基础的给出阅读和学习建议&#xff0c;尽可能更加快速高效的进行JVM的学习与秋招面试的备战…

kafka服务端之副本

文章目录 概述副本剖析失效副本ISR的伸缩LWLEO与HW的关联LeaderEpoch的介入数据丢失的问题数据不一致问题Leader Epoch数据丢失数据不一致 kafka为何不支持读写分离 日志同步机制可靠性分析 概述 Kafka中采用了多副本的机制&#xff0c;这是大多数分布式系统中惯用的手法&…

aarch64 Ubuntu20.04 安装docker

安装 docker 依赖项&#xff1a;sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release添加 Docker GPG 密钥&#xff1a;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyr…

校园网规划方案

个人博客站—运维鹿: http://www.kervin24.top CSDN博客—做个超努力的小奚&#xff1a; https://blog.csdn.net/qq_52914969?typeblog 本课程设计参考学习计算机网络 思科Cisco Packet Tracer仿真实验_哔哩哔哩_bilibili, 文章和pkg详见个人博客站: http://www.kervin24.to…

语义分割文献阅读——SETR:使用Transformer从序列到序列的角度重新思考语义分割

目录 摘要 Abstract 1 引言 2 Vision Transformer(ViT) 2.1 图片预处理&#xff1a;分块和降维 2.2 Patch Embedding 2.3 位置编码 2.4 Transformer Encoder的前向过程 3 SETR 3.1 图像序列化处理 3.2 Transformer 3.3 解码器 总结 摘要 本周阅读的论文题目是《R…

Mac上搭建k8s环境——Minikube

1、在mac上安装Minikube可执行程序 brew cask install minikub 安装后使用minikube version命令查看版本 2、安装docker环境 brew install --cask --appdir/Applications docker #安装docker open -a Docker #启动docker 3、安装kubectl curl -LO https://storage.g…

5. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Nacos

一、什么是Nacos Nacos 是阿里巴巴开源的一款云原生应用基础设施&#xff0c;它旨在简化微服务架构中服务治理和配置管理的复杂性。通过 Nacos&#xff0c;服务在启动时可以自动注册&#xff0c;而其他服务则可以通过名称来查找并访问这些注册好的实例。同时&#xff0c;Nacos…

【后端开发】系统设计101——Devops,Git与CICD,云服务与云原生,Linux,安全性,案例研究(30张图详解)

【后端开发】系统设计101——Devops&#xff0c;Git与CICD&#xff0c;云服务与云原生&#xff0c;Linux&#xff0c;安全性&#xff0c;案例研究&#xff08;30张图详解&#xff09; 文章目录 1、DevopsDevOps与SRE与平台工程的区别是什么&#xff1f;什么是k8s&#xff08;Ku…