求Windows平台编程抓取网页数据并触发文件下载方案(优先C#)
C#实现行车记录仪网页视频同步方案
核心思路
通过模拟HTTP请求或浏览器操作,访问记录仪的Web界面:
- 解析页面获取视频文件的下载链接/按钮
- 触发下载请求,将文件直接保存到NAS的网络共享路径
推荐NuGet包
- HtmlAgilityPack:轻量HTML解析库,适合处理静态渲染的Web页面,快速提取下载链接
- Selenium.WebDriver + Selenium.WebDriver.EdgeDriver:模拟真实浏览器行为,应对JS动态渲染的页面(比如视频列表通过AJAX加载的情况)
HttpClient:.NET自带的HTTP客户端,无需额外安装,用于发送请求和下载文件
实现步骤与代码示例
场景1:静态HTML页面(视频链接直接在页面源码中)
适用于记录仪Web界面的视频列表直接输出在HTML里的情况:
using HtmlAgilityPack; using System.Net.Http; using System.IO; var httpClient = new HttpClient(); // 替换为你的记录仪Web界面IP/地址 var dashCamBaseUrl = "http://192.168.1.100"; // 替换为你的NAS网络共享路径(确保Windows已映射且有权限) var nasSavePath = @"\\Your-NAS-IP\DashCam-Videos"; // 获取页面HTML内容 var pageHtml = await httpClient.GetStringAsync(dashCamBaseUrl); var htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(pageHtml); // 解析下载链接:根据实际页面结构调整选择器,比如找带.mp4的a标签或下载按钮的href var downloadLinks = htmlDoc.DocumentNode.SelectNodes("//a[contains(@href, '.mp4') or contains(@class, 'download-btn')]"); if (downloadLinks != null) { foreach (var linkNode in downloadLinks) { var relativeUrl = linkNode.GetAttributeValue("href", string.Empty); var fullDownloadUrl = new Uri(new Uri(dashCamBaseUrl), relativeUrl); var fileName = Path.GetFileName(fullDownloadUrl.LocalPath); var fullSavePath = Path.Combine(nasSavePath, fileName); // 跳过已存在的文件 if (!File.Exists(fullSavePath)) { var fileBytes = await httpClient.GetByteArrayAsync(fullDownloadUrl); await File.WriteAllBytesAsync(fullSavePath, fileBytes); Console.WriteLine($"已保存:{fileName}"); } else { Console.WriteLine($"文件已存在,跳过:{fileName}"); } } }
场景2:JS动态渲染页面(视频列表通过JS加载)
如果记录仪Web界面的视频列表是通过AJAX或JS动态生成的,HtmlAgilityPack无法解析到内容,此时用Selenium模拟浏览器操作:
using OpenQA.Selenium; using OpenQA.Selenium.Edge; using OpenQA.Selenium.Support.UI; using System; using System.Collections.Generic; var edgeOptions = new EdgeOptions(); // 无头模式:不显示浏览器窗口 edgeOptions.AddArgument("--headless=new"); edgeOptions.AddArgument("--disable-gpu"); // 配置下载目录为NAS路径 var downloadPreferences = new Dictionary<string, object> { ["download.default_directory"] = @"\\Your-NAS-IP\DashCam-Videos", ["download.prompt_for_download"] = false, // 自动下载不弹窗 ["download.directory_upgrade"] = true }; edgeOptions.AddAdditionalOption("prefs", downloadPreferences); // 初始化Edge驱动 using var driver = new EdgeDriver(edgeOptions); driver.Navigate().GoToUrl("http://192.168.1.100"); // 等待页面加载完成:根据实际页面的元素调整等待条件(比如等待下载按钮出现) var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(d => d.FindElements(By.ClassName("download-btn")).Count > 0); // 遍历所有下载按钮并触发下载 var downloadButtons = driver.FindElements(By.ClassName("download-btn")); foreach (var btn in downloadButtons) { // 可结合文件系统检查是否已下载,避免重复操作 btn.Click(); // 根据文件大小调整等待时间,确保下载完成 System.Threading.Thread.Sleep(6000); } Console.WriteLine("视频同步完成");
关键注意事项
- 页面元素适配:用浏览器开发者工具(F12)查看记录仪Web界面的实际HTML结构,调整代码中的选择器(XPath、Class名等)
- 权限与网络:确保Windows账户对NAS共享路径有读写权限;运行程序前手动连接记录仪WiFi
- 登录处理:如果Web界面需要登录,需在代码中添加登录逻辑:
- HttpClient方式:构造登录表单数据,发送POST请求获取Cookie,后续请求带上Cookie
- Selenium方式:模拟输入用户名、密码,点击登录按钮
- 重复下载避免:通过检查NAS路径下的文件名,跳过已存在的文件,减少不必要的请求
内容的提问来源于stack exchange,提问作者ImaginaryHuman072889
相关产品推荐
相关产品推荐

