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
关键修改说明
- Headless模式优化:使用新版
--headless=new并设置窗口尺寸,解决无界面模式下的内容渲染限制,同时添加反爬绕过参数。 - 显式等待替代固定休眠:通过
WebDriverWait等待订单簿容器可见,确保元素加载完成后再操作,避免空指针或查找失败。 - 精准元素选择:使用CSS选择器定位订单行和子元素,替代原有的模糊标签选择,适配网站动态DOM结构。
- 异常容错处理:捕获元素查找异常,跳过结构异常的行,保证程序稳定运行。
- 数据结构调整:改用
List(Of String)存储数据,更直接适配ListBox的绑定需求。
注意:网站DOM结构可能随版本更新变化,若仍无法获取数据,需打开浏览器开发者工具(F12)重新确认元素的CSS选择器或类名。
内容的提问来源于stack exchange,提问作者Omid Al
相关产品推荐
相关产品推荐

