처음 이 방법을 찾고 고려하게 된 이유는 저희 회사의 본사인 영국 E-Commerce 팀 때문입니다. 특정 테이블의 한 필드의 데이터만이 필요해서 최소한의 권한이 부여된 데이터베이스 사용자 계정을 요청했는데.. 몇 번째 메일을 꿀꺽! 해버리는 겁니다. 약이 오른 나머지 저희 회사는 개발전문 회사가 아닌지라 제가 하는 일의 결과라면 몰라도 과정은 저 이외에 누구도 모른다는 장점(?)을 이용해서 6시간이나 투자해서 결국 아래의 방법을 알아내게 되었죠. 제가 원하는 필드의 데이터는 본사의 특정 페이지에 저희도 보유하고 있는 주(Primary) 키를 연결 문자열로 넘기면 웹 페이지로 뿌려집니다. 결국 제가 한 일은 아래의 그림과 같습니다.

그림1. 본사가 제공하는 페이지.

그림2. 원하는 데이터를 추출해 낸 결과.

aspx 페이지의 소스를 기본 소스입니다. 중요한 것은 코드 비하인드~ 같이 보실까요?

:: cs 파일 소스 시작 ::

using System;
using System.IO;
using System.Net;

public class lecture1 : System.Web.UI.Page
{
    protected System.Web.UI.WebControls.Literal List;
    private void Page_Load(object sender, System.EventArgs e)
    {
        WebClient client = new WebClient();
        client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
        // 클라이언트 객체가 요청헤더로 보낼 부분을 설정해 줍니다. msdn의 예제를 그대로 복사했죠
        // 용도에 따라 필요하다면 브라우저 이름, 버전, 환경 등을 자유로이 정해주세요.
        Stream data = client.OpenRead("http://sg.farnell.com/jsp/endecaSearch/partDetail.jsp?SKU=100006&N=0");
        // 인자로 넘긴 URI에 클라이언트 객체가 요청을 날려서 응답을 받습니다.
        // 제가 원했던 바로 그거죠!
        // SKU=100006의 부분의 SKU가 부품의 식별코드를 의미하는 부분이어서,
        // 저는 이 부분만 자유자재로 바꿔서 활용합니다.
        // 여러분은 원하는 페이지의 연결문자열이든, 포스트 값이든 알기만 하신다면
        // (보통 소스분석 들어가면 80%이상 나옵니다.) 얼마든지 활용해 보실 수 있습니다.
        // 활용해 보실 수 있습니다. 한 번 해보시고 여러분이 원하는 페이지를 대상으로 자유로이
        // 테스트가 가능하겠습니다. (저는 현재 날짜에 맞는 TV편성표, 일기예보 등을 원클릭으로
        // 볼 수 있게 준비해서 손쉽게 활용하곤 합니다. ^^;)

        StreamReader reader = new StreamReader(data);
        // 스트림으로 읽어줍니다.
        string s = reader.ReadToEnd();
        // 화끈하게 끝까지.. 읽습니다;
        int startPoint = s.IndexOf("Description");
        // 제가 원하는 데이터는 Description 항목에 이어지는 스트링 데이터이기 때문에
        // 이 녀석의 위치를 찾습니다. 응용 시 원하는 키워드로~
        startPoint = s.IndexOf("<b>", startPoint) + 3;
        // 태그 안의 순수 문자열만 얻기 위해 여는 볼드 태그의 끝점을 또 찾았습니다.
        int endPoint = s.IndexOf("</b>", startPoint);
        // 태그 안의 문자열만 얻으려 하므로 닫는 볼드 태그의 시작점을 찾았습니다.
        if (s.Length > 1 && (endPoint - startPoint) > 0)
            s = s.Substring(startPoint, endPoint - startPoint);
        List.Text += s;
        data.Close();
        reader.Close();
    }
}

위와 같이 페이지 구성을 한 것은 제가 이 방법밖에 모르기 때문입니다. 경험이 많으신 분들은 가볍게 훑어 보시면서 나름의 구성법을 떠올리시리라 믿습니다.

전 처음에 ASP에서 제공되는 Server.Execute로 해보려다가 3초 만에 좌절했죠. "아차.. 이 녀석은 페이지가 실행되는 서버의 파일만 가능했지.." 주륵.. 그러나 열정은 저를 도왔습니다.

msdn에서 .NET의 WebRequest, HttpWebRequest 등의 클래스로 시도해보다가(사실 보통 페이지에 위와 같은 기능을 수행하려면 앞의 두 클래스도 가능합니다. 그런데 저희 본사페이지는 두 클래스로 시도했을 때는 응답을 안하더군요. 나중에서야 헤더문제일까 추측했지만요.) 결국 그래도 WebClient를 발견하고 원하는 바를 이뤘습니다.

활용하기에 따라서 영어사전 DB를 구해서 단어를 순수, 혹은 적절히 조합해 가며 자동으로 페이지 요청을 하고 태그의 href 속성을 찾아내서 URI를 수집하는 녀석도 손쉽게 만들 수 있을 것 같습니다. 구글검색로봇 같은 거 말이죠. 물론 검색결과의 퀄리티는 처음엔 엉망이겠지만요.. 하하;

+ Recent posts