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.
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:
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/projects/webdriver/
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");
ok je vais vous montrer comment activer javascript avec phantomjs et selenuim avec c #
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
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.