本文主要是介绍短视频一键采集下载源码开发思路第二篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这次的文章主要已短信视频批量提取下载为基础只放出对应的解析源码
2.1:视频名称
2.2:视频作者
2.3:视频日期
2.4:视频下载地址
2.5:视频作者URL
2.6:评论人昵称
2.7:评论人首页URL
2.8:评论日期
2.9:评论内容
上面列出的就是在爬取视频时需要爬取的内容解析的内容
三:解析内容的源码
这段的源码只给出视频批量下载所用到的解析
(注:不同的视频地址解析方法不一样,这里给出的是经过我们在使用过程中分析出来的,可以保持不用cookie 不会因为访问过快导致 IP屏蔽等)
这里给出需要解析的源码和对应的标签
3.1:视频名称 对应的解析标签和源码 这里使用的是 正则表达式
string title_b = "";
// 使用正则表达式提取 content 属性的值
string pattern = @"<meta\s+name=""lark:url:video_title""\s+content=""([^""]+)""";
Match match = Regex.Match(html, pattern);
if (match.Success)
{
// 获取匹配到的 content 属性值
string contentValue = match.Groups[1].Value;
title_b = contentValue;
if (title_b.Trim() == "dd-记录美好生活")
{
title_b = "";
}
Console.WriteLine("Content Value: " + contentValue);
}
else
{
Console.WriteLine("No meta tag found or content attribute not present.");
}
3.2:视频作者对应的标签和解析源码
string zuozhe = "";
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 = match.Groups[1].Value;
//发布时间:
zuozhe = zuozhe.Replace("<span>", "");
zuozhe = zuozhe.Replace("/", "");
}
}
catch
{
//MessageBox.Show("608");
}
return zuozhe;
3.3:视频日期的标签和解析源码
因为视频时间 给的不是真正的日期 需要转换 这里进行了转换
string shipin_dates = "";
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");
}
return shipin_dates;
3.4:视频下载地址标签和源码
public string mp4_ceng(string html)
{
string mp4_url = "";
string input = html;
string srcValue = GetSrcFromSourceTag(input);
mp4_url = srcValue;
return mp4_url;
}
static string GetSrcFromSourceTag(string input)
{
Regex regex = new Regex(@"<source[^>]+src\s*=\s*""([^""]+)""");
Match match = regex.Match(input);
if (match.Success)
{
return match.Groups[1].Value;
}
else
{
return null; // 或者抛出异常,视情况而定
}
}
四:软件功能 和实现逻辑
概述:此延伸出的工具是我们开发的一个单独的通过视频复制链接进行视频提取。
4.1:批量导入分享链接。可通过记事本文件一行一个存入记事本文件进行导入。导入后系统可通过已导入的数据进行解析和下载。
4.2:确认下载
导入分享链接后,点击下载进入下载
解析逻辑:1:获取到分享链接地址后 先解析里面的分享的url
2:获取到原始的分享url后在反响获得视频播放真实地址
3:获取到分享真实地址后截取里面的视频ID
4:然后通过ID拼接一个视频播放的层页面地址
5:拼接后开始访问此视频播放层地址 进行用上面的代码进行解析。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/baihua345/article/details/139845397
这篇关于短视频一键采集下载源码开发思路第二篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!