ํฌ๋กค๋ง (Web Crawling)์ด๋?
1. ํฌ๋กค๋ง(Web Crawling) ์ ์
ํฌ๋กค๋ง(Web Crawling)์ ์น์ฌ์ดํธ์์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์์งํ๋ ๊ธฐ์ ์ ์๋ฏธํฉ๋๋ค. ์ฃผ๋ก ๊ฒ์ ์์ง, ๋ฐ์ดํฐ ๋ถ์, ๊ฐ๊ฒฉ ๋น๊ต,
์ฐ๊ตฌ ๋ชฉ์ ์ผ๋ก ํ์ฉ๋๋ฉฐ, ์น ํ์ด์ง์ HTML ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๊ณผ์ ์ด ํฌํจ๋ฉ๋๋ค.
ํฌ๋กค๋ง์ ์ํํ๋ ํ๋ก๊ทธ๋จ์ ์น ํฌ๋กค๋ฌ(Web Crawler) ๋๋ ๋ด(Bot, Spider) ๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ผ์ ํ ๊ท์น์ ๋ฐ๋ผ ์น์ฌ์ดํธ๋ฅผ
ํ์ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์์งํฉ๋๋ค.
2. ํฌ๋กค๋ง์ ์ฃผ์ ๊ณผ์
ํฌ๋กค๋ง์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋๋ค:
๐น 1) URL ์์ฒญ (Request)
- ํฌ๋กค๋ฌ๋ `requests` ๋ฑ์ HTTP ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์น ํ์ด์ง์ ์ ๊ทผํฉ๋๋ค.
- GET ๋๋ POST ์์ฒญ์ ํตํด HTML ๋ฌธ์๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๐น 2) HTML ํ์ฑ (Parsing)
- ๊ฐ์ ธ์จ HTML ๋ฌธ์๋ฅผ ๋ถ์ํ์ฌ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํฉ๋๋ค.
- `BeautifulSoup`, `lxml`, `html.parser` ๋ฑ์ ํ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํฉ๋๋ค.
๐น 3) ๋ฐ์ดํฐ ์ถ์ถ (Scraping)
- HTML ๊ตฌ์กฐ์์ ํ์ํ ์ ๋ณด๋ฅผ ์ฐพ๊ณ ์ ์ฅํฉ๋๋ค.
- CSS ์ ํ์, XPath ๋ฑ์ ์ฌ์ฉํ์ฌ ํน์ ํ๊ทธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๐น 4) ๋ฐ์ดํฐ ์ ์ฅ (Storage)
- ์ถ์ถํ ๋ฐ์ดํฐ๋ฅผ CSV, JSON, ๋ฐ์ดํฐ๋ฒ ์ด์ค(MySQL, MongoDB ๋ฑ)์ ์ ์ฅํฉ๋๋ค.
3. ํฌ๋กค๋ง์ ์ํ ์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Python ๊ธฐ์ค)
๋ผ์ด๋ธ๋ฌ๋ฆฌ | ์ค๋ช |
`requests` | ์น ํ์ด์ง์ HTML ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
`BeautifulSoup` | HTML/XML์ ์ฝ๊ฒ ํ์ฑํ์ฌ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
`lxml` | ๋น ๋ฅด๊ณ ๊ฐ๋ ฅํ XML ๋ฐ HTML ํ์ |
`Selenium` | ์น ๋ธ๋ผ์ฐ์ ์๋ํ๋ฅผ ํตํด JavaScript ๋ ๋๋ง์ด ํ์ํ ํ์ด์ง ํฌ๋กค๋ง ๊ฐ๋ฅ |
`Scrapy` | ๋๊ท๋ชจ ํฌ๋กค๋ง์ ์ํ ํ๋ ์์ํฌ (๋ฉํฐ์ฐ๋ ๋ ์ง์) |
4. ํฌ๋กค๋ง ์์ ์ฝ๋
๐น 1) `requests` + `BeautifulSoup`์ ํ์ฉํ ๊ธฐ๋ณธ ํฌ๋กค๋ง
import requests
from bs4 import BeautifulSoup
# ํฌ๋กค๋งํ ์น ํ์ด์ง URL
url = "https://example.com"
# ํ์ด์ง ์์ฒญ ๋ฐ HTML ํ์ฑ
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
# ํน์ ํ๊ทธ์์ ๋ฐ์ดํฐ ์ถ์ถ
title = soup.find("h1").text
print("ํ์ด์ง ์ ๋ชฉ:", title)
๐น 2) `Selenium`์ ํ์ฉํ JavaScript ๋ ๋๋ง ํ์ด์ง ํฌ๋กค๋ง
from selenium import webdriver
from selenium.webdriver.common.by import By
# ํฌ๋กฌ ๋๋ผ์ด๋ฒ ์คํ
driver = webdriver.Chrome()
driver.get("https://example.com")
# ํน์ ์์์์ ํ
์คํธ ์ถ์ถ
title = driver.find_element(By.TAG_NAME, "h1").text
print("ํ์ด์ง ์ ๋ชฉ:", title)
# ๋ธ๋ผ์ฐ์ ์ข
๋ฃ
driver.quit()
5. ํฌ๋กค๋ง ์ ์ฃผ์ํ ์ ๐จ
โ `robots.txt` ์ค์
- ํฌ๋กค๋ง์ด ํ์ฉ๋ ์ฌ์ดํธ์ธ์ง ๋ฐ๋์ ํ์ธํด์ผ ํฉ๋๋ค.
- `https://example.com/robots.txt`์ ์ ๊ทผํ์ฌ ํฌ๋กค๋ง ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ์ธ์.
โ ํฌ๋กค๋ง ์๋ ์ ํ
- ์งง์ ์๊ฐ์ ๋๋ฌด ๋ง์ ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ฒ์ ๋ถํ๋ฅผ ์ค ์ ์์ต๋๋ค.
- `time.sleep(1~3)`์ ์ฌ์ฉํ์ฌ ์ ์ ํ ์๋๋ฅผ ์ ์งํ์ธ์.
โ ๋ฒ์ ์ด์ ๊ณ ๋ ค
- ๊ฐ์ธ์ ๋ณด, ์ ์๊ถ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฌด๋จ์ผ๋ก ํฌ๋กค๋งํ๋ ๊ฒ์ ๋ฒ์ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
- ํฌ๋กค๋งํ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ํ์ฉํ ๊ฒฝ์ฐ, ์๋น์ค ์ฝ๊ด์ ํ์ธํ์ธ์.
6. ํฌ๋กค๋ง vs ์คํฌ๋ํ
- ํฌ๋กค๋ง(Crawling): ์ฌ๋ฌ ์น ํ์ด์ง๋ฅผ ํ์ํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๊ณผ์
- ์คํฌ๋ํ(Scraping): ํน์ ์น ํ์ด์ง์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๊ณผ์
๐ ํฌ๋กค๋ง์ด ๋ ๋์ ๊ฐ๋ ์ด๋ฉฐ, ์คํฌ๋ํ์ด ํฌ๋กค๋ง์ ์ผ๋ถ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
7. ํฌ๋กค๋ง์ ํ์ฉ ์ฌ๋ก
โ
๊ฒ์ ์์ง (Google, Bing) - ์น ํฌ๋กค๋ง์ ํตํด ์ ์ธ๊ณ ์น์ฌ์ดํธ์ ์ ๋ณด๋ฅผ ์์ง
โ
๋ฐ์ดํฐ ์์ง (๋ด์ค, ๋ธ๋ก๊ทธ, SNS ๋ถ์) - ํธ๋ ๋ ๋ถ์ ๋ฐ ๊ฐ์ฑ ๋ถ์
โ
๊ฐ๊ฒฉ ๋น๊ต ์ฌ์ดํธ (์ฟ ํก, ๋ค๋์ ๋ฑ) - ์ผํ๋ชฐ ๊ฐ๊ฒฉ ๋น๊ต ๋ฐ์ดํฐ ์์ง
โ
๋ถ๋์ฐ ์ ๋ณด ๋ถ์ - ์ํํธ, ๋งค๋ฌผ ๊ฐ๊ฒฉ ๋ณํ ์ถ์
โ
์ฌํ ์ผ์ ์ถ์ฒ - ์ฌํ์ง ์ ๋ณด๋ฅผ ์์งํ์ฌ AI ๊ธฐ๋ฐ ๋ฃจํธ ์ถ์ฒ ๊ฐ๋ฅ
ํฌ๋กค๋ง ๋ง๋ฌด๋ฆฌ:
ํฌ๋กค๋ง์ ๋ฐ์ดํฐ ์์ง์ ํต์ฌ ๊ธฐ์ ๋ก, ๋ค์ํ ๋ถ์ผ์์ ํ์ฉ๋๋ค~
ํ์ง๋ง ์น์ฌ์ดํธ ์ ์ฑ ์ ์ค์ํ๋ฉฐ,
๊ณผ๋ํ ์์ฒญ์ผ๋ก ์๋ฒ์ ๋ถ๋ด์ ์ฃผ์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ค~
๋ ๊น์ด ๊ณต๋ถํ๊ณ ์ถ๋ค๋ฉด `Scrapy`, `Selenium` ๋ฑ์ ํ์ฉํ ํฌ๋กค๋ง ์๋ํ๋ ์ถ์ฒ!
'AI ๐ค > ML ๐พ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[241226] ๋ฐ์ดํฐ ์๊ฐํ ์ ๋ฆฌ (2) | 2024.12.26 |
---|---|
[241217] ๋จธ์ ๋ฌ๋ ๊ฐ๋ ์ ๋ฆฌ ๋๋ฒ์งธ (0) | 2024.12.17 |
[241216] ๋จธ์ ๋ฌ๋ ๊ฐ๋ ์ ๋ฆฌ ์ฒซ๋ฒ์งธ (3) | 2024.12.16 |
[241209] ๊ฐ์ค์น์ ์ ํํ๊ท ์ ๋ฆฌ (4) | 2024.12.09 |
[241203] ๊ฒฐ์ธก์น์ ์ด์์น (3) | 2024.12.03 |