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

VB.NET中用Selenium抓取CoinGlass动态订单簿无返回结果求助

问题分析与解决方案

你的代码无法获取订单簿数据主要源于元素定位错误、等待逻辑不合理、Headless模式配置缺失这几个核心问题,以下是针对性的修正方案:

核心问题点

  • 元素定位依赖的类名/结构已不符合网站当前DOM,模糊的标签选择(如By.TagName("div"))会定位到无关元素。
  • 固定Thread.Sleep等待无法适配页面动态加载节奏,可能在元素未渲染时就执行查找操作。
  • Headless模式未设置窗口尺寸,部分网站会限制无界面模式下的内容渲染,导致元素无法加载。
  • 按步长3遍历div集合的逻辑不符合实际订单行结构,会导致无效数据提取或索引越界。

修正后的完整代码

Imports OpenQA.Selenium
Imports OpenQA.Selenium.Chrome
Imports OpenQA.Selenium.Support.UI
Imports System.Threading

Private driver As IWebDriver

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Dim options As New ChromeOptions()
    options.AddArgument("start-maximized")
    options.AddArgument("--headless=new") ' 新版Headless模式,兼容性更强
    options.AddArgument("--window-size=1920,1080") ' 设置窗口尺寸,避免内容渲染异常
    options.AddArgument("--disable-blink-features=AutomationControlled") ' 绕过基础反爬检测
    options.AddUserProfilePreference("profile.default_content_setting_values.images", 2) ' 禁用图片加载提升效率

    Dim driverService = ChromeDriverService.CreateDefaultService()
    driverService.HideCommandPromptWindow = True
    driver = New ChromeDriver(driverService, options)

    Try
        driver.Navigate().GoToUrl("https://www.coinglass.com/merge/BTC-USDT")
        Dim wait As New WebDriverWait(driver, TimeSpan.FromSeconds(10))

        While Not BackgroundWorker1.CancellationPending
            ' 显式等待订单簿容器加载完成
            Dim orderBookContainer As IWebElement = wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("div.orderbook-container")))
            
            ' 获取所有订单行(根据网站实际DOM结构调整选择器)
            Dim orderRows As ReadOnlyCollection(Of IWebElement) = orderBookContainer.FindElements(By.CssSelector("div.orderbook-item"))
            
            Dim data As New List(Of String)

            For Each row As IWebElement In orderRows
                Try
                    ' 提取价格、数量、时间(需根据网站实时DOM调整类名)
                    Dim price As String = row.FindElement(By.CssSelector("span.order-price")).Text
                    Dim size As String = row.FindElement(By.CssSelector("span.order-size")).Text
                    Dim time As String = row.FindElement(By.CssSelector("span.order-time")).Text

                    data.Add($"{price} {size} {time}")
                Catch ex As NoSuchElementException
                    ' 跳过结构异常的行,避免程序崩溃
                    Continue For
                End Try
            Next

            BackgroundWorker1.ReportProgress(0, data)
            Thread.Sleep(2000) ' 合理设置刷新间隔
        End While
    Catch ex As Exception
        Console.WriteLine($"运行错误:{ex.Message}")
    Finally
        driver?.Quit()
    End Try
End Sub

' 更新ListBox的ProgressChanged事件处理
Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    Dim data As List(Of String) = DirectCast(e.UserState, List(Of String))
    ListBox1.Items.Clear()
    ListBox1.Items.AddRange(data.ToArray())
End Sub

关键修改说明

  1. Headless模式优化:使用新版--headless=new并设置窗口尺寸,解决无界面模式下的内容渲染限制,同时添加反爬绕过参数。
  2. 显式等待替代固定休眠:通过WebDriverWait等待订单簿容器可见,确保元素加载完成后再操作,避免空指针或查找失败。
  3. 精准元素选择:使用CSS选择器定位订单行和子元素,替代原有的模糊标签选择,适配网站动态DOM结构。
  4. 异常容错处理:捕获元素查找异常,跳过结构异常的行,保证程序稳定运行。
  5. 数据结构调整:改用List(Of String)存储数据,更直接适配ListBox的绑定需求。

注意:网站DOM结构可能随版本更新变化,若仍无法获取数据,需打开浏览器开发者工具(F12)重新确认元素的CSS选择器或类名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:15:04