2013-08-05 27 views
13

Witrynę używam już od dawna, aby znaleźć odpowiedzi na moje pytania, ale nie byłem w stanie znaleźć odpowiedzi na to pytanie.Wyciąganie danych ze strony internetowej, analizowanie pod kątem konkretnych elementów i wyświetlanie ich.

Pracuję z małą grupą przy projekcie klasy. Mamy zbudować małą stronę internetową "handlu gier", która pozwala ludziom się zarejestrować, umieścić w grze, którą chcą handlować, i akceptować transakcje od innych lub zażądać handlu.

Witryna funkcjonuje długo przed terminem, więc staramy się dodać więcej do witryny. Jedną rzeczą, którą chcę zrobić sam, jest połączenie gier, które są wprowadzane do Metakrytycznych.

Oto, co muszę zrobić. Muszę (używając asp i C# w visual studio 2012) uzyskać prawidłową stronę gry dotyczącą metakryty, pobrać jej dane, przeanalizować je pod kątem konkretnych części, a następnie wyświetlić dane na naszej stronie.

Zasadniczo po wybraniu gry, którą chcesz wymienić, chcemy wyświetlić mały element div z informacjami i oceną gry. Chcę to zrobić w ten sposób, aby dowiedzieć się więcej i uzyskać coś z tego projektu, od którego nie musiałem zaczynać.

Zastanawiałem się, czy ktoś może mi powiedzieć, od czego zacząć. Nie wiem, jak wyciągnąć dane ze strony. Nadal próbuję dowiedzieć się, czy muszę spróbować napisać coś, aby automatycznie wyszukać tytuł gry i znaleźć stronę w ten sposób lub czy mogę znaleźć jakiś sposób, aby przejść bezpośrednio do strony gry. A kiedy już dostanę dane, nie wiem, jak wyciągnąć z nich konkretne informacje.

Jedną z rzeczy, która nie czyni tego łatwym, jest to, że uczę się C++ wraz z C# i aspem, więc cały czas mam druty. Gdyby ktoś wskazał mi właściwy kierunek, byłoby to wielką pomocą. Dzięki

+1

Google, HTML Agility pack Skrzypek – ryan

+1

Termin szukasz jest skrobanie ekranu lub [Web Skrobanie] (http://en.wikipedia.org/wiki/Web_scraping). – Greg

Odpowiedz

29

Ten mały przykład używa HtmlAgilityPack i używa selektorów XPath, aby uzyskać żądane elementy.

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

Łatwym sposobem uzyskania XPath dla danego elementu jest za pomocą przeglądarki internetowej (używam Chrome) Narzędzia programistyczne:

  • Otwartych narzędzi dla programistów (F12 lub Ctrl + Przesunięcie + C na komendę Windows lub + Przesunięcie + C dla komputerów Mac).
  • Wybierz element strony, dla której chcesz uzyskać XPath.
  • Kliknij prawym przyciskiem myszy element w zakładce "Elementy".
  • Kliknij "Kopiuj jako XPath".

Możesz wkleić go dokładnie tak jak w C# (jak pokazano w moim kodzie), ale upewnij się, aby uciec od cytatów.

Musisz upewnić się, że używasz technik obsługi błędów, ponieważ funkcja Web Scrapping może powodować błędy, jeśli zmieniają formatowanie HTML strony.

+2

Zajęło mi trochę czasu, zanim zdałem sobie sprawę z tego, że moja przeglądarka wyciągnęła ścieżkę xpaths inaczej niż użyto pakietu agility html, ale kiedy zorientowałem się, że to zajmuje, zajęło mi to tylko kilka godzin, aby uzyskać działającą konfigurację tego, co chciałem zrobić. Dziękuję za pomoc. – Aloehart

+5

Awansuj, aby uzyskać wartość XPath z Chrome. –

+0

@Aloehart, w jaki sposób pakiet agility html chce korzystać z xpaths? Myślę, że mam ten sam problem. – Djeroen

5

Rozejrzałem się i Metacritic.com nie ma interfejsu API.

Możesz użyć HttpWebRequest, aby uzyskać zawartość strony internetowej jako ciąg znaków.

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

Następnie można przeanalizować ciąg znaków dla żądanych danych, wykorzystując metakrytyczne metatagi. Oto informacje, które mają dostępny w meta tagi:

  • og: title
  • og: Typ
  • og: url
  • og: image
  • og: site_name
  • og: Opis

Format każdego tagu to: meta name="og:title" content="In a World..."

6

Polecam Dcsoup. Do tego jest nuget package i używa selektorów css, więc jest dobrze znane, jeśli używasz jquery. Próbowałem innych, ale jest to najlepsze i najłatwiejsze w użyciu rozwiązanie. Nie ma zbyt wiele dokumentacji, ale jest to open source i port java jsoup library, który ma good documentation. Absolutnie to uwielbiam.

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

Awesome! Wielkie dzięki. Zastanawiam się, dlaczego nie ma on Docs online ... Byłoby całkiem śliczne w ten sposób! –

+0

Działa bardzo dobrze, Btw !!! –

+0

Właśnie tego potrzebowałem. Dziwnie jednak to spowodowało ** problemy związane z kulturą ** dla mnie: kiedy próbowałem 'float.Parse()' element tekstowy HTML, który miał ułamek (np. 7.5), dostałem błąd parsowania, ponieważ mój Ustawienia kultury są różne (np. 7,5 to 7,5). Tak więc, kiedykolwiek użyłem parsowania z ułamkami, musiałem dodać "CultureInfo.InvariantCulture" jako parametr opcjonalny z przestrzeni nazw 'System.Globalization', a następnie zadziałało. – rTECH