Ответ 1
Проблема заключается в том, что браузер обычно выполняет javascript, и это приводит к обновлению DOM. Если вы не сможете проанализировать javascript или перехватить данные, которые он использует, вам нужно будет выполнить код в качестве браузера. Раньше я сталкивался с тем же вопросом, я использовал селен и PhantomJS для отображения страницы. После того, как он отобразит страницу, я бы использовал клиент WebDriver для навигации по DOM и получения содержимого, которое мне нужно, после AJAX.
На высоком уровне это следующие шаги:
- Установленный селен: http://docs.seleniumhq.org/
- Начал концентрацию селена как услугу
- Загруженные phantomjs (безголовый браузер, который может выполнять javascript): http://phantomjs.org/
- Запущен phantomjs в режиме webdriver, указывающий на концентратор селена
- В моем приложении скремблирования установлен пакет nuget клиента webdriver:
Install-Package Selenium.WebDriver
Вот пример использования 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 page
var source = driver.PageSource;
//fully navigate the dom
var pathElement = driver.FindElementById("some-id");
Более подробную информацию о selenium, phantomjs и webdriver можно найти по ссылкам:
http://docs.seleniumhq.org/projects/webdriver/
EDIT: более простой способ
Похоже, для фантомов есть пакет 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 page
var source = driver.PageSource;
//fully navigate the dom
var pathElement = driver.FindElementById("some-id");