web-dev-qa-db-fra.com

Obtenir le code HTML d'un site Web une fois le chargement terminé

J'essaie d'obtenir le code HTML d'un site Web spécifique async avec le code suivant:

var response = await httpClient.GetStringAsync("url");

Mais le problème est que le site Web prend généralement une seconde de plus pour en charger les autres parties. Ce dont j'ai besoin, alors la question est de savoir si je peux d'abord charger le site et lire le contenu au bout d'un certain temps.

Désolé si cette question a déjà reçu une réponse, mais je ne savais pas vraiment quoi chercher.

Merci, Vingt


Modifier # 1

Si vous voulez l'essayer vous-même, l'URL est http://iloveradio.de/iloveradio/, j'ai besoin du titre et de l'artiste qui ne se chargent pas immédiatement.

17
Twenty

Vous êtes dans la mauvaise direction. Le site référencé a une liste de lecture api qui renvoie json. vous pouvez obtenir des informations de:

http://iloveradio.de/typo3conf/ext/ep_channel/Scripts/playlist.php

Edit: Chome Inspector est utilisé pour trouver le lien Playlist

 enter image description here

11
Simonare

Vous pouvez utiliser Puppeteer-Sharp :

await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = false }))
using (var page = await browser.NewPageAsync())
{
    await page.SetViewportAsync(new ViewPortOptions() { Width = 1280, Height = 600 });
    await page.GoToAsync("http://iloveradio.de/iloveradio/");
    await page.WaitForSelectorAsync("#artisttitle DIV");
    var artist = await page.EvaluateExpressionAsync<string>("$('#artisttitle DIV')[0].innerText");
    Console.WriteLine(artist);
    Console.ReadLine();
}
4
hardkoded

La chose à comprendre ici est que lorsque vous lisez la réponse à partir de l’URL, vous n’obtenez que la réponse brute, dans ce cas le code source HTML avec lequel le serveur a répondu.

Contrairement à ce que vous pouvez voir dans les outils de développement DOM Inspector de votre navigateur, vous n'obtiendrez que le code source HTML d'origine de la page (ce que vous pouvez voir dans l'outil de développement "Page Source"), qui n'inclut aucun contenu créé dynamiquement (JavaScript) contenu chargé (comme les iframes).

Donc, vous n'obtenez pas ce que vous voyez ici dans l'inspecteur DOM:

 enter image description here

Vous obtenez ce que vous voyez ici dans la source de la page (Affichage> Développeur> Afficher la source dans Chrome):

 enter image description here

Vous ne pouvez pas attendre que cet autre contenu soit chargé, car il ne sera jamais chargé, car le contenu HTML n'est ni analysé ni rendu comme le ferait un navigateur.

Vous avez plusieurs options disponibles cependant:

  • Voir si le site Web a une API que vous pouvez utiliser
  • Déterminez où le contenu que vous voulez est réellement chargé et faites une autre requête HTTP/différente pour ce contenu (le panneau Réseau est utile ici).
  • Utilisez un navigateur sans interface graphique pour charger la page par programme et lire dynamiquement le contenu de la page (cela ajoutera beaucoup de surcharge, et devrait probablement être évité si possible)
3
Alexander O'Mara

Si des éléments se chargent après, cela signifie qu'ils sont générés par du code javascript après le chargement de la page (une demande ajax par exemple). dans le code source lors du chargement).

Un moyen facile de le faire:

Utilisez un WebBrowser et lorsque les déclencheurs d'événements DocumentCompleated attendent que l'élément souhaité apparaisse.

Le droit chemin:

trouvez vous-même le javascript et déclenchez-le vous-même (facile à dire, difficile à faire).

3

J'ai vérifié le site, les données sont chargées par javascript. Vous ne pouvez obtenir le code HTML qu'à l'aide de httpClient.GetStringAsync("url");. Pour autant que je sache, il n'y a aucune chance d'obtenir les éléments manipulés par le navigateur.

0
Fagun