短视频评论截流源码开发思路C#
妙笔生花! 2024-07-21 12:05:08 阅读 65
源码图镇帖
一:准备工作
这里我们采用了云技术,并不是通过客户端进行评论数据提取
1.1:UI自动操作技术
UI自动操作技术,顾名思义就是无需人工干预通过代码的方式让软件进行模拟人工操作,认为是脚本也好 什么都可以。这和脚本还不一样,这里就不细说了。
为什么获取短视频评论需要自动操作技术:那是因为短视频的评论在不被用户去看的情况下是不加载的,当需要去看某个视频评论的时候去点击了评论的图标按钮才会加载评论,在没有加载评论以前获取的代码字符是无法获取到评论内容的。所有需要点击一下评论图标按钮,点击后评论会被加载即可获取。
短信视频评论截取软件 需要UI自动化操作的有两块
第一块:每获取到一个视频 在页面加载完毕后点击视频评论按钮,(这里只能点一次,所以需要逻辑上的处理)
第二块:下拉评论列表层,因为下拉评论列表才能获得所有的相关评论。
下面是点击层的代码和下拉层的代码 (这里前提是已经加载完毕页面,已经获取到页面代码时进行操作)
点击层的实例代码 V:y8834-cn
chromeBrowser2.ExecuteScriptAsync(@"
var divElement = document.querySelector('div.kT7icnwc');
if (divElement) {
divElement.click();
}
");
下面代码是 douyin视频层需要 下拉评论层的代码
chromeBrowser2.ExecuteScriptAsync(@"
var commentList = document.querySelector('div[data-e2e=""comment-list""]');
if (commentList) {
commentList.scrollTop = commentList.scrollHeight;
}
");
1.2:字符串函数和正则表达式
这里建议会熟练使用正则表达式的使用正则表达式 正则表达式有一个坏处就是 当字符有细节的变
动的情况下会卡住导致无法继续执行后面的代码 (有一些不可预知的问题)
如果用字符串函数 不会卡住 但是逻辑上会麻烦一些 但是不会卡 处理起来比较麻烦
1.3:爬取页面分析
先分析出需要爬取数据的页面的对应标签。
需要分析的有,视频作者标签,视频日期标签,评论列表标签,评论UI自动下滑标签,视频评论点
击显示评论标签。先分析出这些标签 才考虑如何进行解析,可用到字符串函数和正则表达式来获
取。
这里放出一部分 解析作者标签的代码 和视频基础信息的代码 用的是正则表达式加字符串函数
string htmlContent = html;
try
{
// string title = "";//获取title值 标题 视频名称
Regex regex = new Regex(@"<span class=""j5WZzJdp y7epAOXf hVNC9qgC"">(.*?)</span>", RegexOptions.IgnoreCase);
Match match = regex.Match(htmlContent);
if (match.Success)
{
// 获取匹配到的第一个组(即<title>和</title>之间的内容)
zuozhe_name = match.Groups[1].Value;
//发布时间:
zuozhe_name = zuozhe_name.Replace("<span>", "");
zuozhe_name = zuozhe_name.Replace("/", "");
}
}
catch
{
//MessageBox.Show("608");
}
private void zuozhe_url_ceng(string html)
{
string htmlContent = html;
string pattern = "<div class=\"uUjpLYc2 k13DwHsB O1xRgMXN\">.*?href=\"([^\"]+)\"";
Regex regex = new Regex(pattern);
Match match = regex.Match(html);
if (match.Success)
{
string href = match.Groups[1].Value;
zuozhe_url = href;
}
}
private void shipin_dates_ceng(string html)
{
string htmlContent = html;
try
{
// string title = "";//获取title值 标题 视频名称
Regex regex = new Regex(@"<span class=""time"">(.*?)</span>", RegexOptions.IgnoreCase);
Match match = regex.Match(htmlContent);
if (match.Success)
{
// 获取匹配到的第一个组(即<title>和</title>之间的内容)
shipin_dates = match.Groups[1].Value.Trim();
//发布时间:
shipin_dates = shipin_dates.Replace("<span>", "");
shipin_dates = shipin_dates.Replace("/", "");
shipin_dates = shipin_dates.Replace("·", "");
shipin_dates = shipin_dates.Replace("日", "");
shipin_dates = shipin_dates.Replace("年", "-");
shipin_dates = shipin_dates.Replace("月", "-");
string day = "";
// try
// {
Regex yearRegex = new Regex(@"\b\d{4}\b");
Regex dateRegex = new Regex(@"\b\d{1,2}-\d{1,2}\b");
// 判断字符串中是否包含年份信息
if (yearRegex.IsMatch(shipin_dates.Trim()))
{
// Console.WriteLine("输入字符串包含年份信息");
}
else if (dateRegex.IsMatch(shipin_dates.Trim()))
{
// Console.WriteLine("输入字符串不包含年份信息,但包含日期信息");
shipin_dates = "2024-" + shipin_dates.Trim();
}
else
{
Console.WriteLine("输入字符串既没有年份信息,也不符合日期格式");
#region
//DateTime shipin_dates_y = Convert.ToDateTime(shipin_dates);
//if (shipin_dates_y.Year != 1)
//{
// shipin_dates = "2004-" + shipin_dates.Trim ();
// Console.WriteLine("这个日期变量包含年份。");
//}
//else
//{
// shipin_dates = "2004-" + shipin_dates.Trim ();
// //Console.WriteLine("这个日期变量不包含年份。");
//}
#endregion
// }
// catch
// {
char delimiter = '·';
int index1 = shipin_dates.IndexOf(delimiter);
if (index1 != -1)
{
string textBeforeDelimiter = shipin_dates.Substring(0, index1);
shipin_dates = textBeforeDelimiter;
Console.WriteLine("Text before delimiter: " + textBeforeDelimiter);
}
if (shipin_dates.Contains("天"))
{
// pinglun_riqi_yuanshi = extraInfo;
int index = shipin_dates.IndexOf("天");
day = shipin_dates.Substring(0, index);
DateTime dt = DateTime.Now.Date.AddDays(-Convert.ToInt32(Convert.ToInt32(day)));
shipin_dates = dt.ToShortDateString();
}
if (shipin_dates.Contains("月"))
{
//pinglun_riqi_yuanshi = extraInfo;
int index = shipin_dates.IndexOf("月");
day = shipin_dates.Substring(0, index);
DateTime dt = DateTime.Now.Date.AddMonths(-Convert.ToInt32(Convert.ToInt32(day)));
shipin_dates = dt.ToShortDateString();
}
if (shipin_dates.Contains("小时"))
{
// pinglun_riqi_yuanshi = extraInfo;
int index = shipin_dates.IndexOf("小时");
day = shipin_dates.Substring(0, index);
DateTime dt = DateTime.Now.Date.AddHours(-Convert.ToInt32(Convert.ToInt32(day)));
shipin_dates = dt.ToString();
}
if (shipin_dates.Contains("分钟"))
{
//pinglun_riqi_yuanshi = extraInfo;
int index = shipin_dates.IndexOf("分钟");
day = shipin_dates.Substring(0, index);
DateTime dt = DateTime.Now.Date.AddMinutes(-Convert.ToInt32(Convert.ToInt32(day)));
shipin_dates = dt.ToString();
}
if (shipin_dates.Contains("周"))
{
// pinglun_riqi_yuanshi = extraInfo;
int index = shipin_dates.IndexOf("周");
day = shipin_dates.Substring(0, index);
int week = (Convert.ToInt32(day) * 7);
DateTime dt = DateTime.Now.Date.AddDays(-Convert.ToInt32(week));
shipin_dates = dt.ToShortDateString();
}
if (shipin_dates.Contains("年"))
{
// pinglun_riqi_yuanshi = extraInfo;
int index = shipin_dates.IndexOf("年");
day = shipin_dates.Substring(0, index);
DateTime dt = DateTime.Now.AddYears(-Convert.ToInt32(Convert.ToInt32(day)));
shipin_dates = dt.ToShortDateString();
}
//判断当前时间是否和视频时间 是否大于
DateTime a = DateTime.Now; // 当前时间
DateTime b = DateTime.ParseExact(shipin_dates, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture);// 视频时间,假设为 2022-05-27
TimeSpan interval = a - b; // 计算时间间隔
if (Math.Abs(interval.TotalDays) <= 730) // 判断时间间隔是否小于等于两年//这个里面的值 通过字段获取
{
Console.WriteLine("视频时间和当前时间在两年内");
}
else
{
Console.WriteLine("视频时间和当前时间不在两年内");
}
}
}
}
catch
{
//MessageBox.Show("608");
}
}
private void title_ceng(string html)
{
// string pattern = @"<span class=""j5WZzJdp IoRNNcMW hVNC9qgC"">(.*?)</span>";
// MatchCollection matches = Regex.Matches(html, pattern);
// // 提取匹配结果
// //foreach (Match match in matches)
// //{
// title = matches.Groups[1].Value.Trim();
// // 输出匹配到的内容
// // Console.WriteLine(match.Groups[1].Value.Trim());
}
///
string htmlContent = html;
try
{
// string title = "";//获取title值 标题 视频名称
Regex regex = new Regex(@"<span class=""j5WZzJdp IoRNNcMW hVNC9qgC"">(.*?)</span>", RegexOptions.IgnoreCase);
Match match = regex.Match(htmlContent);
if (match.Success)
{
// 获取匹配到的第一个组(即<title>和</title>之间的内容)
title = match.Groups[1].Value;
//发布时间:
title = title.Replace("<span>", "");
title = title.Replace("/", "");
}
}
catch
{
//MessageBox.Show("608");
}
}
1.4:短视频评论的会话和COOKIE的处理
二:功能模块列表
关键词任务
| 通过关键词进行搜索行业视频,通过行业视频提取到相关所需要的评论内容
|
博主任务
| 只搜索抖音博主的视频评论,并且支持监控新视频和对应视频评论。(无需开启电脑和软件只要建立任务即可。)
|
单视频任务
| 只提取和监控单个视频的评论。并且支持支持实时监控。
|
监控
| 关于监控,监控只能在博主任务和视频任务中进行监控。 监控时打开软件和不打开软件都可以获取新的评论数据。
|
详情和二维码
| 查看对应评论的详细数据,里面有二维码,评论人,评论视频,评论人首页,评论内容,命中评论词
|
我们还做了一个监控报表方便数据监控 不过这个是网页版本BS版本
上一篇: 【笔记】Python3|(一)用 Python 翻译文本的教程、代码与测试结果(第三方库 translate 和 腾讯 API 篇)
下一篇: 【QT】鼠标按键事件 - QMouseEvent & QKeyEvent
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。