从网页中提取数据,解析特定部分并显示它

时间:2013-08-05 18:51:24

标签: c# asp.net parsing web-crawler server-side

我一直在使用这个网站找我问题的答案,但我无法找到答案。

我正在与一个班级项目的小组合作。我们要建立一个小型的“游戏交易”网站,允许人们注册,投入他们想要交易的游戏,接受他人交易或要求交易。

我们的网站功能已提前很长时间,因此我们尝试向网站添加更多内容。我想做的一件事就是把投入的游戏与Metacritic联系起来。

这就是我需要做的事情。我需要(在visual studio 2012中使用asp和c#)在metacritic上获取正确的游戏页面,拉取其数据,解析特定部分,然后在我们的页面上显示数据。

基本上当你选择想要交易的游戏时,我们想要一个小的div来显示游戏的信息和评级。我想通过这种方式来学习更多,并从这个项目中获得一些我不必从头开始的东西。

我想知道是否有人能告诉我从哪里开始。我不知道如何从页面中提取数据。我仍然想弄清楚我是否需​​要尝试写一些东西来自动搜索游戏的标题并找到那样的页面,或者我是否能找到某种方式直接进入游戏页面。一旦我获得了数据,我就不知道如何从中获取所需的具体信息。

使这一切变得简单的事情之一就是我正在学习c ++以及c#和asp,所以我不断让我的电线交叉。如果有人能指出我正确的方向,那将是一个很大的帮助。感谢

4 个答案:

答案 0 :(得分:41)

这个小例子使用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的简便方法是使用您的网络浏览器(我使用Chrome)开发者工具:

  • 在Windows或命令上打开开发人员工具( F12 Ctrl + Shift + C + Shift + C for Mac)。
  • 在页面中选择您想要XPath的元素。
  • 右键单击“元素”选项卡中的元素。
  • 点击“Copy as XPath”。

你可以像在c#中那样粘贴它(如我的代码所示),但请确保转义引号。

您必须确保使用某些错误处理技术,因为如果Web Scrapping更改了页面的HTML格式,则会导致错误。

答案 1 :(得分:9)

我看了,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使用元标记来解析所需数据的字符串。以下是元标记中提供的信息:

  • OG:标题
  • OG:类型
  • OG:URL
  • OG:图像
  • OG:SITE_NAME
  • OG:描述

每个代码的格式为:meta name="og:title" content="In a World..."

答案 2 :(得分:8)

我建议Dcsoup。它有一个nuget package,它使用css选择器,所以如果你使用jquery就很熟悉了。我尝试过其他人,但这是我发现的最好和最容易使用的。文档不多,但是它的开源和java jsoup library的端口good documentation。我非常喜欢它。

0

答案 3 :(得分:0)

我向您推荐WebsiteParser-它基于HtmlAgilityPack(由HanletEscaño提及),但是它通过属性和CSS选择器使Web抓取更加容易:

class PersonModel
{
    [Selector("#BirdthDate")]
    [Converter(typeof(DateTimeConverter))]
    public DateTime BirdthDate { get; set; }
}

// ...

PersonModel person = WebContentParser.Parse<PersonModel>(html);

Nuget link