2013-08-05 63 views
13

Tôi đã sử dụng trang web này trong một thời gian dài để tìm câu trả lời cho câu hỏi của mình, nhưng tôi không thể tìm thấy câu trả lời cho câu hỏi này.Kéo dữ liệu từ một trang web, phân tích dữ liệu cho các phần cụ thể và hiển thị nó

Tôi đang làm việc với một nhóm nhỏ trong một dự án lớp học. Chúng tôi đang xây dựng một trang web "giao dịch trò chơi" nhỏ cho phép mọi người đăng ký, đưa vào trò chơi họ muốn giao dịch và chấp nhận giao dịch từ người khác hoặc yêu cầu giao dịch.

Chúng tôi có trang web hoạt động lâu trước lịch biểu nên chúng tôi đang cố gắng thêm nhiều hơn vào trang web. Một điều tôi muốn làm là liên kết các trò chơi được đưa vào Metacritic.

Đây là những gì tôi cần làm. Tôi cần (sử dụng asp và C# trong studio trực quan 2012) để có được trang trò chơi chính xác trên metacritic, lấy dữ liệu của nó, phân tích nó cho các phần cụ thể, và sau đó hiển thị dữ liệu trên trang của chúng tôi.

Về cơ bản khi bạn chọn trò chơi bạn muốn giao dịch, chúng tôi muốn một div nhỏ hiển thị cùng với thông tin và xếp hạng của trò chơi. Tôi muốn làm điều đó theo cách này để tìm hiểu thêm và có được một cái gì đó trong dự án này mà tôi không phải bắt đầu.

Tôi đã tự hỏi liệu có ai có thể cho tôi biết bắt đầu từ đâu không. Tôi không biết cách kéo dữ liệu từ một trang. Tôi vẫn đang cố gắng tìm ra nếu tôi cần thử viết một cái gì đó để tự động tìm kiếm tựa đề của trò chơi và tìm trang đó theo cách đó hoặc nếu tôi có thể tìm được cách nào đó để đi thẳng đến trang của trò chơi. Và một khi tôi đã nhận được dữ liệu, tôi không biết làm thế nào để kéo các thông tin cụ thể tôi cần từ nó.

Một trong những điều không thực hiện điều này dễ dàng là tôi đang học C++ cùng với C# và asp nên tôi tiếp tục bị đứt dây. Nếu ai đó có thể chỉ cho tôi đúng hướng nó sẽ là một trợ giúp lớn. Cảm ơn

+1

Google, HTML Agility Pack & Fiddler – ryan

+1

Thuật ngữ mà bạn đang tìm kiếm là màn hình tìm kiếm hoặc [Web Scraping] (http://en.wikipedia.org/wiki/Web_scraping). – Greg

Trả lời

29

Ví dụ nhỏ này sử dụng HtmlAgilityPack và sử dụng bộ chọn XPath để truy cập các yếu tố mong muốn.

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

Một cách dễ dàng để có được những XPath cho một yếu tố nhất định là bằng cách sử dụng trình duyệt web của bạn (tôi sử dụng Chrome) Developer Tools:

  • mở Developer Tools (F12 hay Ctrl + Shift + C trên Windows hoặc Lệnh + Shift + C dành cho Mac).
  • Chọn phần tử trong trang mà bạn muốn XPath.
  • Nhấp chuột phải vào phần tử trong tab "Yếu tố".
  • Nhấp vào "Sao chép dưới dạng XPath".

Bạn có thể dán chính xác như vậy trong C# (như được hiển thị trong mã của tôi), nhưng hãy đảm bảo thoát khỏi dấu ngoặc kép.

Bạn phải đảm bảo rằng bạn sử dụng một số kỹ thuật xử lý lỗi vì Web Scrapping có thể gây ra lỗi nếu chúng thay đổi định dạng HTML của trang.

+2

Mất một lúc để nhận ra rằng trình duyệt của tôi đã kéo xpath khác với gói nhanh nhẹn được sử dụng, nhưng một khi tôi đã tìm ra vấn đề đó chỉ mất vài giờ để có được thiết lập hoạt động của những gì tôi muốn làm. Cảm ơn sự giúp đỡ của bạn. – Aloehart

+5

Nhận ưu đãi để nhận giá trị XPath từ Chrome. –

+0

@Aloehart gói html nhanh nhẹn muốn các xpath như thế nào? tôi nghĩ rằng tôi đang gặp vấn đề tương tự – Djeroen

5

Tôi đã xem và Metacritic.com không có API.

Bạn có thể sử dụng HttpWebRequest để lấy nội dung của trang web dưới dạng chuỗi.

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

Sau đó, bạn có thể phân tích chuỗi dữ liệu bạn muốn bằng cách tận dụng việc sử dụng thẻ meta của Metacritic. Dưới đây là những thông tin mà họ có sẵn trong các thẻ meta:

  • og: Tiêu đề
  • og: type
  • og: url
  • og: image
  • og: SITE_NAME
  • og: Mô tả

Định dạng của mỗi thẻ là: meta name="og:title" content="In a World..."

6

Tôi khuyên bạn nên Dcsoup. Có một nuget package cho nó và nó sử dụng bộ chọn css để nó quen thuộc nếu bạn sử dụng jquery. Tôi đã thử những người khác nhưng nó là tốt nhất và dễ sử dụng nhất mà tôi đã tìm thấy. Không có nhiều tài liệu, nhưng đó là mã nguồn mở và một cổng của java jsoup librarygood documentation. Tôi hoàn toàn thích nó.

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

Tuyệt vời! Cảm ơn rất nhiều. Tôi tự hỏi tại sao nó không có Tài liệu trực tuyến ... Nó sẽ khá là trơn tru theo cách đó! –

+0

Nó hoạt động rất tốt, btw !!! –

+0

Nó chỉ là những gì tôi cần. Tuy nhiên, lạ thay, điều này tạo ra ** Các vấn đề liên quan đến văn hóa ** đối với tôi: khi tôi cố gắng 'float.Parse()' một phần tử văn bản HTML có phần nhỏ (ví dụ 7.5), tôi gặp lỗi phân tích cú pháp, vì Cài đặt văn hóa khác (ví dụ 7,5 là 7,5). Vì vậy, bất cứ khi nào tôi sử dụng phân tích cú pháp với phân số, tôi đã bao gồm 'CultureInfo.InvariantCulture' như một tham số tùy chọn từ không gian tên' System.Globalization' và sau đó nó hoạt động tốt. – rTECH