问题在于浏览器通常会执行javascript,并且会生成更新的DOM。除非您可以分析Javascript或拦截其使用的数据,否则您将需要像浏览器一样执行代码。在过去,我遇到了同样的问题,我利用selenium和PhantomJS渲染页面。呈现页面后,我将使用WebDriver客户端浏览DOM并检索所需的内容,然后发布AJAX。
从高层次上讲,这些步骤是:
- 已安装的selenium
- 将硒中心作为服务启动
- 下载的phantomjs(无头浏览器,可以执行javascript)
- 在webdriver模式下启动phantomjs指向selenium hub
- 在我的抓取应用程序中安装了webdriver客户端nuget软件包:
Install-Package Selenium.WebDriver
这是phantomjs网络驱动程序的示例用法:
var options = new PhantomJSOptions();options.AddAdditionalCapability("IsJavascriptEnabled",true);var driver = new RemoteWebDriver( new URI(Configuration.SeleniumServerHub), options.ToCapabilities(), TimeSpan.FromSeconds(3) );driver.Url = "http://www.regulations.gov/#!documentDetail;D=APHIS-2013-0013-0083";driver.Navigate();//the driver can now provide you with what you need (it will execute the script)//get the source of the pagevar source = driver.PageSource;//fully navigate the domvar pathElement = driver.FindElementById("some-id");
编辑:更简单的方法
似乎有一个适用于phantomjs的nuget包,这样您就不需要集线器(我使用集群以这种方式进行大规模报废):
安装网络驱动程序:
Install-Package Selenium.WebDriver
安装嵌入式exe:
Install-Package phantomjs.exe
更新的代码:
var driver = new PhantomJSDriver();driver.Url = "http://www.regulations.gov/#!documentDetail;D=APHIS-2013-0013-0083";driver.Navigate();//the driver can now provide you with what you need (it will execute the script)//get the source of the pagevar source = driver.PageSource;//fully navigate the domvar pathElement = driver.FindElementById("some-id");
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)