2013-08-05 87 views
13

我一直在使用這個網站很長一段時間來找到我的問題的答案,但我無法找到答案在這一個。從網頁中提取數據,解析它的特定部分,並顯示它

我正在與一個班級項目上的小組合作。我們要建立一個小型的「遊戲交易」網站,允許人們註冊,投入他們想要交易的遊戲,並接受其他人的交易或請求交易。

我們的網站運行時間提前很多,所以我們試圖增加更多的網站。我想要做的一件事就是把放入Metacritic的遊戲鏈接起來。

這是我需要做的。我需要(在Visual Studio 2012中使用asp和c#)在metacritic上獲取正確的遊戲頁面,抽取其數據,解析特定部分,然後在頁面上顯示數據。

基本上,當你選擇一個你想交易的遊戲時,我們需要一個小的div來顯示遊戲的信息和評分。我想通過這種方式來學習更多東西,並從這個項目中獲得一些東西,我不必從頭開始。

我想知道是否有人能告訴我從哪裏開始。我不知道如何從網頁中提取數據。我仍然試圖弄清楚是否需要嘗試寫一些東西來自動搜索遊戲的標題並以這種方式找到頁面,或者如果我能找到某種方式直接進入遊戲頁面。一旦我獲得了數據,我不知道如何從中獲得所需的具體信息。

其中一件事情並沒有使這個簡單的事情是,我正在學習C++以及c#和asp,所以我不斷讓我的電線穿過。如果有人能指引我正確的方向,這將是一個很大的幫助。謝謝

+1

谷歌,HTML敏捷性包和提琴手 – ryan

+1

你要找的期限爲屏幕抓取或[網頁抓取(http://en.wikipedia.org/wiki/Web_scraping)。 – Greg

回答

29

這個小例子使用HtmlAgilityPack,並使用XPath選擇器來獲得所需的元素。

protected void Page_Load(object sender, EventArgs e) 
{ 
    string Url = "http://www.metacritic.com/game/pc/halo-spartan-assault"; 
    HtmlWeb web = new 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)開發工具:

  • 打開開發者工具(F12Ctrl鍵 + Shift + C on Windows or Command + Shift對於Mac,+ C)。
  • 在頁面中選擇要用於XPath的元素。
  • 右鍵單擊「元素」選項卡中的元素。
  • 點擊「Copy as XPath」。

你可以粘貼它就像在C#中(如我的代碼所示),但一定要避免引號。

您必須確保使用一些錯誤處理技術,因爲如果Web Scrapping更改頁面的HTML格式時可能導致錯誤。

+2

我花了一段時間才意識到我的瀏覽器將xpath與xml敏捷包的使用方式不同,但是一旦我找到了這個問題,只花了幾個小時才能完成我想要做的功能設置。感謝您的幫助。 – Aloehart

+5

Upvote從Chrome獲取XPath值。 –

+0

@Aloehart html敏捷包希望xpaths如何?我認爲我有同樣的問題 – Djeroen

5

我看了,Metacritic.com沒有API。

您可以使用HttpWebRequest獲取網站的內容作爲字符串。

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使用元標記來分析所需數據的字符串。下面是可用的,他們在meta標籤中的信息:

  • OG:標題
  • OG:類型
  • OG:URL
  • OG:圖像
  • OG:SITE_NAME
  • OG:描述

每個標籤的格式是:meta name="og:title" content="In a World..."

6

我建議Dcsoup。它有一個nuget package它,它使用CSS選擇器,所以它是熟悉的,如果你使用jQuery。我嘗試過其他人,但這是我找到的最好也是最容易使用的。沒有太多的文檔,但它是開源的,並且具有good documentation的java jsoup library的端口。我絕對喜歡它。

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

// <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); 
+0

太棒了!非常感謝。我想知道爲什麼它沒有在線文檔...這將是非常光滑的! –

+0

它工作得很好,btw !!! –

+0

這正是我所需要的。奇怪的是,這爲我創造了與文化相關的問題**:當我嘗試使用float.Parse()這個具有分數(例如7.5)的HTML文本元素時,我得到了一個解析錯誤,因爲我的文化設置是不同的(例如,7.5是7.5)。因此,無論何時我使用分數進行分析,我都必須將'CultureInfo.InvariantCulture'作爲來自命名空間System.Globalization的一個可選參數加入,之後才能正常工作。 – rTECH

相關問題