2024년 3월 18일 월요일

HTML 구조의 이해와 웹크롤링

참조 : https://wikidocs.net/127846

1. HTML 구조의 이해

HTML은 웹 문서를 만들기 위하여 사용하는 기본적인 웹 언어의 한 종류이다. 하이퍼텍스트를 작성하기 위해 개발되었으며 인터넷 서비스의 하나인 월드와이드웹(WWW)을 통해서 볼 수 있는 문서를 만들 때 사용하는 웹 언어의 한 종류이다. 특히 인터넷에서 웹을 통해 접근되는 대부분의 웹 페이지들은 HTML로 작성되는데 문서의 글자 크기, 글자색, 글자모양, 그래픽, 문서이동(하이퍼링크) 등을 정의하는 명령어들이 있다. HTML에서 사용하는 명령어는 태그(tag)라고 하는데 꺽쇠괄호'<>'를 사용하여 나타낸다. HTML 문서는 크게 Head 부분과 Body로 나누어지는데 Head 부분에는 문서의 제목을 포함한 기본적인 정보들을 포함하고 있으며 Body 부분에는 실제 웹 페이지에 나타나는 본문 내용으로 구성된다. 그래서 이러한 구조를 간단하게 요약해서 표기하면 아래와 같은 그림으로 표현할 수 있다.

좀더 구체적으로 위에 그림 중에 본문 문단을 의미하는 p 태그의 코드 기준으로 설명하면 HTML 요소는 시작 태그와 /로 시작하는 종료 태그 사이에 내용들이 들어 있으며, 시작 태그 안에는 속성명(Attributes) class와 속성값(Values) title을 포함하고 있고, 'HTML 문서의 구조'라는 내용을 포함하고 있는 태그이다.  보다 다양한 HTML 태그에 대한 이해를 위해서 자주 사용하는 태그들을 표의 형태로 정리하면 아래와 같다.


이러한 구조를 사람이 보기 편한 Text 문서로 파싱하기 위해서는 BeautifulSoup라는 라이브러리를 이용해야 한다. 뷰티플소프이라는 파이썬 라이브러리는 이와 같이 HTML 문서를 파싱하여 텍스트 데이터를 추출할 수 있는 유용한 도구이다.

2.HTML 문서의 파싱과 텍스트 추출

코랩을 이용해서 위에 그림으로 설명한 P 태그의 내용을 추출하는 방법을 설명하면 아래와 같은 코드를 실행시키면 추출이 가능하다.
먼저 뷰티풀소프라는 라이브러리를 아래와 같이 설치한다.

!pip install bs4
그리고 태그를 파싱해서 그안에 담겨있는 텍스트만 추출하여 정리하는 방법은 아래와 같다.

from bs4 import BeautifulSoup as bs
html_tag ='''<p class='title'> HTML 문서의 구조</p>'''
soup = bs(html_tag, 'html.parser')
print(soup.find("p").text)


3. 웹크롤링 방법 사례

웹크롤링을 하기 위해 우선적으로 해야할 일은 우리가 정보를 추출하고자하는 웹페이지의 로봇배제기준을 확인하여 추출이 가능한 웹페이지인지 확인해야한다. 현재 이 블로그의 로봇배제기준을 확인하려면 웹페이지 주소창에 있는 주소에 추가하여 /robots.txt 를 추가하여 확인하는 것이다. 

가. 기본정보 추출
기본적인 웹페이지의 정보를 크롤링하기 위해서는 아래와 같이 requests나 urllib 라이브러리를 이용하여 HTML 정보를 불러오고 이를 BeautifulSoup으로 파싱하여 구체적인 텍스트 정보를 얻을 수있다.

import requests
from bs4 import BeautifulSoup as bs
url = "https://enjoystat.blogspot.com/2024/03/html.html"
resp = requests.get(url)
print(resp)
html_src = resp.text
soup = bs(html_src, 'html.parser')

나. 태그사이에 있는 정보 추출
태그사이에 있는 정보를 추출하기 위해서는 f12 또는 Ctrl+Shift+I로 소스코드가 팝업되도록 펼치고, 좌상단 element select 또는 Ctrl+Shift+C로 마우스 선택기를 활성화하여 추출하고자하는 행에서 우측마우 클릭하고, copy - copy selector 선택 복사하여 아래와 같이 Select_one문에 붙여넣기하여 기본정보를 추출할 수 있다.

soup.select_one("#Blog1 > div.blog-posts.hfeed > div > div > div > div.post.hentry.uncustomized-post-template > h3").text.strip()

다. 속성값 추출
태그 내에 작성되어 있는 속성값을 추출하기 위해서는 get("속성명") 메소드를 활용하여 속성값을 추출할 수 있다.

print(soup.select_one("#Profile1 > div > a").get("href")) 

라. 반복되는 내용 추출
웹페이지에 있는 세부 텍스트 내용은 통상 패러그래프 태그인 P 태그에 반복적으로 들어있기 때문에 아래와 같이 for문을 이용하여 추출할 수 있다.

text =""
body=soup.find("div", {"class":"post-body entry-content"})

for para in body.select("p"):
    text=text+para.text.strip()
text







댓글 없음:

댓글 쓰기