跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI

基于 DrissionPage 的抖音评论数据自动化采集方案

基于 DrissionPage 框架实现抖音评论数据的自动化采集。通过监听网络请求获取原始 JSON 数据,结合浏览器渲染提取视频及作者元信息,最终将结构化数据存储至 CSV 文件。方案包含环境配置、核心代码实现、关键模块解析及使用注意事项,支持分页爬取与异常处理,适用于短视频数据分析场景。

疯疯癫癫发布于 2026/3/16更新于 2026/7/2776 浏览
基于 DrissionPage 的抖音评论数据自动化采集方案

在短视频数据分析场景中,抖音评论数据的采集是重要的一环。本文将基于 DrissionPage 自动化框架,实现抖音视频评论、作者信息、视频元数据的完整爬取,并将数据结构化存储到 CSV 文件中。

一、技术选型与核心优势

1. 核心依赖库

  • DrissionPage:新一代 Python 自动化工具,融合了 Selenium 和 Requests 的优势,既可以操作浏览器渲染页面,又能监听网络请求获取原始数据,相比传统爬虫更稳定。
  • datetime/re:分别用于时间戳转换和文本正则提取。
  • csv:Python 内置模块,用于结构化存储爬取的数据。
  • time:用于添加等待时间,适配页面加载节奏。

2. 方案优势

  • 采用网络请求监听而非页面元素解析获取评论,数据更完整、效率更高;
  • 精准的元素定位策略,适配抖音页面结构;
  • 完善的异常处理机制,降低爬取中断概率;
  • 结构化数据输出,便于后续分析。

二、核心功能实现

1. 环境准备

首先安装核心依赖:

pip install DrissionPage

2. 完整代码实现

# 导入自动化模块
from DrissionPage import ChromiumPage
# 导入时间转换模块
from datetime import datetime
# 导入 csv 模块,用于操作 CSV 文件
import csv
# 导入时间模块,用于添加短暂等待,提高稳定性
import time
import re

# 提取视频标题和标签
def extract_video_info(page):
    """提取视频标题和以#开头的标签"""
    try:
        # 获取视频标题
        title_ele = page.ele('tag:h1', timeout=5)
        title = title_ele.text.strip() if title_ele else '未知标题'
        # 提取以#开头的标签
        tag_pattern = re.compile(r'#\S+')
        tags = tag_pattern.findall(title)
        # 纯标题(去掉标签)
        pure_title = tag_pattern.sub(, title).strip()  title
         pure_title, tags
     Exception  e:
        ()
         , []

 ():
    
    author_info = {
        : ,
        : ,
        : 
    }
    :
        
        
        author_ele = page.ele(, timeout=)
         author_ele:
            
            author_name = author_ele.text.strip()
             author_name:
                author_info[] = author_name

        
        stat_eles = page.eles()
         ele  stat_eles:
            stat_text = ele.text.strip()
               stat_text:
                 stat_text.replace(, ).strip().isdigit()    stat_text    stat_text:
                    author_info[] = stat_text.replace(, ).strip()
                :
                    next_ele = ele.()
                     next_ele  next_ele.text.strip():
                        author_info[] = next_ele.text.strip()
               stat_text    stat_text:
                 stat_text.replace(, ).replace(, ).strip().isdigit()    stat_text    stat_text:
                    author_info[] = stat_text.replace(, ).replace(, ).strip()
                :
                    next_ele = ele.()
                     next_ele  next_ele.text.strip():
                        author_info[] = next_ele.text.strip()
     Exception  e:
        ()
     author_info

 ():
    
    video_url = ().strip()
      video_url:
        video_url = 

    
     (, mode=, encoding=, newline=)  f:
        csv_writer = csv.DictWriter(f, fieldnames=[
            , , , , ,
            , , , 
        ])
        
        csv_writer.writeheader()

        
        dp = ChromiumPage()
        
        success_page_count = 
        
        video_title = 
        video_tags = []
        author_info = {: , : , : }

        :
            
            dp.listen.start()
            
            dp.get(video_url)
            
            time.sleep()

            
            video_title, video_tags = extract_video_info(dp)
            
            author_info = extract_author_info(dp)

            ()
            ()
            ()
            ()
            ()
            ()
            ()

            
            page_num = 
            has_next_page = 

            
             has_next_page:
                ()
                
                resp = dp.listen.wait(timeout=)
                  resp:
                    ()
                    
                    dp.scroll.to_bottom()
                    time.sleep()
                    resp = dp.listen.wait(timeout=)
                      resp:
                        ()
                        

                
                :
                    json_data = resp.response.body
                    
                    comments = json_data.get(, [])
                    
                      comments:
                        ()
                        

                    
                     index  comments:
                        :
                            create_time = index.get(, )
                            
                             create_time == :
                                date = 
                            :
                                date = (datetime.fromtimestamp(create_time))

                            
                            region = index.get(, )
                              region:
                                ip_client_info = index.get(, {})
                                region = ip_client_info.get(, )
                         KeyError  e:
                            ()
                            

                        dit = {
                            : video_title,
                            : .join(video_tags),
                            : author_info[],
                            : author_info[],
                            : author_info[],
                            : index.get(, {}).get(, ),
                            : region,
                            : date,
                            : index.get(, ),
                        }
                        :
                            csv_writer.writerow(dit)
                            (dit)
                         Exception  e:
                            ()

                    
                    success_page_count += 

                    
                    next_page = dp.ele(, timeout=)
                      next_page:
                        ()
                        

                    
                    :
                        dp.scroll.to_see(next_page)
                        time.sleep()
                        next_page.click()
                        page_num += 
                        time.sleep()
                     Exception  e:
                        ()
                        
                 Exception  e:
                    ()
                    

            ()
            ()
            ()
         Exception  e:
            ()
        :
            
            dp.quit()
            ()

 __name__ == :
    main()
''
or
return
except
as
print
f"提取视频信息失败:{e}"
return
'未知标题'
def
extract_author_info
page
""" 精准适配版:提取作者信息(仅保留方式 1 的精准匹配) 只匹配 class+data 属性结构,移除所有兜底方案 """
'作者名称'
'未知'
'粉丝数'
'0'
'获赞数'
'0'
try
# ========== 第一步:提取作者名称(仅保留精准匹配)==========
# 仅保留方式 1:匹配 class=q5XQ42ql + data-click-from="title"
'xpath://div[@class="q5XQ42ql" and @data-click-from="title"]'
3
if
# 提取该 div 下所有 span 的文本(自动拼接嵌套 span 的内容)
if
'作者名称'
# ========== 第二步:提取粉丝数和获赞数(通用定位)==========
'xpath://span[contains(text(), "粉丝") or contains(text(), "获赞") or contains(text(), "赞")]'
for
in
if
'粉丝'
in
if
'粉丝'
''
or
'万'
in
or
'亿'
in
'粉丝数'
'粉丝'
''
else
next
if
and
'粉丝数'
elif
'获赞'
in
or
'赞'
in
if
'获赞'
''
'赞'
''
or
'万'
in
or
'亿'
in
'获赞数'
'获赞'
''
'赞'
''
else
next
if
and
'获赞数'
except
as
print
f"提取作者信息失败:{e}"
return
def
main
# 让用户输入视频链接
input
"请输入抖音视频链接(回车使用默认链接):"
if
not
'https://v.douyin.com/y5R-HvKi_vE'
# 使用 with 语句管理文件资源,自动关闭文件
with
open
'douyin_comments.csv'
'w'
'utf-8-sig'
''
as
'视频标题'
'视频标签'
'作者名称'
'作者粉丝数'
'作者获赞数'
'昵称'
'地区'
'日期'
'评论'
# 写入表头
# 打开浏览器(实际浏览对象)
# 记录实际爬取成功的页数
0
# 存储视频信息和作者信息
'未知标题'
'作者名称'
'未知'
'粉丝数'
'0'
'获赞数'
'0'
try
# 保留精准的监听规则
'comment/list/'
# 访问目标视频页面
# 延长等待时间(确保作者信息区域完全加载)
8
# 提取视频标题和标签
# 提取作者信息(仅保留精准匹配)
print
f"\n=== 开始爬取 ==="
print
f"视频标题:{video_title}"
print
f"视频标签:{','.join(video_tags) if video_tags else '无'}"
print
f"作者名称:{author_info['作者名称']}"
print
f"作者粉丝数:{author_info['粉丝数']}"
print
f"作者获赞数:{author_info['获赞数']}"
print
f"================\n"
# 初始化页码和翻页状态
1
True
# 循环爬取,直到没有下一页
while
print
f'正在采集第 {page_num} 页的数据内容'
# 等待数据包加载(延长超时时间,提高稳定性)
15
if
not
print
f"第 {page_num} 页等待数据包超时,尝试滚动加载..."
# 主动滚动触发评论加载
2
5
if
not
print
f"第 {page_num} 页仍无数据包,终止爬取"
break
# 获取响应数据
try
# 解析数据,获取评论信息所在的列表
'comments'
# 如果评论列表为空,说明当前页无数据,终止循环
if
not
print
f"第 {page_num} 页无评论数据,终止爬取"
break
# 遍历评论列表,提取每条评论具体数据信息
for
in
try
'create_time'
0
# 容错处理时间字段
if
0
'未知时间'
else
str
# 尝试获取地区信息
'ip_label'
''
if
not
'client_info'
'province'
'未知'
except
as
print
f"处理单个评论数据出现异常,异常信息:{e},跳过该评论"
continue
'视频标题'
'视频标签'
','
'作者名称'
'作者名称'
'作者粉丝数'
'粉丝数'
'作者获赞数'
'获赞数'
'昵称'
'user'
'nickname'
'未知'
'地区'
'日期'
'评论'
'text'
''
try
print
except
as
print
f"写入 CSV 文件出现异常,异常信息:{e},跳过该数据"
# 爬取成功,页数 +1
1
# 查找下一页元素,判断是否存在
'css:.Rcc71LyU'
3
if
not
print
"未找到下一页元素,终止爬取"
break
# 尝试滚动到下一页按钮,失败则终止
try
1
1
3
except
as
print
f"滚动/点击下一页按钮失败,异常信息:{e},终止爬取"
break
except
as
print
f"第 {page_num} 页数据处理出现异常,异常信息:{e},终止爬取"
break
print
f"\n=== 爬取结束 ==="
print
f"共采集了 {success_page_count} 页评论数据"
print
f"数据已保存到:douyin_comments.csv"
except
as
print
f"爬取过程中出现致命异常:{e}"
finally
# 无论是否异常,都关闭浏览器
print
"浏览器已关闭"
if
'__main__'

3. 示例链接

https://v.douyin.com/y5R-HvKi_vE

4. 代码运行效果

文章配图

文章配图

5. CSV 导出效果

文章配图

三、关键模块解析

1. 视频信息提取(extract_video_info)

  • 通过 tag:h1 定位视频标题元素,兼容标题不存在的异常情况;
  • 使用正则表达式 #\S+ 提取视频标签,并过滤标签得到纯标题;
  • 完整的 try-except 包裹,确保单个模块异常不影响整体流程。

2. 作者信息提取(extract_author_info)

  • 精准定位:通过 XPath 组合 class 和 data-click-from 属性定位作者名称,避免页面其他元素干扰;
  • 数值兼容:处理粉丝数/获赞数的多种展示形式(纯数字、带万/亿单位、数值在相邻元素);
  • 默认值兜底:所有字段设置默认值,防止数据缺失导致 CSV 写入失败。

3. 核心爬取逻辑(main 函数)

(1)网络请求监听
dp.listen.start('comment/list/')

监听抖音评论接口,直接获取原始 JSON 数据,相比解析页面元素更高效、数据更完整。

(2)分页处理
  • 等待接口响应,超时后主动滚动页面触发加载;
  • 定位下一页按钮并点击,实现自动翻页;
  • 统计成功爬取页数,便于后续核对数据。
(3)数据存储
  • 使用 csv.DictWriter 结构化写入数据,字段包括视频信息、作者信息、评论信息;
  • UTF-8 编码确保中文正常显示,newline='' 避免空行问题。

四、使用说明与注意事项

1. 使用步骤

  1. 安装依赖:pip install DrissionPage;
  2. 运行代码,输入抖音视频链接(或直接回车使用默认链接);
  3. 等待爬取完成,数据会保存到 douyin_comments.csv 文件。

2. 注意事项

  • 页面结构适配:抖音页面结构可能会更新,若作者信息/评论无法提取,需更新 XPath/CSS 定位器;
  • 等待时间调整:网络慢的环境可适当增加 time.sleep() 的时间;
  • 反爬机制:请勿高频次爬取,避免 IP 被限制;
  • 异常处理:代码已做基础异常处理,可根据实际需求扩展。

五、功能扩展方向

  1. 多视频批量爬取:读取视频链接列表,循环爬取多个视频的评论;
  2. 数据去重:对重复评论进行过滤,提高数据质量;
  3. 情感分析:结合自然语言处理库(如 jieba、snownlp)对评论进行情感倾向分析;
  4. 可视化展示:使用 matplotlib/echarts 将评论地区、发布时间等维度可视化;
  5. 增量爬取:记录已爬取的评论 ID,只获取新增评论。

总结

本文基于 DrissionPage 实现了抖音评论数据的自动化爬取,核心亮点在于:

  1. 结合浏览器渲染和网络请求监听,兼顾页面元素提取和原始数据获取;
  2. 精准的元素定位和完善的异常处理,提高爬取稳定性;
  3. 结构化数据输出,便于后续分析和应用。

该方案既适合数据分析新手快速上手,也可作为基础框架进行二次开发,满足不同的抖音数据采集需求。

目录

  1. 一、技术选型与核心优势
  2. 1. 核心依赖库
  3. 2. 方案优势
  4. 二、核心功能实现
  5. 1. 环境准备
  6. 2. 完整代码实现
  7. 导入自动化模块
  8. 导入时间转换模块
  9. 导入 csv 模块,用于操作 CSV 文件
  10. 导入时间模块,用于添加短暂等待,提高稳定性
  11. 提取视频标题和标签
  12. 3. 示例链接
  13. 4. 代码运行效果
  14. 5. CSV 导出效果
  15. 三、关键模块解析
  16. 1. 视频信息提取(extractvideoinfo)
  17. 2. 作者信息提取(extractauthorinfo)
  18. 3. 核心爬取逻辑(main 函数)
  19. (1)网络请求监听
  20. (2)分页处理
  21. (3)数据存储
  22. 四、使用说明与注意事项
  23. 1. 使用步骤
  24. 2. 注意事项
  25. 五、功能扩展方向
  26. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • MiniMax MCP Server:多模态生成服务器,支持视频/语音/图像生成
  • 练习开发Skill——网页内容抓取Skill(website-content-fetch)
  • 我们的数据到底有多安全?网络安全经济学分析
  • 论文解读:利用人类反馈训练语言模型遵循指令
  • Java 9 到 Java 25 语言演进与技术革新解析
  • OpenClaw 接入自定义模型并通过 WebUI 实现智能操作
  • 前端视频防录屏原理:EME DRM 机制与实战代码
  • WebStorm 安装与配置指南
  • Vue 3 组件中实现搜索过滤功能
  • LLM Agent 之互联网冲浪智能体:主流 WebAgent 数据集解析
  • Windows 部署 OpenClaw 集成 DeepSeek 与飞书实现本地 AI 控制
  • Jenkins 自动化部署实战指南:从安装到流水线构建
  • AI 办公实战指南:7 套书籍助你精准提效与职场进阶
  • FPGA 实现 OV5640 摄像头视频图像显示
  • Java 分布式服务治理落地项目实践 - 中小型电商微服务系统
  • C/C++ 内存分布深度剖析:从代码区到堆栈,new/delete 与 malloc/free 详解
  • 基于 PSO-DWA 融合的无人机三维动态避障路径规划 (Matlab)
  • 把Spine拆件补图从一周压缩到两小时:AIGC+Photoshop实操记录
  • Claude Opus 4.6 上线 DigitalOcean:支持百万上下文推理
  • 基于 Python 的 Windows 应用程序自动化操作流程实现

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online