[빅데이터 python] 웹 수집 로봇 만들기 – 3. WebPage 클래스 정의

안녕하세요. 언제나휴일입니다.

이번에는 수집한 웹 페이지를 표현할 클래스를 정의합시다.

1. __init__

WebPage 개체는 웹 페이지 주소(url), 제목(title), 내용(description), 및 페이지 내 링크 컬렉션(links)을 입력 인자로 받아 멤버 필드를 설정합니다.

그리고 입력 인자로 전달받는 것 외에 페이지 내에 전체 단어 개수인 mcnt를 0으로 초기 설정합니다.

웹 페이지 제목과 내용은 태그와 특수 문자를 지워서 설정합시다.(EHHelper의 EmitTagAndSpecial 정적 메서드 호출)

#WebPage.py
from EHHelper import EHHelper
class WebPage:
    def __init__(self,url,title,description,links):
        self.url = url
        self.title = EHHelper.EmitTagAndSpecialCh(title)
        self.description = EHHelper.EmitTagAndSpecialCh(description)
        self.links = links
        self.mcnt=0

2. MakeWebPage – WebPage 개체를 만드는 정적 메서드

페이지 주소와 수집한 웹 페이지 개체(BeautifulSoup 개체)를 입력인자로 받아 WebPage 개체를 만드는 정적 메서드를 정의합시다.

제목은 cpage(BeautifulSoup 개체)의 title.text로 얻어옵니다.

HTML에서 링크 태그는 <a>입니다. cpage의 find_all 메서드를 이용하여 <a> 태그를 모두 구합니다.

이 중에 파일 다운로드이거나 절대 url이 아닌 것은 필터링할게요.

그리고 주소 내에 #나 쿼리 문자열에 인자 부분인 ?뒤의 내용은 스킵하기로 합시다.

    @staticmethod
    def MakeWebPage(url,cpage):
        try:
            title = cpage.title.text
            atags = cpage.find_all("a")
            links=WebPage.ExtractionUrls(atags)
        except:
            return None
        else:
            return WebPage(url,title,cpage.text,links)
    @staticmethod 
    def ExtractionUrls(atags):
        links = list()
        for atag in atags:                    
            if atag.has_attr('download') == False:    
                try:
                    link = atag['href']  
                except:
                    continue
                else:
                    link  = WebPage.ExtractionUrl(link)
                    if str.startswith(link,'http') or str.startswith(link,'https'):
                        links.append(link)
        return links

3. 전체 코드

다음은 전체 코드입니다.

#WebPage.py
from EHHelper import EHHelper
class WebPage:
    def __init__(self,url,title,description,links):
        self.url = url
        self.title = EHHelper.EmitTagAndSpecialCh(title)
        self.description = EHHelper.EmitTagAndSpecialCh(description)
        self.links = links
        self.mcnt=0
    @staticmethod
    def MakeWebPage(url,cpage):
        try:
            title = cpage.title.text
            atags = cpage.find_all("a")
            links=WebPage.ExtractionUrls(atags)
        except:
            return None
        else:
            return WebPage(url,title,cpage.text,links)
    @staticmethod 
    def ExtractionUrls(atags):
        links = list()
        for atag in atags:                    
            if atag.has_attr('download') == False:    
                try:
                    link = atag['href']  
                except:
                    continue
                else:
                    link  = WebPage.ExtractionUrl(link)
                    if str.startswith(link,'http') or str.startswith(link,'https'):
                        links.append(link)
        return links
    @staticmethod
    def ExtractionUrl(url):
        index = url.find('#')
        if(index != -1):
            url = url[:index]
        index = url.find("?")
        if(index != -1):
            url = url[:index]
        return url