๐ ๋ฐ์ดํฐ ๊ตฌ๋ถ
- ๋ด๋ถ ๋ฐ์ดํฐ: ๋ด๊ฐ ์ง์ ๋ง๋ ๋ฐ์ดํฐ, ๋ก์ปฌ์ ์ ์ฅ๋ ํ์ผ ๋ฑ
- ์ธ๋ถ ๋ฐ์ดํฐ: ์น์์ ์์งํ๊ฑฐ๋ ์ธ๋ถ API๋ก ๋ฐ์์ค๋ ๋ฐ์ดํฐ (โ ์น ํฌ๋กค๋ง, API ์์ฒญ ๋ฑ ํ์ฉ)
๐ ์น ๋ฐ์ดํฐ ์์ง (์น ํฌ๋กค๋ง)
โ ์น ๋ฐ์ดํฐ๋ฅผ ์์งํ ๋๋ ๋ฐ๋์ ๊ณต๊ฐ๋ ๋ฐ์ดํฐ๋ง ์์งํด์ผ ํจ.
๋ก๊ทธ์ธํด์ผ ์ ๊ทผ ๊ฐ๋ฅํ ํ์ด์ง, ์ ์๊ถ ์๋ ์ฝํ ์ธ ๋ฅผ ๋ฌด๋จ์ผ๋ก ๊ธ๋ ๊ฑด ๋ถ๋ฒ์ผ ์ ์์.
- ๋๋ถ๋ถ์ ์น์ฌ์ดํธ๋ robots.txt์ ํฌ๋กค๋ง ํ์ฉ/๋นํ์ฉ ๊ฒฝ๋ก๋ฅผ ๋ช ์ํจ
https://์น์ฌ์ดํธ์ฃผ์/robots.txt ํ์ธ
- API๊ฐ ์๋ค๋ฉด ํฌ๋กค๋ง๋ณด๋ค API ์ฌ์ฉ์ด ๋ ์์ ํ๊ณ ํฉ๋ฒ์ ์
โ ์์ง ๋์ ์์
- ๊ณต๊ฐ๋ XML, JSON, CSV ํฌ๋งท ๋ฐ์ดํฐ
- ๊ณต๊ณต ๋ฐ์ดํฐ ํฌํธ API
- HTML ํ์ด์ง์์ ํน์ ์ ๋ณด๋ง ์ถ์ถ
โ ์ฌ์ฉ ๊ธฐ์ ์คํ
- requests: ์น ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ๊ธฐ ์ํ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- BeautifulSoup(bs4): HTML์ ๊ตฌ์กฐํํด์ ํ์ฑํ๊ธฐ ์ํ ๋๊ตฌ
- selenium: ๋ธ๋ผ์ฐ์ ์๋ํ ๋๊ตฌ โ ์ฌ๊ธฐ์ ์ฌ์ฉํ์ง ์์ (๋ณดํต ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ ํ์ด์ง์ ํ์ํจ)
selenium ์ธ์ ์ฌ์ฉ ?
๐ Selenium: ๋ธ๋ผ์ฐ์ ์๋ํ ๋๊ตฌ
- ๋ด๊ฐ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ป๊ธฐ ์ํด **๋ธ๋ผ์ฐ์ ์ ์/๋ก๊ทธ์ธ/ํด๋ฆญ/์
๋ ฅ** ๋ฑ์ ์๋ํ ํ์ํ ๋ ์ฌ์ฉ
- ๋ก๊ทธ์ธ ํ ์ฝํ
์ธ , ๋ฒํผ ํด๋ฆญํด์ผ ๋ณด์ด๋ ๋ฐ์ดํฐ, JS๋ก ์์ฑ๋๋ ๋ฐ์ดํฐ ๋ฑ์ ์ ํฉ
- ๋จ์ HTML ๊ธ๊ธฐ์๋ ๋นํจ์จ์
๐ข ์ฌ์ฉํ๋ ๊ฒฝ์ฐ: ๋ก๊ทธ์ธ ํ์, ๋ฒํผ ํด๋ฆญ ๋ฑ ์ฌ์ฉ์ ํ๋ ํ์
๐ด ์ฌ์ฉ ์ ํ๋ ๊ฒฝ์ฐ: HTML๋ง ์๊ฑฐ๋, API๋ก ๋ฐ์ดํฐ ์ ๊ณต๋๋ ๊ฒฝ์ฐ
โ Selenium์ด๋?
Selenium์ ์ฌ๋์ฒ๋ผ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋์ผ๋ก ์กฐ์ํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ์์.
๋ธ๋ผ์ฐ์ ์ด๊ธฐ, ๋ก๊ทธ์ธ ์
๋ ฅ, ๋ฒํผ ํด๋ฆญ, ํ์ด์ง ์ด๋, ์ ๋ณด ๋ณต์ฌ๊น์ง ๋ชจ๋ ์๋์ผ๋ก ํ ์ ์์ฃ .
๐ Selenium์ ์ธ์ ์ฌ์ฉํ๋๊ฐ?
1. ์ผ๋ฐ์ ์ธ ์น ํฌ๋กค๋ฌ๋ก๋ ์ ๋ ๋
- ๋ก๊ทธ์ธ ํ์๋ง ์ ๊ทผ ๊ฐ๋ฅํ ๋ฐ์ดํฐ
- ์๋ฐ์คํฌ๋ฆฝํธ(JS)๋ก ๋์ ์ผ๋ก ๋ก๋ฉ๋๋ ์ฝํ ์ธ (ex. ์คํฌ๋กคํด์ผ ๋ณด์ด๋ ๊ฒ์๊ธ, ๋ฒํผ ๋๋ฅด๋ฉด ์ด๋ฆฌ๋ ์ ๋ณด ๋ฑ)
- ๋ฐ์ดํฐ๊ฐ HTML์ ๋ฐ๋ก ์ ๋ณด์ด๊ณ , ๋ฒํผ์ ํด๋ฆญํด์ผ ์๊ธฐ๋ ๊ฒฝ์ฐ
๐ ์:
๋ค์ด๋ฒ์ ๋ก๊ทธ์ธํด์ ๋ด ๋ฉ์ผํจ์ ํฌ๋กค๋งํ๊ฑฐ๋,
์ผํ๋ชฐ์์ ๋ก๊ทธ์ธ ํ ์ฅ๋ฐ๊ตฌ๋/๊ตฌ๋งค์ด๋ ฅ ํ์ด์ง์์ ๋ฐ์ดํฐ๋ฅผ ์ป๊ณ ์ถ์ ๋.
2. ์ฌ๋์ฒ๋ผ ํ๋ํด์ผ ํ ๋
- ๋จ์ํ HTML ๊ฐ์ ธ์ค๋ ์์ค์ด ์๋๋ผ,
๋ฒํผ ํด๋ฆญ โ ๋๊ธฐ โ ๋ค์ ํ์ด์ง๋ก ์ด๋ โ ํผ ์ ๋ ฅ โ ์ ์ถ ๋ฑ์ ํ๋ฆ์ด ํ์ํ ๊ฒฝ์ฐ
๐ ์:
์ค๋ฌธ์กฐ์ฌ ์๋ ์ ์ถ, ์ํ ์๋ ์ฃผ๋ฌธ, ์ ํด์ง ์๊ฐ์ ์ถ์์ฒดํฌ ๋ฑ
3. ํ ์คํธ ์๋ํ ์ฉ๋
- ์น ์๋น์ค๋ฅผ ๋ง๋ค๊ณ ๋์, ์ฌ๋์ด ์ง์ ๋๋ฌ๋ณด๋ฉฐ ํ
์คํธํ๋ ๋์ ,
Selenium์ผ๋ก ํ ์คํธ ์๋๋ฆฌ์ค๋ฅผ ์ง์ ์๋ํํจ
๐ ์:
"ํ์๊ฐ์ โ ๋ก๊ทธ์ธ โ ๋ก๊ทธ์์" ์ ์ฒด ํ๋ฆ ํ ์คํธ ์๋ํ
๐ Selenium์ด ์ ์ ๋ง๋ ์ํฉ์?
์ํฉ | ๋์ ๋๊ตฌ |
๋จ์ํ HTML ์ฝ๋๋ง ๊ฐ์ ธ์ค๋ฉด ๋๋ ์ฌ์ดํธ | requests, BeautifulSoup, httpx ๋ฑ |
API๋ก ๊น๋ํ๊ฒ ๋ฐ์ดํฐ ์ ๊ณตํ๋ ๊ฒฝ์ฐ | requests + JSON ํ์ฑ |
๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์์งํด์ผ ํ ๊ฒฝ์ฐ | Headless ํฌ๋กค๋ฌ (Scrapy, Playwright ๋ฑ) |
๐ง ์ ๋ฆฌ ์์ฝ
์ํฉ | Selenium ์ฌ์ฉ ์ฌ๋ถ |
๋ก๊ทธ์ธ ํ์ | โ Yes |
๋ฒํผ ํด๋ฆญ/JS ๋ก๋ฉ ํ์ | โ Yes |
๋จ์ HTML ๊ธ๊ธฐ | โ No |
๋ฐ์ดํฐ๊ฐ API๋ก ์ ๊ณต๋จ | โ No |
์ฌ์ฉ์ ํ ์คํธ ์๋๋ฆฌ์ค ํ์ | โ Yes |
๐ฅ ์์ง ํ๋ฆ ์์ฝ
- requests๋ก HTML ์์ฒญ ๋ณด๋ด๊ธฐ
import requests
response = requests.get("https://example.com")
- ์ ์ ์๋ต ์ฝ๋ ํ์ธ
response.status_code == 200 # ์ ์์ ์ธ ์๋ต ํ์ธ
- BeautifulSoup์ผ๋ก HTML ํ์ฑ
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
# HTML ํ
์คํธ๋ฅผ ํ๊ทธ ๊ตฌ์กฐ๋ก ๋ฐ๊ฟ์ค
๐ ์ํ๋ ํ๊ทธ ์ถ์ถํ๊ธฐ
๐ find() / find_all() ๋ฉ์๋
- find(): ์กฐ๊ฑด์ ๋ง๋ ์ฒซ ๋ฒ์งธ ํ๊ทธ ํ๋๋ง ๋ฐํ
- find_all(): ์กฐ๊ฑด์ ๋ง๋ ์ฌ๋ฌ ํ๊ทธ๋ฅผ ๋ฆฌ์คํธ๋ก ๋ฐํ
โ ํ๊ทธ ์ด๋ฆ + ์์ฑ์ผ๋ก ์ฐพ๊ธฐ
soup.find(name="div", attrs={"class": "title"})
- name: ์ฐพ๊ณ ์ถ์ ํ๊ทธ ์ด๋ฆ (div, a, span ๋ฑ)
- attrs: ์์ฑ ์กฐ๊ฑด (์: ํด๋์ค ์ด๋ฆ, ์์ด๋ ๋ฑ)
๐ท๏ธ ํ๊ทธ์์ ์ ๋ณด ์ถ์ถํ๊ธฐ
0. ํ ์คํธ๋ง ๋ฝ๊ธฐ
ํ๊ทธ ์์ ์์ ํ ์คํธ๋ง ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋
tag.text
1. ์์ฑ๊ฐ ์ถ์ถํ๊ธฐ
์: <a href="๋งํฌ์ฃผ์">์์ ๋งํฌ๋ง ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋
tag.attrs["href"]
๐ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ค์์ ํ๊ทธ ์ฒ๋ฆฌ
find_all()๋ก ์ฐพ์ ์ฌ๋ฌ ํ๊ทธ์์ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉฐ ์ํ๋ ์ ๋ณด๋ฅผ ์์งํจ
results = []
for tag in soup.find_all(name="div", attrs={"class": "item"}):
title = tag.text
link = tag.attrs["data-url"]
results.append([title, link])
๐งพ ๋ฐ์ดํฐํ๋ ์์ผ๋ก ์ ๋ฆฌ
Pandas์ DataFrame์ผ๋ก ์ ์ฅํ๋ฉด
- ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ/์ด ๊ตฌ์กฐ๋ก ์ ๋ฆฌํ ์ ์๊ณ
- ์์ ์ ์ฅ, DB ์ ์ฅ, ๋ถ์ ๋ฑ์ ํ์ฉํ๊ธฐ ์ฌ์
import pandas as pd
df = pd.DataFrame(results, columns=["์ ๋ชฉ", "๋งํฌ"])
'Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Colab] Oracle โ MySQL: ngrok๊ณผ Pandas๋ก ๊ตฌํํ๋ ์ธ๋ถ DB ์ฐ๋ ์ค์ต ๊ฐ์ด๋ (0) | 2025.03.24 |
---|---|
[Colab] Colab & Jupyter์์ !, %, %% Magic commands ์๋ฒฝ ์ ๋ฆฌ (0) | 2025.03.24 |
[Python] Python ๋ชจ๋์ import ๋ฐ from import ์ ๋ฆฌ (0) | 2025.03.19 |
[python] ํ์ด์ฌ sequence ์๋ฃํ (0) | 2021.12.19 |
[python] ํ์ด์ฌ ์ซ์ ๊ฐ ์๋ฆฌ์ ๋ถ๋ฆฌ (0) | 2021.12.17 |
๋๊ธ