본문 바로가기
Days/IT

데이터 크롤링과 BeautifulSoup

by TIS_Ha 2023. 12. 1.
반응형

웹 크롤링과 웹 스크래핑은 웹 상에서 데이터를 추출하기 위한 방법은 대표적인 방법이다.

웹에서의 데이터 추출이란 웹 페이지의 HTML 구조를 파싱하고 원하는 정보를 추출하는 과정을 말한다.

이러한 데이터 추출을 위해서는 반드시 정보 수집 과정이 필요하므로 웹 크롤링과 웹 스크래핑에 대한 개념 이해가 필요하다.

* 파싱(Parsing) : 웹 페이지에서 내가 원하는 데이터를 특정 패턴이나 순서로 추출하여 정보로 가공하는 것.

 

웹 크롤링(Web Crawling) 이란?

웹 크롤링은 웹 상의 다양한 웹 페이지를 자동으로 탐색하고 수집하는 과정을 의미하며,

크롤러 혹은 스파이더라고 불리는 프로그램을 사용하여 여러 웹 페이지를 순회하며 링크를 추적하거나 사이트의 내용을 수집한다.

일반적으로 큰 규모의 데이터 수집이 필요한 경우에만 사용되며, 검색 엔진이나 인덱싱 서비스에서 주로 활용되는 웹 정보 수집 방법이다.

 

웹 스크래핑(Web Scraping) 이란?

웹 스크래핑은 웹 페이지의 내용을 추출하거나 분석하는 과정을 의미한다.

특정 웹 페이지(단일)에서 필요한 정보를 수집하기 위해 HTML 구조를 파싱하여 원하는 데이터를 추출해 필요한 정보를 가져올 수 있다.

웹의 다양한 데이터를 자동으로 수집하며 수집된 정보(여러 웹의 데이터)를 통해 비교 및 분석이 가능하다.

 

 

웹 크롤링과 웹 스크래핑의 차이점

  웹 크롤링 웹 스크래핑
수집 범위 복수 단일
규모 대규모의 데이터 수집 소규모의 데이터 수집

 

웹 크롤링은 크롤러라는 자동화된 프로그램을 사용하여 여러 페이지를 탐색하고 데이터를 수집하는 반면에,

웹 스크래핑은 웹 페이지의 HTML 구조를 분석하여 원하는 데이터를 추출한다.

일반적으로 크롤링은 프로그램(크롤러 Crawler)이 웹사이트를 정기적으로 돌며 정보를 추출할 때 주로 사용하며, 스크래핑은 웹사이트의 특정 정보를 추출하고 웹 데이터 구조 분석이 필요할 때 사용한다.

 

크롤링의 종류

1) 정적 크롤링 : 정적인 데이터를 수집하는 방법

   - 정적인 데이터는 변하지 않는 데이터를 말하며, 한페이지 내 원하는 정보가 모두 드러난다면 정적이라고 말한다.

   -  주소를 통해 단발적으로 접근하여 한 페이지 내에서 모든 작업이 이루어지므로 속도가 빠르지만, 수집하는 데이터에 한계가 있다.

2) 동적 크롤링 : 동적인 데이터를 수집하는 방법

   - 클릭, 입력, 로그인 등과 같이 페이지 이동 후에 보여지는 데이터를 말한다.

   - 브라우저를 사용해 연속적으로 접근하기 때문에 수집 데이터의 한계가 없지만, 속도가 느리다.

 

BeautifulSoup

Python은 데이터 크롤링을 위한 다양한 라이브러리를 제공한다.

가장 유명한 라이브러리 중 하나인 BeautifulSoup은 HTML과 XML 문서를 파싱하고 원하는 정보를 추출하는데 사용한다.

분류방식(parser) 특징 설치 여부 속도 사용방법
html.parser   기본 설치 중간 BeautifulSoup(markup, 'html.parser')
lxml xml 파일 지원 lxml 설치 필요 매우 빠름 BeautifulSoup(markup, 'lxml')
xml lxml 설치 필요 매우 빠름 BeautifulSoup(markup, 'xml')
html5lib 브라우저와 같은 방식 html5lib 설치 필요 매우 느림 BeautifulSoup(markup, 'html5lib')

그 외에도 Requests, Selenium, Scrapy 등 다양한 라이브러리가 데이터 크롤링에 활용된다.

 

BeautifulSoup 예시

from bs4 import BeautifulSoup

html = """
<html><body>
<h1 id='title'>python</h1>
<h2><p1 id='p1'>hello</p1>
<p2 id='p2'>world</p2></h2>
<p>HELLO!</p>
<p>WORLD!</p>
</body></html>
"""
soup = BeautifulSoup(html, 'html.parser')

h1 = soup.find(id='title')
p1 = soup.find(id='p1')
p2 = soup.find(id='p2')
h2 = soup.find('h2')
print(h1.string) # python
print(p1.string) # hello
print(p2.string) # world
print(h2.text)   # hello /n world
p = soup.find('p')
print(p.string)  # HELLO!
p_all = soup.find_all('p')
for p in p_all:
    print(p.text) # HELLO! /n WORLD!
  • find : 조건에 맞는 가장 가까운 태그 하나를 찾는다.
  • find_all : 조건에 맞는 모든 태그를 가져온다. for문과 if문을 통해 가공할 수 있다.
  • .string : string 태그 하위의 문자열을 객체화하며, 문자열이 없으면 None을 반환한다.
  • .text : 하위 자식태그의 텍스트까지 문자열로 반환한다.

 

크롤링 실습

import requests as req

url = 'http://search.naver.com/search.naver'
res = req.get(url, params={'query':'크롤링'})
print(res.text)

# 원하는 정보를 얻기 위해 html 문서 내의 태그를 확인한다.
strings = res.text
strings_row = strings.split('<')

# for문을 통해 검색어가 포함된 페이지의 구문을 리스트로 반환해준다.
target_list = []
for text in strings_row:
    target_idx = text.find('크롤링')
    target = text[target_idx:]
    if "크롤링" in target:
        target_list.append(target)
        
target_list = target_list[1:]
print(target_list)

 

BeautifulSoup 활용예시)

import requests
from bs4 import BeautifulSoup


search_query = '크롤링'
url = f'https://search.naver.com/search.naver?query={search_query}'
print(url)
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

titles = soup.select('a.link_tit') 
for title in titles:
    print(title.text)

 

반응형

댓글