티스토리 뷰

728x90

인터넷이 발달하고 다양한 정보가 홈페이지를 통해서 공개되고 있는 요즘 OPEN API를 활용한 Mash Up 기술로 간편하게 복합적인 기능을 웹 페이지에 얹는 것은 더이상 특별한 것이 아닙니다. 그런데 포털에서 단어를 검색하면 튀어나오는 페이지들을 포털은 대체 어떻게 알고 있지? 하는 의문이 들었던 적이 있다면 오늘의 코드를 통해서 포털 검색의 일부를 경험할 수 있을 것입니다.

프로그램은 화면에서 가져올 페이지의 주소(URL, Uniform Resource Locator)를 입력받아 닷넷 프레임워크에서 제공하는 기능을 통해서 해당 페이지를 검색합니다. 검색한 페이지의 소스에서 <body> 태그를 찾아 그 이후에 있는 내용에서 HTML 태그를 제외한 나머지 내용을 추출하여 하단 박스에 출력하는 과정으로 동작합니다. 윈도우 폼 형태의 프로젝트로 버튼 1개 텍스트 박스 2개를 가진 폼을 제작하고, 코드는 아래와 같이 작성합니다.

Imports System.Net
Imports System.IO
Imports System.Text.RegularExpressions

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        If TextBox1.Text.Length < 10 Then
            MsgBox("가져올 페이지의 URL을 입력하세요!")
            Return
        End If

        Try
            Dim wresp As WebResponse
            Dim wreq As WebRequest = HttpWebRequest.Create(TextBox1.Text)
            Dim str As String = ""
            wresp = wreq.GetResponse()

            Using sr As New StreamReader(wresp.GetResponseStream())
                str = sr.ReadToEnd()
                sr.Close()
            End Using

            Dim sta As Integer

            sta = InStr(str, "<body")
            If sta = 0 Then sta = InStr(str, "<BODY")
            If sta = 0 Then sta = 1 'not found <body or <BODY

            str = Regex.Replace(Mid(str, sta), "<.*?>", "")
            TextBox2.Text = str
        Catch ex As Exception
            MsgBox(ex.Message, "가져오기 실패")
        End Try
    End Sub
End Class

웹 URL을 지정하여 해당 페이지를 간편하게 읽는 과정을 수행하는 과정은 WebResponse, WebRequest, HttpWebRequest 클래스를 통해서 수행하므로 System.Net을 Import 해야 합니다. 읽어온 내용을 파일처럼 읽는 StreamReader 클래스는 System.IO를 Import 해야 합니다. HTML 태그를 제거할 때 사용하는 정규식 관련 클래스인 Regex 클래스는 System.Text.RegularExpressions를 Import 해야 합니다.

웹 URL을 HttpWebRequestWebRequest을 통해서 호출하고 WebResponse를 통해서 받는 과정은 프로그램 외부와 통신하는 과정을 포함하므로 네트워크가 끊어 졌거나, 대상 서버가 다운 되었거나, 잘못된 주소인 경우 등등 다양한 장애 현상을 대비해야 하므로 연관 블럭을 Try...Catch...문장으로 처리해 줍니다. 읽어온 HTML 소스에서 <body 태그를 찾아 잘라내거나 특정 데이터만 찾는 과정등은 많은 경우 다양한 방식의 문자열 처리를 요구하는데 연관 함수나 사용법은 VB 문자열 다루기를 참조합니다.

Regex.Replace는 특정 문자열에서 정규식으로 지정한 문자열 패턴(<.*?>)을 찾아 지정한 문자열로 치환시키는 것으로 세번째 인수를 빈문자열("")로 지정했으므로 지우라는 의미입니다. 지정한 패턴 <.*?>은 '<'문자로 시작하고 '>'문자로 끝나는 모든 블럭을 의미합니다. HTML 또는 XML 태그가 해당합니다.

위의 그림은 코드를 실행시켜 네이버 첫 화면을 조회한 결과입니다. 이러한 방식으로 네이버나 구글의 로봇(크롤러 web crawler, 짧게 봇 bot 이라고도 함)이 홈페이지를 뒤져서 나름의 방식으로 검색에 활용하는 것입니다. 그렇지만, 최근에 많이 사용하는 실시간 버스 위치 표시기라거나, 열차 시각표, 날씨등의 많은 정보들은 OPEN API 방식으로 정보를 제공하는데 위에서 사용한 방식으로 OPEN API의 주소와 파라미터를 입력하면 보통은 XML 형태로 깔끔하게 정보를 전달해 주므로 조회 결과를 나름 분석해서 자신의 의도에 맞게 사용하면 되겠습니다. OPEN API 뿐만아니라 RSS나 ATOM 읽기에도 매우 유용하게 사용할 수 있습니다.

이상 VB.Net을 이용한 웹 스크랩 방법을(Web Scrapping) 다루어 보았습니다.

728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함