2013-08-05 12 views
13

Utilizzo questo sito da molto tempo per trovare risposte alle mie domande, ma non sono riuscito a trovare la risposta su questo.Estrarre dati da una pagina Web, analizzarli per pezzi specifici e visualizzarli

Sto lavorando con un piccolo gruppo su un progetto di classe. Dobbiamo creare un piccolo sito web di "gioco di trading" che consenta alle persone di registrarsi, inserire un gioco che desiderano scambiare e accettare scambi da altri o richiedere uno scambio.

Abbiamo il sito funzionante molto prima del previsto, quindi stiamo cercando di aggiungere altro al sito. Una cosa che voglio fare io stesso è collegare i giochi che vengono messi in Metacritic.

Ecco cosa devo fare. Ho bisogno di (usando asp e C# in visual studio 2012) ottenere la pagina di gioco corretta su metacritic, estrarre i suoi dati, analizzarli per parti specifiche e quindi visualizzare i dati sulla nostra pagina.

Sostanzialmente quando si sceglie un gioco per il quale vogliamo fare trading vogliamo un piccolo div da visualizzare con le informazioni e il punteggio del gioco. Voglio farlo in questo modo per saperne di più e ottenere qualcosa da questo progetto che non dovevo iniziare.

Mi chiedevo se qualcuno potesse dirmi da dove iniziare. Non so come estrarre i dati da una pagina. Sto ancora cercando di capire se ho bisogno di provare a scrivere qualcosa per cercare automaticamente il titolo del gioco e trovare la pagina in questo modo o se riesco a trovare un modo per andare direttamente alla pagina del gioco. E una volta ottenuti i dati, non so come estrarre le informazioni specifiche di cui ho bisogno.

Una delle cose che non rende questo facile è che sto imparando C++ insieme a C# e asp, quindi continuo a farmi incrociare i fili. Se qualcuno potesse indicarmi la giusta direzione, sarebbe di grande aiuto. Grazie

+1

Google, HTML Agility Pack & Fiddler – ryan

+1

Il termine che stai cercando è screen scraping o [web scraping] (http://en.wikipedia.org/wiki/Web_scraping). – Greg

risposta

29

Questo piccolo esempio utilizza HtmlAgilityPack e utilizza i selettori XPath per ottenere gli elementi desiderati.

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

Un modo semplice per ottenere il XPath per un dato elemento è quello di utilizzare il browser web (io uso Chrome) Developer Tools:

  • Aprire i Developer Tools (F12 o Ctrl + Maiusc +C su comandi di Windows o + Maiusc + C per Mac).
  • Selezionare l'elemento nella pagina per cui si desidera l'XPath.
  • Fare clic con il tasto destro del mouse sull'elemento nella scheda "Elementi".
  • Fare clic su "Copia come XPath".

È possibile incollarlo esattamente come in C# (come mostrato nel mio codice), ma assicurarsi di sfuggire alle virgolette.

È necessario assicurarsi di utilizzare alcune tecniche di gestione degli errori poiché Web Scraping può causare errori se modificano la formattazione HTML della pagina.

+2

Ci è voluto un po 'per capire che il mio browser ha richiamato xpath in modo diverso rispetto a quello utilizzato dal pacchetto di agilità html, ma una volta capito il problema sono bastate poche ore per ottenere una configurazione funzionante di ciò che volevo fare. Grazie per l'aiuto. – Aloehart

+5

Voto positivo per ottenere il valore XPath da Chrome. –

+0

@Aloehart come fa il pacchetto di agilità html a volere xpaths? penso di avere lo stesso problema – Djeroen

5

Ho guardato e Metacritic.com non ha un'API.

È possibile utilizzare un HttpWebRequest per ottenere il contenuto di un sito Web come stringa.

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

Quindi è possibile analizzare la stringa per i dati che si desidera, sfruttando l'uso di Metacritic di meta tag. Ecco le informazioni che hanno a disposizione nel meta-tag:

  • OG: titolo
  • og: Tipo
  • og: url
  • og: Immagine
  • og: nome_sito
  • og: Descrizione

Il formato di ogni tag è: meta name="og:title" content="In a World..."

6

Raccomando Dcsoup. C'è uno nuget package per esso e utilizza selettori CSS in modo che sia familiare se si utilizza jQuery. Ho provato altri, ma è il migliore e più facile da usare che ho trovato. Non c'è molta documentazione, ma è open source e una porta di java jsoup library che ha good documentation. Lo adoro assolutamente.

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

Fantastico! Molte grazie. Mi chiedo perché non abbia i documenti online ... Sarebbe stato piuttosto carino in quel modo! –

+0

Funziona molto bene, btw !!! –

+0

È proprio quello di cui avevo bisogno. Stranamente, tuttavia, questo ha creato ** problemi legati alla cultura ** per me: quando ho provato a 'float.Parse()' un elemento di testo HTML che aveva una frazione (ad esempio, 7.5), ho avuto un errore di parsing, perché il mio Le impostazioni di cultura sono diverse (ad esempio, 7,5 è 7,5). Quindi, ogni volta che usavo l'analisi con le frazioni, dovevo includere 'CultureInfo.InvariantCulture' come parametro opzionale dallo spazio dei nomi' System.Globalization' e poi funzionava correttamente. – rTECH

Problemi correlati