반응형
안녕하세요. 언제나휴일입니다.
2020/11/16 - [빅데이터/빅데이터 with python] - [빅데이터 python] 웹 수집 로봇 만들기 - 1. 테이블 정의
2020/11/16 - [빅데이터/빅데이터 with python] - [빅데이터 python] 웹 수집 로봇 만들기 - 2. EHHelper 클래스 정의
이번에는 수집한 웹 페이지를 표현할 클래스를 정의합시다.
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
@staticmethod
def ExtractionUrl(url):
index = url.find('#')
if(index != -1):
url = url[:index]+url[index+1:]
index = url.find("?")
if(index != -1):
url = url[:index]+url[index+1:]
return url
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
반응형
'빅데이터 > 빅데이터 with python' 카테고리의 다른 글
[빅데이터 python] 웹 수집 로봇 만들기 - 5. CandidateSql 클래스 정의 (0) | 2020.11.16 |
---|---|
[빅데이터 python] 웹 수집 로봇 만들기 - 4. WebPageSql 클래스 정의 (0) | 2020.11.16 |
[빅데이터 python] 웹 수집 로봇 만들기 - 2. EHHelper 클래스 정의 (0) | 2020.11.16 |
[빅데이터 python] 웹 수집 로봇 만들기 - 1. 테이블 정의 (0) | 2020.11.16 |
[빅데이터 python] 웹 페이지 수집하기 (0) | 2020.11.16 |