2014-06-18 15 views
11

Mam webBrowser i etykiety w Visual Studio, i zasadniczo to, co próbuję zrobić, to pobrać sekcję z innej strony.Skracanie strony generowane przez javascript z C#

Próbowałem użyć WebClient.DownloadString i WebClient.DownloadFile, a oba z nich podają mi kod źródłowy strony zanim javascript załaduje zawartość. Moim następnym pomysłem było użycie narzędzia WebBrowser i po prostu wywołanie funkcji webBrowser.DocumentText po wczytaniu strony, która nie działała, nadal daje mi oryginalne źródło strony.

Czy istnieje sposób, w jaki mogę pobrać stronę post-javascriptload?

Oto strona, którą próbuję skrobać.

http://www.regulations.gov/#!documentDetail;D=APHIS-2013-0013-0083

muszę uzyskać komentarz od tej strony, która jest generowana.

Odpowiedz

29

Problem polega na tym, że przeglądarka zazwyczaj wykonuje javascript, co powoduje zaktualizowany DOM. O ile nie można analizować kodu javascript lub przechwytywać danych, których używa, trzeba będzie wykonać kod tak, jak zrobiłby to przeglądarka. W przeszłości wpadłem na ten sam problem, użyłem selenu i PhantomJS do renderowania strony. Po renderowaniu strony użyłbym klienta WebDriver do nawigacji po DOM i pobrania potrzebnej zawartości, wysłania AJAX.

Na wysokim poziomie, to są kroki:

  1. selen zainstalowana: http://docs.seleniumhq.org/
  2. Rozpoczął piasta selen jako usługa
  3. pobrane phantomjs (a bezgłowy przeglądarki, które można wykonać JavaScript): http://phantomjs.org/
  4. Rozpoczęte phantomjs w trybie webdriver wskazujące na piaście selenu
  5. W mojej aplikacji skrobanie zainstalowano webdriver klienta pakiet Nuget: Install-Package Selenium.WebDriver

Oto Wykorzystanie przykładem 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"); 

Więcej informacji na selen, phantomjs i webdriver można znaleźć na poniższych linków:

http://docs.seleniumhq.org/

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

http://phantomjs.org/

EDIT: łatwiejsza metoda

Wydaje jest Nuget pakiet dla phantomjs, tak że nie trzeba piastę (użyłem klastra zrobić ogromny złomowanie w ten sposób):

Instalacja sterownika internetowej:

Install-Package Selenium.WebDriver 

Install osadzone exe:

Install-Package phantomjs.exe 

Zaktualizowany kod:

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

działa idealnie – Flynn

+0

Dzięki za doskonały przykład. Działa świetnie. –

+0

Próbowałem, ale driver.Url się nie zmienia. Nawet nie jest wyjątkiem. Po prostu przekaż i nadal działa: puste. Nawiguj więc zwrotami takimi jak . Próbowałem innych adresów URL. Po prostu poczekaj sekundę i przejdź do następnej linii. Koniec kodu nie może oczywiście znaleźć id-id. Dowolny pomysł? –

1

ok i pokaże, jak włączyć JavaScript używając phantomjs i selenuim zC#

  1. utworzyć nową nazwę projektu konsola go jak chcesz
  2. przejść do rozwiązania explorer w twojej prawej
  3. kliknij prawym przyciskiem myszy na Referencje kliknij na Zarządzaj pakietami NuGet
  4. Windows wyświetli kliknięcie na przeglądanie niż ins Wysoki Selenium.WebDriver
  5. downold phantomjs stąd Phantomjs
  6. w swojej głównej funkcji tego typu kod

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

nie zapomnij umieścić yourwebsite i element, który loooking dla i phantomjs.exe ścieżka w was maszynie w tym kodzie poniżej

mieć wielki czas kodowania i dzięki wbennett