Скремблирование веб-страницы, созданной javascript с помощью С#

У меня есть веб-браузер и ярлык в Visual Studio, и в основном я пытаюсь получить раздел с другой веб-страницы.

Я попытался использовать WebClient.DownloadString и WebClient.DownloadFile, и оба они дают мне исходный код веб-страницы до того, как JavaScript загрузит содержимое. Моя следующая идея состояла в том, чтобы использовать инструмент WebBrowser и просто вызывать webBrowser.DocumentText после загрузки страницы, и это не сработало, это все равно дает мне исходный источник страницы.

Есть ли способ, как я могу получить страницу пост-javascriptload?

Ответ 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/

http://docs.seleniumhq.org/projects/webdriver/

http://phantomjs.org/

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");

Ответ 2

ok Я покажу вам, как включить javascript, используя phantomjs и selenuim с С#

  • создайте новое имя проекта консоли, как хотите
  • перейдите в редактор решений в правой руке.
  • щелкните правой кнопкой мыши на ссылке, нажмите "Управление пакетами NuGet"
  • окна показывают, что нажмите на просмотр, а затем установите Selenium.WebDriver
  • downold phantomjs отсюда Phantomjs
  • в вашей основной функции введите этот код

        var options = new PhantomJSOptions();
        options.AddAdditionalCapability("IsJavaScriptEnabled", true);
        IWebDriver driver = new PhantomJSDriver("phantomjs Folder Path", options);
        driver.Navigate().GoToUrl("https://www.yourwebsite.com/");
    
        try
        {
            string pagesource = driver.PageSource;
            driver.FindElement(By.Id("yourelement"));
            Console.Write("yourelement founded");
    
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
    
        }
    
        Console.Read();
    

не забудьте поставить свой веб-сайт и элемент, который вы ищете, и путь phantomjs.exe на вашем компьютере в этом коде ниже

имеют отличное время кодирования и спасибо wbennett

Ответ 3

Благодаря wbennet, обнаружил https://phantomjscloud.com. Достаточно бесплатный сервис, чтобы ломать страницы через веб-звонки API.

    public static string GetPagePhantomJs(string url)
    {
        using (var client = new System.Net.Http.HttpClient())
        {
            client.DefaultRequestHeaders.ExpectContinue = false;
            var pageRequestJson = new System.Net.Http.StringContent(@"{'url':'" + url + "','renderType':'html','outputAsJson':false }");
            var response = client.PostAsync("https://PhantomJsCloud.com/api/browser/v2/{YOUT_API_KEY}/", pageRequestJson).Result;
            return response.Content.ReadAsStringAsync().Result;
        }
    }

Да уж.