web-dev-qa-db-fra.com

Raclage de la page Web générée par javascript avec C #

J'ai un navigateur Web et une étiquette dans Visual Studio. Ce que j'essaie de faire, c'est de récupérer une section d'une autre page Web.

J'ai essayé d'utiliser WebClient.DownloadString et WebClient.DownloadFile, et les deux me donnent le code source de la page Web avant que le javascript ne charge le contenu. Mon idée suivante était d'utiliser un outil WebBrowser et d'appeler simplement webBrowser.DocumentText après le chargement de la page et que cela ne fonctionnait pas, cela me donne toujours la source d'origine de la page.

Est-il possible de récupérer la page post-javascript?

Voici la page que je tente de gratter.

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

Je dois obtenir le commentaire de cette page, qui est générée.

14
Prokzy

Le problème est que le navigateur exécute généralement le javascript et qu'il en résulte un DOM mis à jour. Sauf si vous pouvez analyser le javascript ou intercepter les données qu'il utilise, vous devrez exécuter le code comme le ferait votre navigateur. Dans le passé, j'ai rencontré le même problème, j'ai utilisé Selenium et PhantomJS pour rendre la page. Après le rendu de la page, je voudrais utiliser le client WebDriver pour naviguer dans le DOM et récupérer le contenu dont j'avais besoin, après AJAX. 

A un niveau élevé, voici les étapes:

  1. Sélénium installé: http://docs.seleniumhq.org/
  2. Démarrage du hub Selenium en tant que service
  3. Phantomjs téléchargé (un navigateur sans navigateur, capable d’exécuter du javascript): http://phantomjs.org/
  4. Lancement de phantomjs en mode WebDriver pointant vers le hub Selenium
  5. Dans mon application de grattage installé le package de nuget client Webdriver: Install-Package Selenium.WebDriver

Voici un exemple d'utilisation du pilote Web de 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");

Plus d’informations sur Selenium, phantomjs et Webdriver sont disponibles aux liens suivants:

http://docs.seleniumhq.org/

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

http://phantomjs.org/

EDIT: Méthode plus simple  

Il semble qu'il existe un paquet de pépites pour les phantomjs, de sorte que vous n'ayez pas besoin du concentrateur (j'ai utilisé un cluster pour effectuer un démantèlement massif de cette manière):

Installer le pilote Web:

Install-Package Selenium.WebDriver

Installez exe intégré:

Install-Package phantomjs.exe

Code mis à jour:

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

ok je vais vous montrer comment activer javascript avec phantomjs et selenuim avec c # 

  1. créer un nouveau projet de console nommez-le comme vous le souhaitez 
  2. allez dans la solution Explorer dans votre main droite 
  3. un clic droit sur Références cliquez sur Gérer les packages NuGet
  4. un Windows va montrer cliquez sur Parcourir que installer Selenium.WebDriver 
  5. phantomjs descendu d'ici Phantomjs
  6. dans votre fonction principale, tapez ce code 

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

n'oubliez pas de mettre votre site Web et l'élément que vous recherchez et le chemin d'accès phantomjs.exe dans votre ordinateur dans le code ci-dessous

passer un bon moment de codage et merci wbennett

1
elaz

Grâce à wbennet, découverte https://phantomjscloud.com . Suffisamment de service gratuit pour supprimer des pages via des appels API Web.

    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;
        }
    }

Ouais.

0
CrazyDev