PeterLeelilipeng 2024-06-18 09:09 采纳率: 100%
浏览 7
已结题

C# Selenium 无头模式 没有得到JS数据

使用C# Selenium 无头模式 爬取的数据不全,没有等待JS加载完再爬取

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-18 09:09
    关注

    引自免费微信小程序:皆我百晓生

    为了解决在C#使用Selenium无头模式爬取数据时遇到的问题,即未能获取到完全加载后的JavaScript渲染内容,可以采用以下策略确保浏览器等待所有动态内容加载完成后再抓取页面。

    步骤1: 引入必要的命名空间

    在你的C#项目中,确保你已经引入了Selenium WebDriver 和相关的命名空间。

    using OpenQA.Selenium;
    using OpenQA.Selenium.Chrome;
    using System;
    using System.Threading;
    

    步骤2: 设置ChromeOptions以启用无头模式和延长等待时间

    通过ChromeOptions对象设置无头模式以及增加隐式等待时间,这样WebDriver会等待页面元素加载完成。

    ChromeOptions options = new ChromeOptions();
    options.AddArgument("--headless"); // 启用无头模式
    options.AddArgument("--disable-gpu"); // 在某些情况下可能需要此选项
    
    // 创建WebDriver实例并设置隐式等待时间为30秒
    IWebDriver driver = new ChromeDriver(options);
    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);
    

    步骤3: 使用WebDriverWait确保页面完全加载

    为了确保页面上的JavaScript执行完毕且所有动态内容加载完成,可以使用WebDriverWait配合ExpectedConditions。这将使代码等待特定条件满足,例如某个元素可见。

    // 导入必要的命名空间
    using OpenQA.Selenium.Support.UI;
    
    // 定义等待条件,例如等待一个特定的元素加载完成
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
    wait.Until(ExpectedConditions.ElementIsVisible(By.Id("someElementId")));
    

    步骤4: 抓取页面数据

    一旦页面完全加载,你可以通过各种方法抓取所需数据。

    // 示例:抓取页面源代码
    string pageSource = driver.PageSource;
    
    // 示例:抓取特定元素的文本
    IWebElement element = driver.FindElement(By.Id("someElementId"));
    string elementText = element.Text;
    

    步骤5: 清理资源

    记得在操作完成后关闭浏览器窗口和释放资源。

    driver.Quit();
    

    完整示例代码

    将上述代码片段组合在一起,形成一个完整的示例:

    using OpenQA.Selenium;
    using OpenQA.Selenium.Chrome;
    using OpenQA.Selenium.Support.UI;
    using System;
    using System.Threading;
    
    class Program {
        static void Main(string[] args) {
            ChromeOptions options = new ChromeOptions();
            options.AddArgument("--headless");
            options.AddArgument("--disable-gpu");
    
            IWebDriver driver = new ChromeDriver(options);
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);
    
            driver.Navigate().GoToUrl("https://example.com");
    
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
            wait.Until(ExpectedConditions.ElementIsVisible(By.Id("someElementId")));
    
            string pageSource = driver.PageSource;
            IWebElement element = driver.FindElement(By.Id("someElementId"));
            string elementText = element.Text;
    
            Console.WriteLine(elementText);
            
            driver.Quit();
        }
    }
    

    以上步骤和代码示例应能帮助你在C#中使用Selenium无头模式时,确保页面的JavaScript内容完全加载后再进行数据抓取。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月4日
  • 已采纳回答 6月26日
  • 创建了问题 6月18日

悬赏问题

  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境
  • ¥15 netcore使用PuppeteerSharp截图
  • ¥20 这张图页头,页脚具体代码该怎么写?
  • ¥15 关于#sql#的问题,请各位专家解答!
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂