web-dev-qa-db-ja.com

Webページからデータを取得し、特定の部分について解析し、表示する

私は長い間このサイトを使用して質問への回答を見つけてきましたが、このサイトで回答を見つけることができませんでした。

私はクラスプロジェクトで小グループと協力しています。私たちは、人々が登録したり、取引したいゲームを入れたり、他の人からの取引を受け入れたり、取引をリクエストしたりできる小さな「ゲーム取引」ウェブサイトを構築します。

予定よりもずっと前に機能するサイトがあるため、サイトにさらに追加しようとしています。自分でやりたいことの1つは、Metacriticに配置されているゲームをリンクすることです。

ここに私がする必要があるものがあります。 (Visual Studio 2012でaspとc#を使用して)metacriticで正しいゲームページを取得し、そのデータを取得し、特定の部分について解析してから、ページにデータを表示する必要があります。

基本的に、トレードしたいゲームを選択するとき、ゲームの情報と評価を表示する小さなdivが必要です。この方法でもっと学び、このプロジェクトから何かを始めたいと思わないようにしたいと思っています。

どこから始めればいいのか誰にも教えてもらえないかと思っていました。ページからデータを取得する方法がわかりません。ゲームのタイトルを自動的に検索してページを見つけるために何かを試して書く必要があるかどうか、またはゲームのページに直接移動する方法を見つけることができるかどうかを判断しようとしています。また、データを取得した後、必要な特定の情報を取得する方法がわかりません。

これを簡単にできないことの1つは、c#とaspと共にc ++を学習しているため、ワイヤーを交差させ続けることです。誰かが私を正しい方向に向けることができれば、それは大きな助けになるでしょう。ありがとう

18
Aloehart

この小さな例では HtmlAgilityPack を使用し、XPathセレクターを使用して目的の要素を取得します。

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

特定の要素のXPathを取得する簡単な方法は、Webブラウザ(私はChromeを使用しています)開発者ツールを使用することです。

  • 開発者ツールを開きます(F12 または Ctrl + Shift + C Windowsまたは Command + Shift + C Mac用)。
  • XPathを使用するページ内の要素を選択します。
  • [要素]タブで要素を右クリックします。
  • [XPathとしてコピー]をクリックします。

あなたはそれをc#でそれとまったく同じように貼り付けることができます(私のコードに示されているように)が、引用符は必ずエスケープしてください。

Web ScrappingはページのHTML形式を変更するとエラーを引き起こす可能性があるため、いくつかのエラー処理手法を使用する必要があります。

編集

@knocteの提案に従って、HTMLAgilityPackのNugetパッケージへのリンクを次に示します。

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

45
Hanlet Escaño

見たところ、Metacritic.comにはAPIがありません。

HttpWebRequestを使用して、Webサイトのコンテンツを文字列として取得できます。

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

次に、Metacriticのメタタグの使用を利用して、必要なデータの文字列を解析できます。メタタグで利用できる情報は次のとおりです。

  • og:title
  • og:type
  • og:url
  • og:image
  • og:site_name
  • og:description

各タグの形式は次のとおりです。meta name="og:title" content="In a World..."

9
JeremiahDotNet

Dcsoup をお勧めします。 nuget package があり、CSSセレクターを使用しているので、jqueryを使用する場合は使い慣れています。私は他の人を試しましたが、それは私が見つけた最高で最も使いやすいです。あまりドキュメントはありませんが、オープンソースであり、Java jsoup library のポートは good documentation です。(- ここでは.NET API 。)絶対に気に入っています。

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