[C#] AxWebBrowser 로 자동 로그인 소스 (웹 스크래핑)


Development note/C#  2012. 10. 23. 18:37

안녕하세요. 명월입니다.


이번 포스팅에서는 이전 포스팅에서 설명했던 확장형 브라우져 AxWebBrowser Extended Browser에 대해 스크래핑를 하는 방법에 대해 소개하겠습니다.

바로가기 - [C#]확장형 브라우져 AxWebBrowser Extended Browser(확장형 webbrowser) 바로가기

 

먼저 폼 안에 브라우져 객체를 생성하겠습니다.

그리고 브라우져 컨트롤에 사용되는 MSHTML을 추가하겠습니다.

[프로젝트] -> [참조추가] -> [COM]탭 -> Microsoft HTML Object Library 입니다.

그리고 우리가 스크래핑을 해 볼 사이트는 지금 보고 있는 Tistory입니다. Navigate 함수에 Tistory 로그인 Url를 넣습니다.

그리고 DocumentComplete 이벤트로 Request여부를 알 수 있습니다.

그리고 스크래핑에 앞서 Tistory의 Html 소스를 확인해야 합니다.

이 때 사용하는 객체는 MSHTML 객체입니다.

저기에 디버그를 걸고 먼저 실행 하겠습니다.

이 돔 객체를 Editplus 로 확인 하도록 하겠습니다.

위 소스를 보면 ID, PASSWORD, 그리고 로그인 버튼이 있는 것을 확인 할 수 있습니다.

우리는 ID에 ID를 넣고 PASSWORD를 넣고 로그인 버튼을 누르는 메소드를 실행하면 됩니다.

(예제는 제 아이디, 비번번호이기에 가렸습니다.)

 

이렇게 하고 실행하면 자동 로그인이 완성 되겠습니다.

WebScrapping 기술은 여러 프로그램, 웹검색 봇이던가 정보수집용 봇을 개발할 때 많이 사용되는 객체입니다. 물론 기본적으로 주어지는 Webbrowser가 있지만 그것만으로는 API가 많이 부족함를 느낄 수 있습니다.

확장형 Webbrowser 는 MSDN 이 없기 때문에 일일히 하나하나 디버깅하면서 확인하는 방법 밖에 없습니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

namespace Blog20121023
{
  class Program : Form
  {
    private AxSHDocVw.AxWebBrowser axWebBrowser1;

    [STAThread]
    static void Main(string[] args)
    {
      Application.Run(new Program());
    }
    public Program()
    {
      InitializeComponent();
      this.axWebBrowser1.DocumentComplete += new AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(axWebBrowser1_DocumentComplete);
    }

    private void axWebBrowser1_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
    {
      login();
    }
    private void login()
    {
      mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)this.axWebBrowser1.Document;
      mshtml.IHTMLElementCollection HEC = (mshtml.IHTMLElementCollection)doc.all;
      foreach (mshtml.IHTMLElement element in HEC)
      {
        if (element.tagName.Equals("INPUT") && element.outerHTML.IndexOf("loginid") != -1)
        {
          element.innerText = "*********";
        }
        else if (element.tagName.Equals("INPUT") && element.outerHTML.IndexOf("password") != -1)
        {
          element.innerText = "***********";
        }
      }
      foreach (mshtml.IHTMLElement elements in HEC)
      {
        if (elements.tagName.Equals("INPUT") && elements.outerHTML.IndexOf("loginBtn") != -1)
        {
          elements.click();
        }
      }
    }
    private void InitializeComponent()
    {
      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Program));
      this.axWebBrowser1 = new AxSHDocVw.AxWebBrowser();
      ((System.ComponentModel.ISupportInitialize)(this.axWebBrowser1)).BeginInit();
      this.SuspendLayout();
      // 
      // axWebBrowser1
      // 
      this.axWebBrowser1.Enabled = true;
      this.axWebBrowser1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axWebBrowser1.OcxState")));
      this.axWebBrowser1.Dock = DockStyle.Fill;
      this.axWebBrowser1.TabIndex = 0;
      // 
      // Program
      // 
      this.ClientSize = new System.Drawing.Size(292, 266);
      this.Controls.Add(this.axWebBrowser1);
      this.Name = "Program";
      ((System.ComponentModel.ISupportInitialize)(this.axWebBrowser1)).EndInit();
      this.ResumeLayout(false);
      this.axWebBrowser1.Navigate("http://nowonbun.tistory.com/login/");
    }
  }
}

참조소스 : Blog20121023.zip (ID,PW가 제거 된 상태의 소스입니다.)