web-dev-qa-db-fra.com

Extraire des données d'une page Web, les analyser pour des éléments spécifiques et les afficher

J'utilise ce site depuis longtemps pour trouver des réponses à mes questions, mais je n'ai pas pu trouver la réponse sur celui-ci.

Je travaille avec un petit groupe sur un projet de classe. Nous devons créer un petit site Web de "commerce de jeux" qui permet aux gens de s'inscrire, de jouer à un jeu qu'ils souhaitent échanger et d'accepter des échanges de tiers ou de demander un échange.

Le site fonctionne bien en avance sur le calendrier, nous essayons donc d'en ajouter davantage au site. Une chose que je veux faire moi-même est de lier les jeux intégrés à Metacritic.

Voici ce que je dois faire. Je dois (en utilisant asp et c # dans Visual Studio 2012) obtenir la page de jeu correcte sur métacritique, extraire ses données, les analyser pour des parties spécifiques, puis afficher les données sur notre page.

Essentiellement, lorsque vous choisissez un jeu que vous souhaitez échanger, nous voulons qu'un petit div s'affiche avec les informations et la note du jeu. Je veux le faire de cette façon pour en savoir plus et tirer quelque chose de ce projet avec lequel je n'ai pas dû commencer.

Je me demandais si quelqu'un pouvait me dire par où commencer. Je ne sais pas comment extraire des données d'une page. J'essaie toujours de savoir si je dois essayer d'écrire quelque chose pour rechercher automatiquement le titre du jeu et trouver la page de cette façon ou si je peux trouver un moyen d'aller directement à la page du jeu. Et une fois que j'ai obtenu les données, je ne sais pas comment en tirer les informations spécifiques dont j'ai besoin.

L'une des choses qui ne rend pas cela facile, c'est que j'apprends le c ++ avec c # et asp, donc je continue de croiser mes fils. Si quelqu'un pouvait m'orienter dans la bonne direction, ce serait d'une grande aide. Merci

18
Aloehart

Ce petit exemple utilise HtmlAgilityPack et utilise les sélecteurs XPath pour accéder aux éléments souhaités.

protected void Page_Load(object sender, EventArgs e)
{
    string url = "http://www.metacritic.com/game/pc/halo-spartan-assault";
    var web = new HtmlAgilityPack.HtmlWeb();
    HtmlDocument doc = web.Load(url);

    string metascore = doc.DocumentNode.SelectNodes("//*[@id=\"main\"]/div[3]/div/div[2]/div[1]/div[1]/div/div/div[2]/a/span[1]")[0].InnerText;
    string userscore = doc.DocumentNode.SelectNodes("//*[@id=\"main\"]/div[3]/div/div[2]/div[1]/div[2]/div[1]/div/div[2]/a/span[1]")[0].InnerText;
    string summary = doc.DocumentNode.SelectNodes("//*[@id=\"main\"]/div[3]/div/div[2]/div[2]/div[1]/ul/li/span[2]/span/span[1]")[0].InnerText;
}

Un moyen simple d'obtenir le XPath pour un élément donné consiste à utiliser votre navigateur Web (j'utilise Chrome) Developer Tools:

  • Ouvrez les outils de développement (F12 ou Ctrl + Shift + C sous Windows ou Command + Shift + C pour Mac).
  • Sélectionnez l'élément dans la page pour lequel vous souhaitez le XPath.
  • Cliquez avec le bouton droit sur l'élément dans l'onglet "Éléments".
  • Cliquez sur "Copier en tant que XPath".

Vous pouvez le coller exactement comme ça en c # (comme indiqué dans mon code), mais assurez-vous d'échapper aux guillemets.

Vous devez vous assurer que vous utilisez certaines techniques de gestion des erreurs car la mise à la ferraille Web peut provoquer des erreurs si elles modifient la mise en forme HTML de la page.

Modifier

Selon la suggestion de @ knocte, voici le lien vers le package Nuget pour HTMLAgilityPack:

https://www.nuget.org/packages/HtmlAgilityPack/

45
Hanlet Escaño

J'ai regardé et Metacritic.com n'a pas d'API.

Vous pouvez utiliser un HttpWebRequest pour obtenir le contenu d'un site Web sous forme de chaîne.

using System.Net;
using System.IO;
using System.Windows.Forms;

string result = null;
string url = "http://www.stackoverflow.com";
WebResponse response = null;
StreamReader reader = null;

try
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "GET";
    response = request.GetResponse();
    reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
    result = reader.ReadToEnd();
}
catch (Exception ex)
{
    // handle error
    MessageBox.Show(ex.Message);
}
finally
{
    if (reader != null)
        reader.Close();
    if (response != null)
        response.Close();
}

Ensuite, vous pouvez analyser la chaîne pour les données que vous souhaitez en tirant parti de l'utilisation des balises META par Metacritic. Voici les informations disponibles dans les balises META:

  • og: titre
  • og: type
  • og: url
  • og: image
  • og: nom_site
  • og: description

Le format de chaque balise est: meta name="og:title" content="In a World..."

9
JeremiahDotNet

Je recommande Dcsoup . Il y a un paquet nuget pour cela et il utilise des sélecteurs CSS donc il est familier si vous utilisez jquery. J'en ai essayé d'autres mais c'est le meilleur et le plus simple à utiliser que j'ai trouvé. Il n'y a pas beaucoup de documentation, mais c'est open source et un port de Java bibliothèque jsoup qui a bonne documentation . (Documentation pour le - . NET API here .) Je l'adore.

var timeoutInMilliseconds = 5000;
var uri = new Uri("http://www.metacritic.com/game/pc/fallout-4");
var doc = Supremes.Dcsoup.Parse(uri, timeoutInMilliseconds);

// <span itemprop="ratingValue">86</span>
var ratingSpan = doc.Select("span[itemprop=ratingValue]");
int ratingValue = int.Parse(ratingSpan.Text);

// selectors match both critic and user scores
var scoreDiv = doc.Select("div.score_summary");
var scoreAnchor = scoreDiv.Select("a.metascore_anchor");
int criticRating = int.Parse(scoreAnchor[0].Text);
float userRating = float.Parse(scoreAnchor[1].Text);
9
Jason Goemaat