[C#] AxWebBrowser 로 자동 로그인 소스 (Scrapping 기술)

개발 노트/C#  2012.10.23 18:37



안녕하세요 명월입니다.

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

먼저 확장형 브라우져 소개 포스팅을 한 번 살펴보고 보시기를 권장합니다.

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

 

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

 

 

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

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

 

 

그리고 우리가 해볼 사이트는 지금 보고 있는 Tistory 이므로 Navigate를 여기 로그인 Url로 넣습니다.

 

 

그리고 C#는 메시지가 대신 이벤트로 그 객체를 컨트롤을 할 수 있기 때문에 DocumentComplete 이벤트를 걸겠습니다.

 

 

그리고 스크래핑에 앞서 Tistory의 돔객체에 대해 이해가 필요하니 html 안의 속성으로 돔 객체를 확인해야 합니다.

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

 

 

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

 

 

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

 

 

돔객체를 보면 Web 소스랑 비슷합니다만 정확히 이야기 하면 조금은 다릅니다. 소스보기를 하여 비교를 해보면 알겠지만 webbrowser 가 인식하는 소스랑 사람이 보는 소스는 약간의 차이가 있기 때문입니다.

 

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

우리는 ID에 ID를 넣고 PASSWORD를 넣은다면 로그인 버튼을 누르는 메소드를 만들면 되겠습니다.

 

 

(제 아이디, 비번번호 이기에 삭제하였습니다.)

 

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

 

 

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

확장형 Webbrowser 는 MSDN 이 없기 때문에 일일히 하나하나 해보면서 체득하는 방법 밖에 없습니다.

 

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.Drawing;
  5 using System.Windows.Forms;
  6
  7 namespace Blog20121023
  8 {
  9     class Program : Form
10     {
11         private AxSHDocVw.AxWebBrowser axWebBrowser1;
12    
13         [STAThread]
14         static void Main(string[] args)
15         {
16             Application.Run(new Program());
17         }
18         public Program() {
19             InitializeComponent();
20             this.axWebBrowser1.DocumentComplete += new AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(axWebBrowser1_DocumentComplete);
21         }
22
23         private void axWebBrowser1_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
24         {
25             login();
26         }
27         private void login() {
28             mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)this.axWebBrowser1.Document;
29             mshtml.IHTMLElementCollection HEC = (mshtml.IHTMLElementCollection)doc.all;
30             foreach (mshtml.IHTMLElement element in HEC)
31             {
32                 if (element.tagName.Equals("INPUT") && element.outerHTML.IndexOf("loginid") != -1)
33                 {
34                     element.innerText = "*********";
35                 }
36                 else if (element.tagName.Equals("INPUT") && element.outerHTML.IndexOf("password") != -1)
37                 {
38                     element.innerText = "***********";
39                 }
40             }
41             foreach (mshtml.IHTMLElement elements in HEC)
42             {
43                 if (elements.tagName.Equals("INPUT") && elements.outerHTML.IndexOf("loginBtn") != -1)
44                 {
45                     elements.click();
46                 }
47             }
48         }
49         private void InitializeComponent()
50         {
51             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Program));
52             this.axWebBrowser1 = new AxSHDocVw.AxWebBrowser();
53             ((System.ComponentModel.ISupportInitialize)(this.axWebBrowser1)).BeginInit();
54             this.SuspendLayout();
55             //
56             // axWebBrowser1
57             //
58             this.axWebBrowser1.Enabled = true;
59             this.axWebBrowser1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axWebBrowser1.OcxState")));
60             this.axWebBrowser1.Dock = DockStyle.Fill;
61             this.axWebBrowser1.TabIndex = 0;
62             //
63             // Program
64             //
65             this.ClientSize = new System.Drawing.Size(292, 266);
66             this.Controls.Add(this.axWebBrowser1);
67             this.Name = "Program";
68             ((System.ComponentModel.ISupportInitialize)(this.axWebBrowser1)).EndInit();
69             this.ResumeLayout(false);
70             this.axWebBrowser1.Navigate("http://nowonbun.tistory.com/login/");
71         }
72     }
73 }
74

 

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



댓글 9개가 달렸습니다.
댓글쓰기
  1. jin
    2012.12.04 02:24 신고 |  수정/삭제  댓글쓰기

    정말좋은정보 보고갑니다 덕분에 막혔던곳을 해결했습니다 감사해요^^


  2. 2013.01.25 10:48 |  수정/삭제  댓글쓰기

    비밀댓글입니다

  3. nohjun
    2013.06.01 01:47 신고 |  수정/삭제  댓글쓰기

    그대로 따라 한것 같은데 왜 막힐까요? ㅠ
    중간에 디버깅하는 부분에서 html 소스를 가져오지를 못하네요 ㅠ

  4. 황봉주
    2013.11.23 17:49 신고 |  수정/삭제  댓글쓰기

    경고 1 호출 대상이 예외를 Throw했습니다. C:\Documents and Settings\Administrator\바탕 화면\Blog20121023 (2)\Blog20121023\Program.cs 71번
    줄에서 이러한 호출스텍 에러가 나는데 우찌하면 해결할 수 있을까요?

  5. 황봉주
    2013.11.23 17:51 신고 |  수정/삭제  댓글쓰기

    저 에러를 수정하고 나서 로긴된후 html 파싱을 하려면 어떻게 하면 될까요?
    간단한 방법이라도 부탁드려요..^^

    • 明月 v명월v
      2013.12.09 11:16 신고 |  수정/삭제

      안녕하세요.. 블로그 방문 감사합니다...
      인터페이스 중 IDocument 객체가 있습니다.
      그 객체로 매핑 시키고 가져오시면 됩니다..

      감사합니다.

  6. C#초보자
    2014.02.24 14:34 신고 |  수정/삭제  댓글쓰기

    C#으로 Webbrowser를 이용한 프로그램 만들고 있는데요.
    특정 사이트에서는 에러가 발생하는 것같아서요.
    단순히 접속하는데 Script 에러가 발생하는데. 혹시 해결 방법이 있으신가요 ?
    세부 항공사 접속시에는 에러가 발생합니다.

    < C# Code >
    webBrowser1.Navigate("https://www.cebupacificair.com/?_ga=1.211153237.1912480422.1392863399");