Подтвердить что ты не робот

Вытягивание данных с веб-страницы, разбор его для определенных фрагментов и отображение его

Я давно использую этот сайт, чтобы найти ответы на мои вопросы, но я не смог найти ответ на этот вопрос.

Я работаю с небольшой группой над проектом класса. Мы создадим небольшой сайт для торговли играми, который позволяет людям регистрироваться, помещать в игру, которую они хотят обменять, и принимать сделки от других или запрашивать сделку.

У нас работает сайт задолго до того, как мы планируем добавить сайт на сайт. Одна вещь, которую я хочу сделать сам, - связать игры, которые помещены в Metacritic.

Вот что мне нужно сделать. Мне нужно (используя asp и С# в visual studio 2012) получить правильную страницу игры на метакритике, вытащить ее данные, проанализировать ее для определенных частей, а затем отобразить данные на нашей странице.

По сути, когда вы выбираете игру, которую хотите торговать, мы хотим, чтобы маленький div отображался с информацией об игре и рейтингом. Я хочу сделать это так, чтобы узнать больше и получить что-то из этого проекта, с которого мне не пришлось начинать.

Мне было интересно, может ли кто-нибудь сказать мне, с чего начать. Я не знаю, как извлекать данные со страницы. Я все еще пытаюсь выяснить, нужно ли мне что-то писать, чтобы автоматически искать название игры и найти страницу таким образом, или я могу найти способ перейти прямо к странице игры. И как только я получаю данные, я не знаю, как вытащить нужную мне информацию.

Одна из вещей, которая не делает это легким, - это то, что я изучаю С++ вместе с С# и asp, поэтому я продолжаю скрещивать свои проводы. Если кто-то может указать мне в правильном направлении, это будет большой помощью. Благодаря

4b9b3361

Ответ 1

В этом небольшом примере используется 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 для данного элемента - использовать ваш веб-браузер (я использую Chrome) Developer Tools:

  • Откройте Инструменты разработчика (F12 или Ctrl + Shift + C в Windows или Command + Shift + C для Mac).
  • Выберите элемент на странице, для которого вы хотите использовать XPath.
  • Щелкните правой кнопкой мыши элемент на вкладке "Элементы".
  • Нажмите "Копировать как XPath".

Вы можете вставить его точно так же, как это в С# (как показано в моем коде), но обязательно избегайте кавычек.

Вы должны убедиться, что используете некоторые методы обработки ошибок, потому что Web Scrapping может вызвать ошибки, если они изменяют форматирование HTML страницы.

редактировать

По предложению @knocte, вот ссылка на пакет Nuget для HTMLAgilityPack:

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

Ответ 2

Я посмотрел, и 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 для использования метатег. Здесь информация, которую они имеют в метатегах:

  • ог: название
  • ог: Тип
  • ог: URL
  • OG: изображение
  • ог: site_name
  • OG: описание

Формат каждого тега: meta name="og:title" content="In a World..."

Ответ 3

Я рекомендую Dcsoup. Для него есть пакет nuget, и он использует селекторы CSS, так что он знаком, если вы используете jquery. Я пробовал другие, но это лучший и самый простой в использовании, который я нашел. Там не так много документации, но есть открытый исходный код и порт библиотеки java jsoup с хорошей документацией. (Документация по .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);