首页 > 解决方案 > 带有 Chrome 驱动程序的 C# selenium - 无法执行多个异步请求,puppeteer-sharp 也比 selenium 慢

问题描述

我正在开发一个 C# MVC 应用程序,我必须在其中抓取另一个网站供内部使用。使用 selenium 我可以成功登录到网站,但是在搜索页面上,有几个 Ajax(Xhr) 请求并且在我的 C# 代码中处理它们需要很长时间,因为请求排队并且执行一个一个执行。

我试图实现线程,但我认为 selenium 使用单个实例来处理所有请求。

包含会话很重要,否则将无法获取结果。

有什么方法可以让 selenium 为每个请求异步工作而不会丢失会话或创建新实例(因为我必须加载会话并重定向到以前的 URL,这将花费更多时间并且会消耗更多内存)。

我正在使用以下代码:`

                ChromeDriver _driver = (ChromeDriver)System.Web.HttpContext.Current.Session["ChromeDriver"];
                if (_driver != null)
                {
                    string lastTabURL = _driver.Url;
                                                 
                    _driver.Manage().Timeouts().AsynchronousJavaScript = System.TimeSpan.FromSeconds(timeoutInSec);
                    responseText = (String)((IJavaScriptExecutor)_driver).ExecuteAsyncScript(script2);
                    Debug.WriteLine("-- Response 1 Feteched: url: " + url + ", Started: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                    
                }`

在这段代码中,我从会话中检索 Chrome 驱动程序,然后尝试发出 xHttp 请求以获取结果,但如果任何请求需要时间,则其他请求会等待该时间,然后它们会被执行,依此类推。

比较 Selenium 与 Puppeteersharp:

我调试了 Seleniun (C# with Chrome Driver) 和 PuppeteerSharp(C#) 的代码,发现 selenium 需要 0.4 秒来获取 URL,而对于相同的 URL,PuppeteerSharp 需要 2.1 秒。但我发现很多帖子提到 puppeteer 比 selenium 快得多。我猜想使用 nodeJs 的 puppeteer 可能比 PuppeteerSharp 更快。

我还有一个问题,当只有 3 到 4 个使用 Selenium 的 Chrome 驱动程序实例时,抓取网页的所有请求大约需要 35 秒,但是当用户实例增加时,我的代码会分配单独的 Chrome 驱动程序实例,相同的请求大约需要 1.5 到 2 分钟。有没有办法处理这个?

谢谢

标签: c#seleniumselenium-chromedriverpuppeteer-sharp

解决方案


推荐阅读