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;
        }
    }
}