2013-08-05 2 views
13

오랫동안이 사이트를 사용하여 내 질문에 대한 답변을 찾았지만이 질문에 대한 답변을 찾을 수 없었습니다.웹 페이지에서 데이터를 가져 와서 특정 부분을 파싱하여 표시합니다.

저는 수업 프로젝트에서 소그룹과 함께 일하고 있습니다. 우리는 사람들이 등록하고, 그들이 원하는 게임에 넣을 수 있고, 다른 사람들의 거래를 받아들이거나 무역을 요구할 수있는 작은 "게임 거래"웹 사이트를 구축해야합니다.

Google은 사이트가 일정보다 오래 작동하므로 사이트에 더 많이 추가하려고합니다. 내가하고 싶은 한 가지는 Metacritic에 투입된 게임을 연결하는 것입니다.

여기 제가해야 할 일이 있습니다. 나는 (비주얼 스튜디오 2012에서 ASP와 C#을 사용하여) 메타 캐시 (metaacritic)에 올바른 게임 페이지를 가져 와서 데이터를 가져 와서 특정 부분에 대해 파싱 한 다음 페이지에 데이터를 표시해야합니다.

본질적으로 거래하고자하는 게임을 선택하면 작은 div가 게임의 정보와 등급으로 표시되기를 원합니다. 나는 더 많은 것을 배우고 내가 시작할 필요가없는이 프로젝트에서 뭔가를 얻으려면이 방법으로하고 싶다.

어디서부터 시작해야할지 누군가가 말할 수 있는지 궁금합니다. 페이지에서 데이터를 가져 오는 방법을 모르겠습니다. 나는 게임의 제목을 자동으로 검색하고 페이지를 그런 식으로 찾거나 게임의 페이지로 곧장 갈 수있는 방법을 찾을 수 있는지 알아볼 필요가 있는지 알아 내려고 노력 중이다. 일단 데이터를 얻은 후에는 필자가 필요로하는 특정 정보를 가져 오는 방법을 알지 못합니다.

쉬운 일로 여기지 않는 것 중 하나는 C#과 asp와 함께 C++을 배우므로 내 전선을 계속 가로 채고 있습니다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 그것은 큰 도움이 될 것입니다. 감사합니다

+1

구글, HTML 민첩성 팩 및 피들러 – ryan

+1

당신이 찾고있는 기간은 화면 벗기거나입니다 [웹 스크래핑 (http://en.wikipedia.org/wiki/Web_scraping). – Greg

답변

29

이 작은 예제에서는 HtmlAgilityPack을 사용하고 XPath 선택기를 사용하여 원하는 요소를 가져옵니다. Ctrl 키

  • 열기 개발자 도구 (F12 또는 :

    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를 얻기 쉬운 방법은 웹 브라우저 (내가 크롬을 사용) 개발자 도구를 사용하는 것입니다 + 시프트 + 또는 명령 + 시프트 + C).

  • XPath를 사용할 페이지에서 요소를 선택하십시오.
  • "요소"탭에서 요소를 마우스 오른쪽 단추로 클릭하십시오.
  • "XPath로 복사"를 클릭하십시오.

내 코드에 표시된 것과 똑같이 붙여 넣을 수 있지만 따옴표는 반드시 이스케이프 처리해야합니다.

페이지의 HTML 서식을 변경하면 웹 스크래핑으로 인해 오류가 발생할 수 있으므로 오류 처리 기술을 사용해야합니다.

+2

html 민첩성 팩을 사용했을 때와 다른 방식으로 브라우저가 xpath를 뽑아 냈다는 것을 알기까지 시간이 걸렸지 만, 일단 문제를 파악하면 원하는 기능을 제대로 수행하는 데 몇 시간 밖에 걸리지 않았습니다. 도와 줘서 고마워. – Aloehart

+5

크롬에서 XPath 값을 얻기위한 Upvote. –

+0

@Aloehart 어떻게 html 민첩성 팩이 xpaths를 원하나요? 나는 같은 문제가 있다고 생각한다. – Djeroen

5

내가 보았고 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(); 
} 

그런 다음 메타 데이터의 메타 태그 사용을 활용하여 원하는 데이터의 문자열을 구문 분석 할 수 있습니다.

  • OG : 제목
  • OG : 유형
  • OG : 홈페이지
  • OG : 이미지
  • OG : _ 이름
  • OG : 설명
  • 여기가 메타 태그에 사용 가능한 정보입니다

각 태그의 형식은 다음과 같습니다. meta name="og:title" content="In a World..."

6

나는 Dcsoup을 권장합니다. 그것에 대한 nuget package가 있고 CSS 선택기를 사용하므로 jquery를 사용하는 경우 익숙합니다. 나는 다른 사람들을 시도했지만, 내가 찾은 것을 사용하는 것이 가장 쉽고 쉽다. 많은 문서가 없지만 오픈 소스이고 을 가진 jsoup library의 자바 포트입니다. 나는 그것을 절대적으로 좋아한다.

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

굉장! 고마워. 왜 온라인 문서 도구가 없는지 궁금합니다. 그런 식으로 꽤 매끄 럽습니다. –

+0

잘 작동하고있어, btw !!! –

+0

그것은 내가 필요한 것입니다. 그러나 이상하게도, 문화적으로 관련된 문제 **가 생겼습니다. HTML 텍스트 요소를 'float.Parse()'할 때 (예 : 7.5), 구문 분석 오류가 발생했습니다. 문화권 설정은 다릅니다 (예 : 7.5는 7.5). 따라서 분수로 파싱 할 때마다 네임 스페이스'System.Globalization'의 선택적 매개 변수로'CultureInfo.InvariantCulture'를 포함시켜야했습니다. – rTECH

관련 문제