3

J'ai une tâche simple, mais il faudra que quelqu'un qui connaît le système CefSharp la résolve.Utilisation de CefSharp.Offscreen pour récupérer une page Web qui nécessite Javascript pour afficher

J'ai une URL que je veux récupérer le HTML. Le problème est que cette URL ne distribue pas réellement la page sur un GET. Au lieu de cela, il pousse un tas de Javascript dans le navigateur, qui exécute alors et produit la page rendue réelle. Cela signifie que les approches habituelles impliquant HttpWebRequest et HttpWebResponse ne vont pas fonctionner.

J'ai regardé un certain nombre de différentes options "sans tête", et celui que je pense le mieux à mes besoins pour un certain nombre de raisons est CefSharp.Offscreen. Mais je ne sais pas comment cette chose fonctionne. Je vois qu'il y a plusieurs événements auxquels on peut s'abonner, et quelques options de configuration, mais je n'ai pas besoin de quelque chose comme un navigateur intégré.

Tout ce que je vraiment besoin est un moyen de faire quelque chose comme ça (pseudo-code):

string html = CefSharp.Get(url); 

Je n'ai pas un problème inscrivez-vous à des événements, si c'est ce qu'il faut attendre le Javascript pour exécuter et produire la page rendue.

+2

Voir https://gist.github.com/amaitland/9d8897067bdff5b999a1 devrait vous aider à démarrer. – amaitland

+0

@amaitland: Merci. Quelle est la manière actuelle d'attendre que le Javascript soit exécuté et que la page soit entièrement rendue avant d'obtenir le code HTML résultant? NavStateChangedEventArgs ne semble plus exister. –

+1

'NavStateChanged' =' LoadingStateChanged'. Il n'y a pas d'événement qui attend que javascript se termine, le mieux c'est que la page a fini de charger. J'ai vu des gens attendre juste un certain temps, ce qui fonctionne dans certains cas. Vous trouverez peut-être plus facile d'injecter du javascript, vérifiez certaines conditions sur la page. – amaitland

Répondre

2

Si vous ne pouvez pas obtenir une version sans tête de Chromium pour vous aider, vous pouvez essayer node.js et jsdom (https://github.com/tmpvar/jsdom). Facile à installer et à jouer une fois que vous avez un nœud opérationnel. Vous pouvez voir des exemples simples sur Github README où ils déroulent une URL, exécuter tout javascript, y compris tout code javascript personnalisé (exemple: bits jQuery pour compter certains types d'éléments), puis vous avez le HTML en mémoire pour faire ce que vous voulez . Vous pouvez juste faire $ ('body') .html() et obtenir une chaîne, comme dans votre pseudo-code. (Cela fonctionne même pour générer des graphiques SVG puisque ce ne sont que des nœuds d'arborescence XML.)

Si vous avez besoin de cela dans le cadre d'une application C# plus grande que vous avez besoin de distribuer, votre idée d'utiliser CefSharp.Offscreen semble raisonnable . Une approche pourrait être de faire fonctionner les choses avec CefSharp.WinForms ou CefSharp.WPF d'abord, où vous pouvez littéralement voir les choses, puis essayez CefSharp.Offscreen plus tard lorsque tout cela fonctionne. Vous pouvez même avoir un peu de JavaScript en cours d'exécution dans le navigateur à l'écran pour tirer vers le bas body.innerHTML et le renvoyer comme une chaîne à la partie C# des choses avant de devenir sans tête. Si cela fonctionne, le reste devrait être facile.

Commencez peut-être par CefSharp.MinimalExample (https://github.com/cefsharp/CefSharp.MinimalExample) et obtenez cette compilation, puis modifiez-la pour vos besoins. Vous devez être en mesure de définir webBrowser.Address dans votre code C#, et vous devez savoir quand la page a Loaded, alors vous devez appeler webBrowser.EvaluateScriptAsync (".. code JS ..") avec votre code JavaScript (comme une chaîne) qui fera quelque chose comme décrit (en retournant bodyElement.innerHTML en tant que chaîne).