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

C#抓取JavaScript渲染网站数据:Fast.com测速结果获取求助

解决Fast.com动态测速结果获取的问题

嘿,我明白你的困扰啦!Fast.com的测速结果是通过JavaScript动态渲染出来的,直接爬取原始HTML肯定拿不到真实数据——这就是你看到0值的原因。下面给你几个适合C#新手的解决方案:

方案一:用Headless浏览器模拟真实访问(最直观)

Headless浏览器能完全模拟用户打开网页的过程,包括执行所有JavaScript,这样就能拿到渲染后的真实测速结果。C#里推荐用PuppeteerSharp,它是Chrome无头浏览器的.NET封装库,上手特别简单:

  1. 先通过NuGet安装依赖:

    Install-Package PuppeteerSharp
    

    或者用.NET CLI命令:

    dotnet add package PuppeteerSharp
    
  2. 示例代码:

    using PuppeteerSharp;
    using System;
    using System.Threading.Tasks;
    
    class Program
    {
        static async Task Main(string[] args)
        {
            // 第一次运行自动下载Chrome内核,之后无需重复下载
            await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
    
            // 启动无头浏览器(设为false可以看到真实窗口,方便调试)
            using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
            {
                Headless = true,
                Args = new[] { "--no-sandbox" } // 部分系统环境需要这个参数
            });
    
            // 打开Fast.com页面
            using var page = await browser.NewPageAsync();
            await page.GoToAsync("https://fast.com/en/");
    
            // 等待测速结果加载完成——结果会显示在id为"speed-value"的元素里
            await page.WaitForSelectorAsync("#speed-value", new WaitForSelectorOptions
            {
                Timeout = 30000 // 最多等待30秒,确保测速完成
            });
    
            // 提取测速数值和单位
            var speedValue = await page.EvaluateExpressionAsync<string>("document.getElementById('speed-value').textContent");
            var speedUnit = await page.EvaluateExpressionAsync<string>("document.getElementById('speed-units').textContent");
    
            Console.WriteLine($"当前测速结果:{speedValue} {speedUnit}");
        }
    }
    

方案二:直接调用Fast.com的API(更高效)

其实Fast.com背后是调用Netflix的测速API,你可以跳过网页,直接请求接口拿数据,这样不需要加载浏览器,效率更高。不过API可能会有变动,目前是可用的:

  1. 先安装JSON解析依赖:

    Install-Package Newtonsoft.Json
    
  2. 示例代码:

    using System;
    using System.Net.Http;
    using System.Threading.Tasks;
    using Newtonsoft.Json;
    
    class Program
    {
        static async Task Main(string[] args)
        {
            using var httpClient = new HttpClient();
            // 获取测速目标文件的URL
            var initResponse = await httpClient.GetStringAsync("https://fast.com/api/netflix/speedtest?https=true");
            var initData = JsonConvert.DeserializeObject<InitData>(initResponse);
    
            // 发起测速请求,记录下载时间
            var stopwatch = System.Diagnostics.Stopwatch.StartNew();
            var downloadResponse = await httpClient.GetAsync(initData.SpeedtestUrl, HttpCompletionOption.ResponseHeadersRead);
            stopwatch.Stop();
    
            // 计算网速(转换为Mbps单位)
            var contentLength = downloadResponse.Content.Headers.ContentLength ?? 0;
            var speedMbps = (contentLength * 8) / (stopwatch.Elapsed.TotalSeconds * 1024 * 1024);
    
            Console.WriteLine($"当前测速结果:{Math.Round(speedMbps, 2)} Mbps");
        }
    
        // 用于解析API返回的初始数据
        private class InitData
        {
            [JsonProperty("speedtestUrl")]
            public string SpeedtestUrl { get; set; }
        }
    }
    

为什么你之前的代码拿到0?

因为Fast.com的初始HTML里,<span id="speed-value">0</span>是默认占位值,只有当页面加载完成后,JavaScript执行完测速逻辑,才会把真实数值替换进去。普通的HTTP请求只会拿到这个初始静态值,不会等待JavaScript执行,所以你才会看到0。

内容的提问来源于stack exchange,提问作者codetomato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:18:04