前言:
短视频平台已经成为人们获取信息和娱乐的重要渠道。在视频平台上,用户可以发表自己的评论,表达对视频内容的看法和感受。这些评论不仅反映了观众的观点,也蕴含着丰富的信息和价值。通过评论截流监控工具能够帮助我们快速、准确地获取和分析这些评论数据,从而更好地了解用户需求和市场动态。
从而我们自己编写了一套最新云算力版的评论分析软件;为什么做软件呢,这样更方便直观地让新手小白理解。
现在开始讲述部分研发思路和软件界面展示:
- 获取需要的自动操作
为什么要用到自动操作呢?短视频评论区在用户不下拉情况下不加载的,当需要去看视频时点击评论标识按钮才会加载。
我们开始讲解UI自动操作相关的思路:
第一:获取到一个视频,加载页面后点击视频评论按钮(这里需要的是点击一次,做一个逻辑上的处理)
第二:下拉评论列表层
点击代码和下拉代码如下图示例;
点击层
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;
}
");
软件我们做了三个模块;全方面的赋能应用到监控、分析。如下示:
爬取页面需要分析数据页面对应标签;这里展示一部分 解析作者标签的代码 和视频基础信息的代码 用的是正则表达式加字符串函数
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");
}
}
通过短视频评论区截流是助力运营者分析运营非常实用的一种方法;下边是部分思路源码截图,在下篇文章中我会详细讲解下方截图的应用实例。