今天,我使用Selenium来解析网站上的数据。这是我的代码:
public ActionResult ParseData()
{
IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl(myURL);
IList<IWebElement> nameList = driver.FindElements(By.XPath(myXPath));
return View(nameList);
}
问题是,无论何时运行,它都会在myURL
位置打开新窗口,然后获取数据,并打开该窗口。
我不希望Selenium在这里打开任何新窗口。只需在后台运行并给我解析数据。我怎样才能做到这一点?请帮我。非常感谢。
答案 0 :(得分:1)
一般来说,我同意andrei:如果您不打算与浏览器窗口进行交互,为什么要使用Selenium? 话虽如此,最简单的做法是防止Selenium离开窗口,是在从函数返回之前关闭它:
driver.Quit();
另一个选项,如果不必在Firefox中加载页面,则使用HtmlUnit Driver代替(它没有UI)
答案 1 :(得分:0)
好吧,似乎您正在创建每个Web请求(但不是关闭/ 处理)Selenium驱动程序对象。正如我在评论中所说,可能有更好的解决方案来解决你的问题...
如果您想获取网页并从中提取某些数据,请随时使用:
Web应用程序对于Selenium驱动程序实例恕我直言并不是一个好客的环境。但是,如果您仍然想要使用它,请将Selenium实例设置为静态并在请求中重用它。但是,如果它将从并发请求(同时运行的多个线程)中使用,那么很可能会出现挤压:)您可以选择保护实例(锁,关键部分等)但是你将拥有零可扩展性。
简短回答:以其他方式获取数据,据我所知,Selenium仅用于自动探索测试 ...
<强>可是... 强>
如果您真的必须探索该网站 - 您的数据来源 - 使用Selenium ...然后提前使用Selenium获取数据 - 推测性地,在另一个进程(在后台运行的控制台应用程序)并将其存储在某些文件或数据库中。然后,从Web应用程序中读取数据并将其返回给客户端:)
如果您还没有客户端要求的数据,请回复一些错误 - “请在5分钟内再试一次”,然后告诉控制台应用程序(在后台运行)获取该数据(跨越进程边界有多种通信方式 - 在我们的案例中是Web应用程序和控制台应用程序,但您可以使用简单的文件/ db来排队“数据请求” - 无论如何) ...