某d的评论爬虫学习

本教程仅用于技术研究,请确保遵守目标网站的服务条款。实际使用前应获得官方授权,避免高频请求影响服务器,否则可能承担法律责任。

此脚本仅拦截公开评论接口,不涉及用户私密数据。请勿修改代码监听其他请求。

分享一下爬某抖评论的爬虫学习,有一定的风险(代理部署导致浏览器连接断开,但有解决方案,需要认真学习)

首先,需要的软件:nodejs与mitmproxy可以先下载,避免后面断档了(问deepseek),最好下载个vscode(编辑代码和终端都有,参考deepseek,给他这些代码让他去教你把文件放到同一个文件夹里面)

然后直接发脚本代码:

文件名(不能修改):server.js,如下:

const http = require('http');
const fs = require('fs');
const path = require('path');
const PORT = 3000;// 存储所有视频评论数据
const allVideoComments = {};// 启动服务器
const server = http.createServer((req, res) => {if (req.method === 'POST') {let body = '';req.on('data', chunk => body += chunk);req.on('end', () => {try {const params = new URLSearchParams(body);const fullUrl = params.get('url');const responseRaw = params.get('response');console.log('📥 收到评论请求副本 URL:', fullUrl);console.log(params,'params')if (!responseRaw || responseRaw.trim().length === 0) {console.warn('⚠️ 副本中没有包含评论响应内容');res.writeHead(200);return res.end('空响应');}// 打印部分原始内容console.log('📦 原始评论内容预览:');console.log(responseRaw.slice(0, 300));const response = JSON.parse(responseRaw);const awemeId = new URL(fullUrl).searchParams.get('aweme_id');const videoUrl = `https://www.douyin.com/video/${awemeId}`;if (!response.comments) {console.warn('⚠️ 评论数据中无 comments 字段');res.writeHead(200);return res.end('无评论字段');}// 初始化数据结构if (!allVideoComments[videoUrl]) {allVideoComments[videoUrl] = {video_id: awemeId,comments: []};}// 格式化评论const formattedComments = response.comments.map(comment => ({user_id: comment.user?.uid || '未知用户',user_nickname: comment.user?.nickname || '匿名用户',comment_content: comment.text,comment_date: new Date(comment.create_time * 1000).toISOString(),like_count: comment.digg_count,ip_region: comment.ip_label,is_hot: comment.is_hot,reply_count: comment.reply_comment_total}));allVideoComments[videoUrl].comments.push(...formattedComments);saveToFile(allVideoComments);res.writeHead(200, { 'Content-Type': 'application/json' });res.end(JSON.stringify({video_url: videoUrl,comment_count: formattedComments.length,comments: formattedComments}, null, 2));console.log(`✅ 已保存 ${formattedComments.length} 条评论(${videoUrl})`);} catch (err) {console.error('❌ 错误:', err);res.writeHead(500);res.end('解析失败');}});} else {res.writeHead(200);res.end('请通过 POST 发送副本数据');}
});// 写入 JSON 文件
function saveToFile(data) {const filePath = path.join(__dirname, 'douyin_comments.json');fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf8');console.log(`💾 已保存评论数据到:${filePath}`);
}// 启动监听
server.listen(PORT, () => {console.log(`🚀 本地服务已启动:http://localhost:${PORT}`);console.log('📡 等待mitmproxy发送副本...');
});

文件名(不能修改):dup_forward.py,如下:

from mitmproxy import http
import requestsdef response(flow: http.HTTPFlow):if "/aweme/v1/web/comment/list/" in flow.request.pretty_url:try:requests.post("http://127.0.0.1:3000",  # 发送给本地 Node.jsdata={"url": flow.request.pretty_url,"response": flow.response.get_text()},timeout=3)print("✅ 已转发副本:", flow.request.pretty_url)except Exception as e:print("❌ 副本发送失败:", e)

文件名(不能修改):comment.js

const XLSX = require('xlsx');
const fs = require('fs');// 1. 读取 JSON 文件
const jsonData = JSON.parse(fs.readFileSync('douyin_comments.json', 'utf8'));// 2. 准备所有评论数据(带视频链接)
const allComments = [];// 遍历每个视频
Object.keys(jsonData).forEach(videoUrl => {const videoData = jsonData[videoUrl];const videoId = videoData.video_id;// 遍历当前视频的评论videoData.comments.forEach(comment => {allComments.push({"视频链接": videoUrl,       // 新增:标记评论所属视频"视频ID": videoId,         // 可选:方便筛选"用户ID": comment.user_id,"用户昵称": comment.user_nickname,"评论内容": comment.comment_content,"评论日期": comment.comment_date,"点赞数": comment.like_count,"IP属地": comment.ip_region,"是否热门": comment.is_hot ? "是" : "否","回复数": comment.reply_count});});
});// 3. 创建 Excel 工作簿
const workbook = XLSX.utils.book_new();
const worksheet = XLSX.utils.json_to_sheet(allComments);// 4. 导出文件
XLSX.utils.book_append_sheet(workbook, worksheet, "某抖评论数据");
XLSX.writeFile(workbook, 'douyin_comments.xlsx');console.log('✅ 数据已导出至 douyin_comments.xlsx');

文件名(不能修改):comment50.js

const XLSX = require('xlsx');
const fs = require('fs');// 1. 读取 JSON 文件
const jsonData = JSON.parse(fs.readFileSync('douyin_comments.json', 'utf8'));// 2. 准备所有评论数据(带视频链接)
const allComments = [];// 每个视频只保留前 50 条评论
const MAX_COMMENTS_PER_VIDEO = 50;Object.keys(jsonData).forEach(videoUrl => {const videoData = jsonData[videoUrl];const videoId = videoData.video_id;// 取前 50 条评论(如果不足 50 条则取全部)const topComments = videoData.comments.slice(0, MAX_COMMENTS_PER_VIDEO);topComments.forEach(comment => {allComments.push({"视频链接": videoUrl,"视频ID": videoId,"用户ID": comment.user_id,"用户昵称": comment.user_nickname,"评论内容": comment.comment_content,"评论日期": comment.comment_date,"点赞数": comment.like_count,"IP属地": comment.ip_region,"是否热门": comment.is_hot ? "是" : "否","回复数": comment.reply_count});});
});// 3. 创建 Excel 工作簿
const workbook = XLSX.utils.book_new();
const worksheet = XLSX.utils.json_to_sheet(allComments);// 4. 导出文件
XLSX.utils.book_append_sheet(workbook, worksheet, "某抖评论数据");
XLSX.writeFile(workbook, 'douyin_comments.xlsx');console.log('✅ 每个视频最多导出 50 条评论,已写入 douyin_comments.xlsx');

package.json

{"dependencies": {"@alicloud/pop-core": "^1.8.0","@google/genai": "^1.9.0","@google/generative-ai": "^0.24.1","axios": "^1.10.0","dotenv": "^17.2.0","http-proxy": "^1.18.1","https-proxy-agent": "^7.0.6","xlsx": "^0.18.5"}
}

用随便编辑器把他们几个文件放在同一个目录之下

类似这样(我这里有点乱):

然后你们需要在vscode里面打开终端:

重复上述操作,因为要开两个终端,还是这个操作

然后结果如下:你们会发现下面有一个栏,然后这个栏的右边是两个终端的按钮(一会需要切换)然后先在终端执行代码,npm install,按一下空格。就会自动安装包依赖了(前提是你们前面已经下载了nodejs)

然后你们就会多一个node_modules这个东西,说明已经下载成功了。

然后就是开始部署代码了:

终端输入node server.js,然后按空格,就会弹出本地服务已启动。

然后切换终端(注意!点红色的地方,这时候已经切换到第二个终端了)

然后终端输入mitmproxy -s dup_forward.py,点击空格(一定要先下载mitmproxy,不然没用)

然后出现如下场景,才算成功:

这个时候已经部署好两个服务器了,server.js是处理抓包数据的脚本,dup_forward.py是抓包脚本。

这个时候dup_forward.py监听的是8080端口,我们需要抓包某抖的评论,就需要让浏览器打开链接的时候请求走8080端口代理,这样我们就可以偷偷抓包了。所以下一步修改代理:

博主是windows11,如果是其他电脑可以问问deepseek怎么切换代理的端口(此操作有风险,可以提前看一下下面的注意事项)

点击编辑:

然后使用墙的小伙伴们注意了

我这里改了代理,如果你们使用墙有可能后面会出错,因为你们墙也是一个代理,他监听的端口和我们这里用mitmproxy的端口不一样,所以用完后一定要修改代理配置回来,如下图是博主一打开时候的样子,到时候弄完得改回去!:

接下来是需要操作的,打开使用代理服务器,需要改端口为8080并保存(此操作前需要读一下后面的注意点,即“没用墙的小伙伴们注意了,这个非常重要,是全场最重要的一点”,因为这个操作处理不好可能让浏览器访问不了网页的):

然后没用墙的小伙伴们注意了,这个非常重要,是全场最重要的一点!!请认真观看

因为你们一上来是没有开代理服务器的,点击了开代理服务器就意味着你们后面浏览器的请求要通过8080发送,8080是我们自己的服务器,如果你后面关掉了我们自己的8080服务器(即mitmproxy -s dup_forward.py)那个,那么你打开浏览器新页面将会看到如下场景“你尚未链接,代理服务器可能有问题”。

看起来像是你没网了一样,所以,如果你打开了代理服务器,再没有关闭这个代理服务器之前,你的浏览器是没法访问其他网站的,除非你按照我前面的操作部署了8080服务器(即mitmproxy -s dup_forward.py)

如果你临时想退出!或者临时想访问其他网页!!或者干脆就不想干了,你需要做的仅仅只是打开刚刚开代理的页面,然后把使用代理服务器关掉,一切就正常了。

我需要再次强调的是:

我们用mitmproxy开的服务器是自己的服务器去监听8080端口。打开代理的8080端口,浏览器走会先走我们自己的mitmproxy服务器。如果我们服务器开启着,那一切都正常,因为我们服务器会转发请求,因此可以爬。

如果你不小心关掉了我们自己的服务器,那么请把“使用代理服务器”关掉,因为会“显示您尚未连接的”,但如果你真的有需求还需要继续往下爬,那你可以终端输入“mitmproxy -s dup_forward.py”,浏览器走自己服务器转发,后面爬操作畅通无阻。

这时候全部已经部署完成,然后可以开始爬了。

然后随便打开一个视频,然后往下滑动评论区,评论区加载多少,后台就能爬多少。

爬多少取决于你往下加载的评论区多少,见同目录下的douyin_comments.json

如果需要换下一个视频就直接打开一个新的链接就行,脚本会按网页自动分类的

然后这个时候数据还是json文件嘛,json文件不是那种xlsx看的不太爽(此时已经可以ai分析了)

如果需要转成xlsx那么前面有一个comment.js(所有都转xlsx)以及comment50.js(前50条转xlsx)

就派上用场了:新开一个终端,然后输入node comment.js或者node comment50.js

然后douyin_comments.xlsx就是了。

第二天爬的看:

然后由于大家肯定不是一次性一天全部爬完,终端一旦关闭,所有的缓存都删除,但是douyin_comments.json和douyin_comments.xlsx不会删除!!虽然不会删除,但是如果你第二天发现我还得爬,请你记住给原来的名字改掉,不然脚本又自动替换掉原来的douyin_comments.json和douyin_comments.xlsx了!
douyin_comments.json这个文件如果你第二天一运行node server.js直接就全部清空了。

想重新开启服务器来的看:

如果你发现vscode调试的时候乱七八糟的,想重新服务器关掉重新开。

那么你可以切换到那个server.js的那个终端,然后按一下ctrl+c,就可以退出了,然后可以重新执行node server.js (此操作会清空douyin_comment.json啊别乱重启,如果真需要重启又要保留原来的json,请你把原来douyin_comment.json和douyin_comment.xlsx改个名呗

另一个服务器也是一样:先切换到dup_forward.py的那个终端,然后ctrl+c,然后最下面输入yes

重启的时候再执行mitmproxy -s dup_forward.py就行了

然后就可以重新爬取了,记住重启要改名啊!!!不然原来白白爬了。

 

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

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

相关文章

SQLite 注入:理解与防御

SQLite 注入:理解与防御 引言 随着互联网技术的飞速发展,数据库已成为各类应用程序的核心组成部分。SQLite 作为一款轻量级的关系型数据库,广泛应用于移动应用、桌面应用及嵌入式系统。然而,SQLite 数据库也面临着安全挑战&#x…

Java中List集合对象去重及按属性去重

请直接移步原文Java中List集合对象去重及按属性去重的8种方法 只记录自己喜欢的几种方法 对象元素整体去重的2种方法按照对象属性去重的4种方法 预备数据 public class ListRmDuplicate {private List<String> list;private List<Player> playerList;BeforeEac…

ADAS测试:如何用自动化手段提升VV效率

当前&#xff0c;ADAS 技术正在快速发展&#xff0c;从智能巡航控制到自动紧急制动等功能已逐渐成为汽车的标配。在不断提升驾驶辅助能力的同时&#xff0c;系统的可靠性也受到前所未有的重视。为了确保这些关键系统在各种工况下都能正常运行&#xff0c;验证与确认&#xff08…

互信息:理论框架、跨学科应用与前沿进展

1. 起源与核心定义 互信息&#xff08;Mutual Information, MI&#xff09;由克劳德香农&#xff08;Claude Shannon&#xff09; 在1948年开创性论文《A Mathematical Theory of Communication》中首次提出&#xff0c;该论文奠定了现代信息论的基础。互信息用于量化两个随机…

C++模板元编程从入门到精通

之前面试被问到什么是模板元编程&#xff0c;给我问懵了…… 一、什么是模板元编程&#xff08;TMP&#xff09; 模板元编程&#xff08;Template Metaprogramming, TMP&#xff09;是一种利用C模板在编译期执行计算和代码生成的编程范式。它本质上是“编写程序的程序”&#…

探秘CommonJS:Node.js模块化核心解析

CommonJS 是 JavaScript 的模块化规范&#xff0c;主要应用于 服务器端环境&#xff08;尤其是 Node.js&#xff09;&#xff0c;其核心目标是解决代码组织、依赖管理和作用域隔离问题 。以下是其核心要点&#xff1a;&#x1f527; 一、核心特性同步加载 模块通过 require() 同…

Windows 10 远程桌面(RDP)防暴力破解BAT脚本

0x01 设置5次失败后锁定账户30分钟 secpol.msc # 导航到: 安全设置 > 账户策略 > 账户锁定策略 0x02 复制保存到 BlockFailedRDP.ps1 <# .DESCRIPTION 此脚本分析Windows安全日志中的RDP登录失败事件(ID 4625)&#xff0c; 统计每个IP的失败次数&#xff0…

Chukonu 阅读笔记

Chukonu&#xff1a;一个将原生计算引擎集成到 Spark 中的全功能高性能大数据框架 摘要 Apache Spark 是一种广泛部署的大数据分析框架&#xff0c;它提供了诸如弹性、负载均衡和丰富的生态系统等吸引人的特性。然而&#xff0c;其性能仍有很大的改进空间。尽管用原生编程语言编…

51c视觉~3D~合集4

自己的原文哦~ https://blog.51cto.com/whaosoft/14084543 #VGGT-Long 首次将单目3D重建推向公里级极限&#xff01;南开、南大提出&#xff1a;分块、循环、对齐&#xff0c;开源 近年来&#xff0c;3D视觉基础模型&#xff08;Foundation Models&#xff09;在3D感…

实时云渲染将UE像素流嵌入业务系统,实现二维管理系统与数字孪生三维可视化程序的无缝交互

在数字孪生大屏可视化项目中&#xff0c;将实时云渲染技术嵌入业务系统已成为提升用户体验和工作效率的关键策略之一。将云渲染嵌入业务系统&#xff0c;用户可以在执行业务操作时实时看到云渲染画面的响应&#xff0c;同时对云渲染画面的操作也能立即反馈到业务系统中。这种无…

Apache POI 介绍与使用指南

文章框架一、Apache POI 概述定义&#xff1a;Java API操作Microsoft Office格式文件核心功能&#xff1a;读写Excel&#xff08;.xls, .xlsx&#xff09;操作Word、PowerPoint等文档优势&#xff1a;开源免费、跨平台、功能全面二、环境准备Maven依赖配置&#xff1a;<!-- …

Redis--哨兵机制详解

1. 哨兵机制简介Redis Sentinel&#xff08;哨兵&#xff09;是Redis的高可用性解决方案&#xff0c;它提供了监控、通知、自动故障转移和配置提供者等功能。Sentinel系统可以监控多个Redis主服务器及其从服务器&#xff0c;并在主服务器失效时自动进行故障转移&#xff0c;确保…

无人机机体结构设计要点难点分析

一、 设计要点1.轻量化&#xff1a;核心目标&#xff1a; 最大程度减轻结构重量&#xff0c;提升有效载荷能力、续航时间、飞行速度和机动性。实现手段&#xff1a; 选用高比强度/比刚度材料&#xff08;碳纤维复合材料、航空铝合金、钛合金、工程塑料&#xff09;、拓扑优化、…

AI时代的数据库革命:电科金仓的“融合+AI“战略解析

在人工智能时代的大变局下&#xff0c;数据库要走向何方&#xff1f; 7月15日&#xff0c;中国电科旗下金仓数据库以一场名为“融合进化 智领未来”的发布会&#xff0c;提出了自己的核心主张&#xff1a;真正的未来数据库&#xff0c;是“融合”为体&#xff0c;“AI”为用。电…

与deepseek的问答:dot net与Borland VCL的关系

Borland VCL与.NET/C#关系分析borland delphi如神一般地存在&#xff01;试分析.net、c#与Borland VCL的关系。Borland Delphi及其VCL&#xff08;Visual Component Library&#xff09;框架在软件开发史上确实具有传奇地位&#xff0c;尤其在Windows桌面应用开发领域。而随着.…

SAP在未启用负库存的情况下,库存却出现了负数-补充S4 1709 BUG

SAP在未启用负库存的情况下&#xff0c;库存却出现了负数-补充S4 1709 BUG共用物料合并发料&#xff1a;单行发料数量没有超过库存数量&#xff0c;但合计发料数量超过库存数量了&#xff0c;系统还是可以过账&#xff0c;没有任何提示&#xff0c;如下图所示&#xff1a;库存数…

SpringBoot项目中常见注解

RequiredArgsConstructor 注解 类上添加该注解&#xff0c;Lombok 会自动生成一个构造函数&#xff0c;用于注入 final 或 NonNull 修饰的字段 ConfigurationProperties注解 用于将配置文件中的属性注入到某个类的字段上 sky:jwt:admin-secret-key: itcastadmin-ttl: 7200000ad…

一键修复ipynb,Jupyter Notebook损坏文件

背景最近在写一个数据分析项目时&#xff0c;不幸遇到了 断电导致电脑重启 的突发情况。当我再次打开 Jupyter Notebook 文件&#xff08;.ipynb&#xff09;时&#xff0c;发现文件已经损坏&#xff0c;Jupyter 无法正常读取它&#xff0c;甚至有时直接报错&#xff1a;Unread…

React入门学习——指北指南(第三节)

React 组件 在前面的内容中,我们了解了 React 的基础知识和入门案例。本节将深入探讨 React 中最核心的概念之一 —— 组件。组件是构建 React 应用的基础,理解组件的工作原理和使用方法,对于掌握 React 开发至关重要。 什么是组件? 在 React 中,组件是具有独立功能和 …

容器化环境下的服务器性能瓶颈与优化策略

更多云服务器知识&#xff0c;尽在hostol.com在容器化环境中&#xff0c;性能优化并不是一个简单的“加硬件”或“增加资源”就能解决的问题。随着技术的进步&#xff0c;越来越多的公司选择使用容器技术&#xff08;如Docker、Kubernetes&#xff09;来提高应用的灵活性、可移…