You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求Windows平台编程抓取网页数据并触发文件下载方案(优先C#)

C#实现行车记录仪网页视频同步方案

核心思路

通过模拟HTTP请求或浏览器操作,访问记录仪的Web界面:

  1. 解析页面获取视频文件的下载链接/按钮
  2. 触发下载请求,将文件直接保存到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:57:11