프로그래밍 기술/웹 검색 엔진 만들기

6. 3 웹 로봇 예광탄 구현

언제나휴일 2017. 12. 7. 09:59
반응형

6. 3 웹 로봇 예광탄 구현


 

 Main 폼에 웹 수집기 개체를 참조하는 멤버 필드를 선언합니다.

WebCollect wc = null;

 

 Main 폼에 Load 이벤트 핸들러를 추가합니다.

private void MainForm_Load(object sender, EventArgs e)

 

 Main 폼이 로드할 때 웹 수집기 개체를 생성하고 수집 대상 사이트 목록을 갱신하는 작업을 수행합니다.

wc = new WebCollect();

UpdateCandidate();

 

 그리고 웹 페이지 수집 이벤트 핸들러를 추가합니다.

wc.WebPosted += new WebPostedEventHandler(wc_WebPosted);

 

 수집 대상 사이트 목록을 갱신하는 메서드를 작성합시다.

private void UpdateCandidate()

 

 수집 대상 사이트 목록을 보여주는 ListView 컨트롤의 목록을 지워줍니다.

lview_candidate.Items.Clear();

 

 정적 클래스 EHDbmForAll GetCandidates 메서드를 호출하여 수집 대상 목록을 얻어옵니다. 물론 이를 위해 DBM ForAll 라이브러리와 WSE Core 라이브러리를 참조해야 합니다.

List<Candidate> list = EHDbmForAll.GetCandidates(); 

 

 수집 대상 사이트 목록의 각 항목으로 ListViewItem 개체를 생성하여 ListView 컨트롤 항목에 추가합니다.

ListViewItem lvi = null;

string[] sub_items = null;

foreach (Candidate candi in list)

{

    sub_items = new string[2];

    sub_items[0] = candi.Url;

    sub_items[1] = candi.Depth.ToString();

 

    lvi = new ListViewItem(sub_items);

    lview_candidate.Items.Add(lvi);

}

 

 웹 페이지 수집 완료 이벤트 핸들러를 작성합시다.

void wc_WebPosted(object sendor, WebPostedEventArgs e)

 

 웹 페이지 수집을 완료하면 수집 대상 사이트 목록을 갱신하고 수집 결과 웹 페이지를

목록에 추가합니다.

UpdateCandidate();

AddPostedUrl(e.Page);

 

 수집 결과 웹 페이지를 목록에 추가하는 메서드에서는 목록을 보여주는 ListBox 컨트롤 아이템 항목에 추가합니다.

private void AddPostedUrl(WSE_Core.PostedUrl postedUrl)

{

    lbox_purl.Items.Add(postedUrl);

}

 

 웹 페이지 수집 가동 버튼과 수집 멈춤 버튼의 클릭 이벤트 핸들러를 추가합니다. 그리고 이벤트 핸들어에서는 웹 수집기 개체의 Enabled 속성을 설정합니다.

private void btn_start_collect_Click(object sender, EventArgs e)

{

    wc.Enabled = true;

}

private void btn_stop_collect_Click(object sender, EventArgs e)

{

    wc.Enabled = false;

}

 

 수집 주기 설정 버튼의 클릭 이벤트 핸들러를 추가합니다.

private void btn_set_period_Click(object sender, EventArgs e)

 

 이벤트 핸들러에서는 수집 주기 입력 TextBox Text 속성으로 수집 주기를 얻어와 웹 수집기 개체의 수집 주기를 설정합니다. 그리고 수집 주기 입력 TextBox Text 속성은 빈 문자열로 설정하여 사용자 편의성을 높입니다.

int period = 0;

if (int.TryParse(tbox_period.Text, out period))

{

    wc.Period = period;

}

tbox_period.Text = string.Empty;

 

 Seed 사이트 추가 버튼 클릭 이벤트 핸들러를 추가합니다.

private void btn_add_seed_Click(object sender, EventArgs e)

 

 이벤트 핸들러에서는 Seed 사이트 입력 TextBox Text 속성을 입력 인자로 정적 클래스 EHDbmForAll AddSeedSite 메서드를 호출합니다. 그리고 TextBox Text속성을 빈 문자열로 설정합니다.

EHDbmForAll.AddSeedSite(tbox_seed.Text);

tbox_seed.Text = string.Empty;

  

 수집 결과 목록을 보여주는 ListBox 컨트롤의 선택 항목 변경 이벤트 핸들러를 추가합니다.

private void lbox_purl_SelectedIndexChanged(object sender, EventArgs e)

 

 만약 선택 항목의 인덱스가 -1이면 아무 작업도 수행하지 않습니다.

if (lbox_purl.SelectedIndex == -1)

{

    return;

}

 

 선택 항목을 수집 결과 개체로 참조합니다.

PostedUrl purl = lbox_purl.SelectedItem as PostedUrl;

 

 수집 결과 개체의 각 항목으로 정보를 보여줄 컨트롤의 Text 속성을 설정합니다.

lb_title.Text = purl.Title;

lb_cp_addr.Text = purl.Url;

lb_ocp_addr.Text = purl.OriginUrl;

lb_depth.Text = purl.Depth.ToString();

lb_date.Text = purl.PostedTime.ToString();

tbox_content.Text = purl.Content;

 

MainForm.cs

using System;

using System.Collections.Generic;

using System.Windows.Forms;

using WSE_Core;

using DBM_ForAll;

using WEB_Robot_Lib;

 

namespace WEB_Robot_예광탄

{

    public partial class MainForm : Form

    {

        WebCollect wc = null;

        public MainForm()

        {

            InitializeComponent();

        }

 

        private void MainForm_Load(object sender, EventArgs e)

        {

            wc = new WebCollect();

            UpdateCandidate();

            wc.WebPosted += new WebPostedEventHandler(wc_WebPosted);

            

        }

 

        void wc_WebPosted(object sendor, WebPostedEventArgs e)

        {

            UpdateCandidate();

            AddPostedUrl(e.Page);

        }

        private void AddPostedUrl(WSE_Core.PostedUrl postedUrl)

        {

            lbox_purl.Items.Add(postedUrl);

        }

 

        private void UpdateCandidate()

        {

            lview_candidate.Items.Clear();

            List<Candidate> list = EHDbmForAll.GetCandidates();

 

            ListViewItem lvi = null;

            string[] sub_items = null;

 

            foreach (Candidate candi in list)

            {

                sub_items = new string[2];

                sub_items[0] = candi.Url;

                sub_items[1] = candi.Depth.ToString();

 

                lvi = new ListViewItem(sub_items);

                lview_candidate.Items.Add(lvi);

            }

        }

        private void btn_start_collect_Click(object sender, EventArgs e)

        {

            wc.Enabled = true;

        }

        private void btn_stop_collect_Click(object sender, EventArgs e)

        {

            wc.Enabled = false;

        }

        private void btn_set_period_Click(object sender, EventArgs e)

        {

            int period = 0;

            if (int.TryParse(tbox_period.Text, out period))

            {

                wc.Period = period;

            }

            tbox_period.Text = string.Empty;

        }

        private void btn_add_seed_Click(object sender, EventArgs e)

        {

            EHDbmForAll.AddSeedSite(tbox_seed.Text);

            tbox_seed.Text = string.Empty;

        }

        private void lbox_purl_SelectedIndexChanged(object sender, EventArgs e)

        {

            if (lbox_purl.SelectedIndex == -1)

            {

                return;

            }

            PostedUrl purl = lbox_purl.SelectedItem as PostedUrl;

            lb_title.Text = purl.Title;

            lb_cp_addr.Text = purl.Url;

            lb_ocp_addr.Text = purl.OriginUrl;

            lb_depth.Text = purl.Depth.ToString();

            lb_date.Text = purl.PostedTime.ToString();

            tbox_content.Text = purl.Content;

        }

    }

}

 

반응형