โป SK ์ด๋์ค ๋ฃจํค์ฆ 24๊ธฐ (ํด๋ผ์ฐ๋๊ธฐ๋ฐ ์ค๋งํธ ์ตํฉ๋ณด์ ๊ณผ์ ) ๊ต์ก์ ๋ค์ผ๋ฉด์ ์์ฑํ ๋ด์ฉ์ ๋๋ค.
1๏ธโฃ ์น ์คํฌ๋ํ(Web Scraping) ๊ฐ๋
- ์น ์คํฌ๋ํ์ ์ธํฐ๋ท์ ์กด์ฌํ๋ ์นํ์ด์ง์์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ถ์ถํ๋ ๊ณผ์ ์ ๋ปํจ
- ์ฃผ๋ก HTML ํ์ด์ง์์ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ถ์ถ ๋ฐ ์ด๋ฅผ ํ์ฉํ๋๋ฐ ์ฌ์ฉ
- ์น ์คํฌ๋ํ์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์:
- ์น ํ์ด์ง ์์ฒญ: ์น ์๋ฒ์ HTTP ์์ฒญ์ ๋ณด๋ด์ด HTML ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ด
- HTML ๋ถ์: ๊ฐ์ ธ์จ HTML ํ์ด์ง์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์๋๋ก HTML ๊ตฌ์กฐ๋ฅผ ๋ถ์
- ๋ฐ์ดํฐ ์ถ์ถ: ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ , ๊ทธ๊ฒ์ ์ถ์ถ
- ๋ฐ์ดํฐ ๊ฐ๊ณต ๋ฐ ์ ์ฅ: ์ถ์ถํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ฑฐ๋ ์ ์ฅํ ์ ์๋ ํํ๋ก ๋ณํ
๐น1. ์น ํฌ๋กค๋ง๊ณผ ์น ์คํฌ๋ํ์ ์ฐจ์ด์
๊ตฌ๋ถ | ์นํฌ๋กค๋ง (Web Crawling) | ์น ์คํฌ๋ํ (Web Scraping) |
๐ ์ ์ | ์น ํ์ด์ง๋ค์ ์๋์๋ก ์ํํ๋ฉฐ ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ๋ ์์ | ์น ํ์ด์ง์์ ์ํ๋ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ์์ |
๐งญ ํต์ฌ ๋ชฉ์ | ๋ฐ์ดํฐ์ ํ์/์์ง ๋ฒ์ ํ๋ | ํน์ ๋ฐ์ดํฐ ์ถ์ถ |
๐ ์ฃผ์ ์ญํ | ์น ์ฌ์ดํธ ๊ตฌ์กฐ ํ์ ๋ฐ ํ์ด์ง ์๋ ํ์ | ํ์ด์ง ๋ด ํน์ ์ ๋ณด ์ถ์ถ |
๐ ๊ฒฐ๊ณผ๋ฌผ | URL ๋ชฉ๋ก, ํ์ด์ง HTML ์ ์ฒด | ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ (ํ ์คํธ, ์ซ์, ํ ๋ฑ) |
๐ต๏ธโ๏ธ ์์ | ๊ฒ์ ์์ง ๋ด์ด ์น ํ์ด์ง ์์ง | ์ผํ๋ชฐ์์ ์ํ๋ช , ๊ฐ๊ฒฉ๋ง ์ถ์ถํ |
๐น2. ์น ์คํฌ๋ํ ๊ธฐ๋ณธ ํ๋ก์ธ์ค
โ HTML ๊ฐ์ ธ์ค๊ธฐ (requests)
์น ํ์ด์ง๋ ๊ฒฐ๊ตญ HTML ๋ฌธ์๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์, ์ฐ์ ํด๋น ํ์ด์ง์ HTML ์ฝ๋๋ฅผ ์์ฒญ(request)ํด์ ๊ฐ์ ธ์์ผ ํจ
import requests
url = 'https://example.com'
response = requests.get(url)
html = response.text
- ``requests.get()`` : ์ง์ ํ URL์ HTML ๋ฐ์ดํฐ๋ฅผ ์์ฒญ
- ``response.text`` : HTML ์ ์ฒด ์์ค์ฝ๋ ๋ฌธ์์ด๋ก ์ ์ฅ
BeautifulSoup ๊ฐ์ฒด ์์ฑ (ํ์ฑ)
๊ฐ์ ธ์จ HTML์ ๋จ์ ๋ฌธ์์ด์ด๊ธฐ ๋๋ฌธ์, ํ๊ทธ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ ์ํ๋ ์์๋ฅผ ์ฐพ๊ธฐ ์ํ ํ์ฑ(Parsing) ์์ ์ด ํ์
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
- ``html.parser`` : HTML ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ํ์(parser)
- ``soup`` ๊ฐ์ฒด๋ฅผ ํตํด HTML ์์๋ค์ ํ์ํ ์ ์๊ฒ ๋จ
๋ฐ์ดํฐ ์ถ์ถ (find, select, get_text)
์ด์ ``soup`` ๊ฐ์ฒด๋ฅผ ํตํด ์ํ๋ ์์๋ง ์ ํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถ
title = soup.find('h1').get_text()
links = [a['href'] for a in soup.find_all('a')]
- ``find()``, ``find_all()`` : ํ๊ทธ ํ์
- ``get_text()`` : ํ ์คํธ๋ง ์ถ์ถ
- ``['href']`` : ์์ฑ๊ฐ ์ถ์ถ
2๏ธโฃ BeautifulSoup4
- BeautifulSoup4 = HTML๊ณผ XML ๋ฌธ์๋ฅผ ํ์ฑ/ํ์ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์๋ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ฃผ์ ๊ธฐ๋ฅ:
- HTML ๋ฌธ์์ ๊ตฌ์กฐ๋ฅผ ํ์ฑํ๊ณ , ํน์ ํ๊ทธ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์์
- ``find()``, ``find_all``, ``select()`` ๋ฑ์ ๋ฉ์๋๋ฅผ ํตํด HTML ์์๋ฅผ ๊ฒ์ํ๊ณ ์ถ์ถ ๊ฐ๋ฅ
๐น1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
pip install beautifulsoup4
๐น2. HTML ๋ฌธ์ ํ์ฑ
- HTML ๋ฌธ์ ํ์ฑ → ํน์ ํ๊ทธ ๊ฒ์ → ๋ด์ฉ ์์
from bs4 import BeautifulSoup
# ๊ฐ๋จํ HTML ๋ฌธ์
html_doc = """<html> <head> <title> ... </title> </head> <body>"""
# HTML ๋ฌธ์๋ฅผ Beautiful Soup ๊ฐ์ฒด๋ก ๋ณํ
# html.parser ์ฌ์ฉ
soup = BeautifulSoup(html_doc, 'html.parser')
# ๋ฌธ์ ์ถ๋ ฅ
print(soup.prettify())
๐น3. BeautifulSoup ๋ฉ์๋
find() ๋ฉ์๋ - ํ๋๋ง ์ฐพ๊ธฐ
soup.find('ํ๊ทธ๋ช
', ์์ฑ์กฐ๊ฑด)
- ์ญํ : ์กฐ๊ฑด์ ๊ฐ์ฅ ๋จผ์ ์ผ์นํ๋ ํ๊ทธ 1๊ฐ๋ฅผ ๋ฐํ
- ๋ฐํ๊ฐ: ``Tag`` ๊ฐ์ฒด ๋๋ ``None``
- ์ฌ์ฉ ์์:
soup.find('div', class_='title')
โก๏ธ ํด๋น ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฒซ ๋ฒ์งธ ``<div class="title">`` ์์๋ง ๋ฐํ
- ํ์ฉ ์ํฉ:
- ํ์ด์ง ๊ตฌ์กฐ๊ฐ ์ผ๊ด๋๊ณ , ํน์ ์์๊ฐ ํ๋๋ง ์กด์ฌํ ๋
- ex) ๋ด์ค ๊ธฐ์ฌ ์ ๋ชฉ, ๋ํ ์ด๋ฏธ์ง ๋ฑ
find_all() ๋ฉ์๋ - ๋ชจ๋ ์ฐพ๊ธฐ
soup.find_all('ํ๊ทธ๋ช
', ์์ฑ์กฐ๊ฑด)
- ์ญํ : ์กฐ๊ฑด์ ๋ง๋ ๋ชจ๋ ํ๊ทธ๋ฅผ ๋ฆฌ์คํธ ํํ๋ก ๋ฐํ
- ๋ฐํ๊ฐ: ``ResultSet`` ๊ฐ์ฒด (๋ฆฌ์คํธ์ฒ๋ผ ๋์)
- ์ฌ์ฉ ์์:
soup.find_all('a')
โก๏ธ ํ์ด์ง ๋ด ๋ชจ๋ ``<a>`` ํ๊ทธ๋ฅผ ์ฐพ์ ๋ฆฌ์คํธ๋ก ๋ฐํ
- ํ์ฉ ์ํฉ:
- ๋ฐ๋ณต๋๋ ํญ๋ชฉ(๋๊ธ, ์ ํ ๋ฆฌ์คํธ, ๋งํฌ ๋ชฉ๋ก ๋ฑ)์ ๊ฐ์ ธ์ฌ ๋
- ์กฐ๊ฑด์ ๋ง๋ ํ๊ทธ๊ฐ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ
get_text() ๋ฉ์๋ - ํ ์คํธ๋ง ๋ฝ๊ธฐ
element.get_text(strip=True)
- ์ญํ : ํ๊ทธ ๋ด๋ถ์ ํ ์คํธ ๋ด์ฉ๋ง ์ถ์ถ
- ๋ฐํ๊ฐ: ``str`` (๋ฌธ์์ด)
- ์ฌ์ฉ ์์:
title = soup.find('h1').get_text()
โก๏ธ ``<h1>๋ด์ค ์ ๋ชฉ์ ๋๋ค</h1> → ``"๋ด์ค ์ ๋ชฉ์ ๋๋ค"``
- ํ์ฉ ์ํฉ:
- ํ๊ทธ ์์ ๊ธ์๋ง ์ถ์ถํ๊ณ ์ถ์ ๋
- HTML ํ๊ทธ๋ ํ์ ์๊ณ ์์ํ ํ ์คํธ๋ง ํ์ํ ๊ฒฝ์ฐ
3๏ธโฃ CSS Selectors
- Beautiful Soup ๋ฐ Tag ๊ฐ์ฒด๋ ``.css`` ์์ฑ์ ํตํด CSS ์ ํ์๋ฅผ ์ง์
๐น1. CSS Selecotrs ๋ฉ์๋
select() ๋ฉ์๋ - ์ฌ๋ฌ ๊ฐ ์ ํ
soup.select('CSS ์
๋ ํฐ')
- ์ญํ : CSS ์ ๋ ํฐ ์กฐ๊ฑด์ ๋ง๋ ๋ชจ๋ ์์๋ฅผ ์ฐพ์ ๋ฆฌ์คํธ๋ก ๋ฐํ
- ๋ฐํ๊ฐ: list of Tag
- ์์:
soup.select('div.post')
โก๏ธ ``<div class="post">`` ์์๋ฅผ ๋ชจ๋ ์ฐพ์ ๋ฆฌ์คํธ๋ก ๋ฐํ
select_one() ๋ฉ์๋ - ํ๋๋ง ์
soup.select_one('CSS ์
๋ ํฐ')
- ์ญํ : CSS ์ ๋ ํฐ ์กฐ๊ฑด์ ์ฒ์ ์ผ์นํ๋ ์์ ํ๋๋ง ๋ฐํ
- ๋ฐํ๊ฐ: Tag ๊ฐ์ฒด ๋๋ None
- ์์:
soup.select_one('h1.title')
โก๏ธ ๊ฐ์ฅ ์ฒ์ ๋์ค๋ ``<h1 class="title">`` ํ๊ทธ ํ๋ ๋ฐํ
'๐งฉ Language > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์ด์ฌ ์์ ๋ฌธ์ ์๋ํ (OpenPyXL) (0) | 2025.01.16 |
---|---|
Python ์น ์คํฌ๋ํ (2) Requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ (0) | 2025.01.16 |
[Python] ํ์ด์ฌ์ ํ์ฉํ ์ด๋ฉ์ผ ์๋ํ ๋ฐฉ๋ฒ (1) | 2025.01.16 |
[Python] ๋ฐ์ดํฐ ํํ์ ์ํ ์ ๊ทํํ์ ์ ๋ฆฌ (0) | 2025.01.15 |
[Python] ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ ์ ์ด (1) | 2025.01.14 |