6.2.3 RawUrl 구현

이번에는 수집 결과 형식인 RawUrl 클래스를 구현합시다.

수집 대상 개체를 가져오기 속성을 제공합니다. 설정하기는 내부에서만 사용할 수 있게 제공합니다.

public Candidate CD
{
    get;
    private set;
}

수집 대상 개체를 수집한 결과 페이지 목록을 가져오기 속성을 제공합니다. 요청한 웹 페이지가 프레임 형태일 때는 수집 결과 페이지가 여러 개가 발생할 수 있어서 목록을 멤버로 설정하는 것입니다. 여기에서도 설정하기 속성은 클래스 내부에서만 접근하게 제공합니다.

public List<RawPostedPage> PostedPages
{
    get;
    private set;
}

생성자는 수집 대상 개체를 입력 인자로 받는 것을 앞에서 추가하였습니다.

public RawUrl(Candidate candidate)

생성자 메서드에서는 수집 대상 개체 속성과 수집 결과 목록 컬렉션 속성을 설정합니다.

CD = candidate;
PostedPages = new List<RawPostedPage>();

웹 페이지 주소로 이미 수집 결과 목록에 있는지 확인하는 메서드도 앞에서 추가하였습니다.

public bool Contain(string url)

수집 결과 목록의 페이지 주소가 입력 인자로 받은 주소와 같은 것이 있는지 확인하여 존재하면 참을 반환하고 없으면 거짓을 반환합니다.

foreach (RawPostedPage pu in PostedPages)
{
    if (pu.Url == url)
    {
        return true;
    }
}
return false;

수집한 결과 페이지를 추가하는 메서드도 앞에서 추가하였습니다.

public RawPostedPage AddPostedPage(string url,HtmlDocument hdoc)

먼저 수집 결과 페이지가 이미 있는지 확인하여 있다면 메서드를 종료합니다.

if (Contain(url))
{
    return null;
}

수집 결과 페이지 개체를 생성하여 페이지 주소와 요청 주소, 상대적 깊이를 설정합니다.

PostedUrl pu = new PostedUrl();
pu.Url = url;
pu.OriginUrl = CD.Url;
pu.Depth = CD.Depth;

페이지 제목과 페이지 내부 컨텐츠는 HtmlDocument에서 얻어와 설정합니다. 수집한 일시는 현재 일시로 설정합니다.

pu.Title = hdoc.Title;
pu.Content = hdoc.Body.InnerText;
pu.PostedTime = DateTime.Now;

수집한 결과 페이지의 링크 목록을 컬렉션에 추가합니다. 만약 링크 목록의 내용이 파일일 때는 필터링하기로 할게요.

List<string> list = new List<string>();
foreach (HtmlElement he in hdoc.Links)
{
    string link_url = he.GetAttribute("href");
    if (IsFile(link_url)!=false)
    {
        list.Add(link_url);
    }
}

페이지 주소가 파일을 의미하는지 확인하는 메서드를 만듭시다.

private bool IsFile(string url)

여기에서는 자주 사용하는 파일의 확장자를 통해 입력 인자로 들어온 주소에 파일의 확장자가 있는지 확인한 결과를 반환하게 할게요. 여기에서는 일부 파일의 확장자만 확인하므로 보다 높은 수준으로 필터링하기 위해서는 코드의 수정이 필요합니다.

string[] file_exts = new string[] { ".zip", ".txt", ".avi", ".mp3", ".egg" };
foreach (string file_ext in file_exts)
{
    if (url.Contains(file_ext))
    {
        return true;
    }
}
return false;

▷ RawUrl.cs

using System;
using System.Collections.Generic;
using WSE_Core;
using System.Windows.Forms;
 
namespace WEB_Robot_Lib
{
    /// <summary>
    /// 수집 웹 사이트
    /// </summary>
    public class RawUrl
    {

        /// <summary>
        /// 수집 대상 - 가져오기
        /// </summary>
        public Candidate CD
        {
            get;
            private set;
        }

        /// <summary>
        /// 수집한 웹 페이지 목록 - 가져오기
        /// </summary>
        public List<RawPostedPage> PostedPages
        {
            get;
            private set;
        }
        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="candidate">수집 요청 사이트</param>
        public RawUrl(Candidate candidate)
        {
            CD = candidate;
            PostedPages = new List<RawPostedPage>();
        }

        /// <summary>
        /// 수집한 사이트 목록에 이미 있는 주소인지 확인하는 메서드
        /// </summary>
        /// <param name="url">사이트 주소</param>
        /// <returns>포함 여부</returns>
        public bool Contain(string url)
        {
            foreach (RawPostedPage pu in PostedPages)
            {
                if (pu.Url == url)
                {
                    return true;
                }
            }
            return false;
        }





        /// <summary>
        /// 수집한 웹 페이지에 추가하는 메서드
        /// </summary>
        /// <param name="url">사이트 주소</param>
        /// <param name="hdoc">HtmlDocument 개체</param>
        /// <returns>수집한 페이지 개체</returns>
        public RawPostedPage AddPostedPage(string url,HtmlDocument hdoc)
        {
            if (Contain(url))
            {
                return null;
            }

            PostedUrl pu = new PostedUrl();
            pu.Url = url;
            pu.OriginUrl = CD.Url;
            pu.Depth = CD.Depth;
            pu.Title = hdoc.Title;
            pu.Content = hdoc.Body.InnerText;
            pu.PostedTime = DateTime.Now;
 
            List<string> list = new List<string>();
            foreach (HtmlElement he in hdoc.Links)
            {
                string link_url = he.GetAttribute("href");
                if (IsFile(link_url)!=false)
                {
                    list.Add(link_url);
                }
            }

            RawPostedPage rpg = new RawPostedPage(pu, list);
            PostedPages.Add(rpg);
            return rpg;
        }
 
        private bool IsFile(string url)
        {
            string[] file_exts = new string[] { ".zip", ".txt", ".avi", ".mp3", ".egg" };
            foreach (string file_ext in file_exts)
            {
                if (url.Contains(file_ext))
                {
                    return true;
                }
            }
            return false;
        }
    }
}