웹 크롤링과 웹 스크래핑은 웹 상에서 데이터를 추출하기 위한 방법은 대표적인 방법이다.
웹에서의 데이터 추출이란 웹 페이지의 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)
'Days > IT' 카테고리의 다른 글
파이썬 웹 프레임워크(Flask, Django, FastAPI) (1) | 2023.12.05 |
---|---|
GET / POST (1) | 2023.12.04 |
알아두면 도움이 되는 IT 용어 (0) | 2022.07.01 |
노마드코더 ( addEventListener, toggle ) (0) | 2021.10.27 |
부스트코스 _ GitLab 이용방법 (과제 제출하기) (0) | 2020.04.08 |
댓글