C# & VB.NET2006. 5. 12. 03:00

네이버가 구글처럼 웹 문서 검색, 지식인 검색 등의 기능을 원격에서 호출할 수 있는 API 서비스를 오픈했다. 현재는 베타 테스트 중이고 하루에 기능을 사용할 수 있는 횟수가 한정되어 있지만 이 API를 사용해서 실제 네이버 웹 문서 검색 페이지와 똑같은 기능을 하는 페이지를 만들어 볼 수 있다.

자세한 사항은 여기로 -> http://openapi.naver.com/
사용하려면 회원 가입을 해서 키를 하나 받아야 한다.

다음 소스는 이 API를 사용해서 네이버 웹 문서를 검색하는 페이지를 Visual Studio 2005, C#으로 만들어 본 샘플이다.

먼저 페이지 디자인.
간단하게 검색어를 입력하는 텍스트 박스와 검색을 실행하는 버튼으로 구성했다.


네이버 API를 통해서 검색한 결과는 다음과 같이 RSS 포맷으로 반환이 된다.

<?xml version="1.0" encoding="UTF-8" ?>
<rssversion="2.0">
<channel>
<title>Naver Open API - webkr ::'go'</title>
<link>http://search.naver.com</link>
<description>Naver Search Result</description>
<lastBuildDate>Tue, 11 Apr 2006 14:36:33 +0900</lastBuildDate>
<total>18992582</total>
<start>1</start>
<display>10</display>
  <item>
  <title><b>GO</b>.com</title>
  <link>http://www.go.com/</link>
  <description>... Victims, Military Personnel Sell Rations Online Government Report Finds Ready-to-Eat Meals for Sale on eBay...... trailers and the latest buzz on... Harry Potter and the Goblet of Fire , X-Men 3 , Spider-Man 3 , more... Tonight...</description>
  </item>
</channel>
</rss>

아래부터는 코드이다. 위의 RSS XML을 파싱해서, 목록으로 뿌려주는 것이다.
버튼 클릭 이벤트에서 실제 기능을 구현하도록 작성했다.

protected void Button1_Click(object sender, EventArgs e)
{    
//네이버 API는 정의된 URL을 호출해서 RSS타입의 XML을 받을 수 있도록 구성되어 있다
//URL 호출을 위해서 WebClient 클래스를 하나 선언하고, 인스턴스화한다

System.Net.WebClient oClient = new System.Net.WebClient();

  //네이버 API URL을 구성한다. GET방식으로 이루어져 있기 때문에 QueryString을 추가한다
//이 예제는 국내 웹 문서 검색을 하는 예제이다

oClient.QueryString.Add("key", "YourKey"); //회원가입 시에 받은 키
  oClient.QueryString.Add("target", "webkr"); //웹문서 검색
oClient.QueryString.Add("display", "100"); //100개의 결과 디스플레이
oClient.QueryString.Add("start", "1"); //1페이지부터 시작
  oClient.QueryString.Add("query", this.TextBox1.Text); //텍스트박스에 입력받은 텍스트를 검색어로 설정한다
  oClient.Encoding = System.Text.Encoding.UTF8; //반드시 인코딩은 UTF-8, 네이버 API의 규칙이다.

  //구성된 URL을 호출해서, 그 결과를 문자열로 받는다
  string s = oClient.DownloadString("http://openapi.naver.com/search");

  //문자열을 XMLDocument 객체로 로드한다
  System.Xml.XmlDocument oXmlDoc = new System.Xml.XmlDocument();
oXmlDoc.LoadXml(s);
 
//XPATH정규식을 통해서 item항목, 즉 검색 결과 항목들만을 뽑아낸다
  System.Xml.XmlNodeList oNodeList = oXmlDoc.SelectNodes("/rss/channel/item");

  //검색결과 화면을 위한 HTML 테이블 구성
  System.Web.UI.HtmlControls.HtmlTable oTable = new HtmlTable();
oTable.Width = "800";
oTable.Align = "left";
oTable.Border = 0;
oTable.CellPadding = 0;
oTable.CellSpacing = 0;

  //item항목 리스트에서 For Loop를 돌면서, 검색결과를 하나씩 붙인다
  for (int i = 0; i < oNodeList.Count; i++)
{
  //제목(title)을 위한 Row
       System.Web.UI.HtmlControls.HtmlTableRow oRow = new HtmlTableRow();
  System.Web.UI.HtmlControls.HtmlTableCell oTitleCell = new HtmlTableCell();
  string sTitle = oNodeList[i].ChildNodes[0].InnerText;

       //제목이 없을 경우를 위한 처리
       if (sTitle == null || sTitle.Length == 0)
  {
       sTitle = "제목없음";
  }
   

       //제목에다 link요소의 내용으로 링크를 건다.
      oTitleCell.InnerHtml =
       "<a target='_new' href='" + oNodeList[i].ChildNodes[1].InnerText + "'>" + sTitle + "</a>";
  oRow.Cells.Add(oTitleCell);
  oTable.Rows.Add(oRow);

       //상세 내용(Description)을 위한 Row
       System.Web.UI.HtmlControls.HtmlTableRow oRow2 = new HtmlTableRow();
  System.Web.UI.HtmlControls.HtmlTableCell oDescCell = new HtmlTableCell();
  oDescCell.InnerHtml = oNodeList[i].ChildNodes[2].InnerText;
  oRow2.Cells.Add(oDescCell);
  oTable.Rows.Add(oRow2);
}
//구성된 테이블을 페이지에 추가한다
  this.Page.Controls.Add(oTable);
}

실행한 화면이다.
내 별명인 kkongchi를 검색어로 검색을 해보았다.
사실은 페이징 부분을 추가하고, UI도 더 이쁘게 해야겠지만..


Posted by kkongchi