๐ Crawling
์ผ๋จ ์ ์ ์นํ์ด์ง์ ๋์ ์นํ์ด์ง๊ฐ ์กด์ฌํ๋๋ฐ ๊ทธ ์ฐจ์ด๋ฅผ ์์์ผํ๋ค.
์ ์ ์นํ์ด์ง๋ ์์ง์ด์ง ์๊ณ ํ์ฌ ์ํ ๊ทธ๋๋ก html์ ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์๋ ์ฌ์ดํธ๋ฅผ ๋งํ๋ค.
๊ฒ์ํ์๋ url ๋งํฌ๊ฐ ๊ฒ์์ด๊ฐ q = "hello" ํํ๋ก ๋ถ๋๋ค๊ฑฐ๋
์์ธ ํ์ด์ง url์ ๊ฐ์ง๊ณ ํด๋น ์ํ์ ์์ธ ์ ๋ณด ๋ด์ฉ์ ๋ชจ๋ ๊ฐ์ ธ์ฌ ์ ์๋ ํ์ด์ง๋ฅผ ์ ์ ์นํ์ด์ง๋ผ๊ณ ํ๋ค.
๋์ ์นํ์ด์ง๋ ๋์ผํ url์ธ๋ฐ ์ฌ์ฉ์์ ์ปจํธ๋กค์ ๋ฐ๋ผ ํ๋ฉด์ ๊ฒฐ๊ณผ, html์ด ๋ฌ๋ผ์ง๋ ์ฌ์ดํธ๋ฅผ ๋งํ๋ค.
๋ฌดํ ์คํฌ๋กค์ด ๊ฐ๋ฅํ ํ์ด์ง๋ tab ๋ฒํผ์ ๋๋ ๋๋ฐ ํ์ฌ ํ์ด์ง์์ ํ๋จ ๊ฒฐ๊ณผ ๊ฐ๋ง ๋ฌ๋ผ์ง๊ฑฐ๋ ํ๋ค.
๐ Crawling์์ ๋ญ๊ฐ ๋ค๋ฅธ๋ฐ??!!!
์ ์ ์นํ์ด์ง๋ requests ๋ชจ๋์ ์ฌ์ฉํ์ฌ url์ html์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๊ณ ,
๋์ ์นํ์ด์ง๋ selenium ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์ง์ ๋ง์ฐ์ค๋ฅผ ์ ์ด(?)ํ๋ฉฐ ํ๋์ url์์ ์ํ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋ค.
๊ทธ๋ฆฌ๊ณ html์ ๊ฐ์ ธ์์ ๋ด๊ฐ ์ํ๋ ๋ถ๋ถ์ ์ฐพ์์ค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก Beautifulsoup ์ฌ์ฉ๋ฒ์ ๋ฐฐ์ ๋ค.
๐ ์ ์ ์นํฌ๋กค๋ง
1๏ธโฃ ์ ์ ์นํ์ด์ง requests ๋ชจ๋ ์ฌ์ฉํ์ฌ html ๊ฐ์ ธ์ค๊ธฐ.
2๏ธโฃ ๊ฐ์ ธ์จ html์ lxml ํ์๋ฅผ ์ ํํด์ html์ ํด์ํ๋ค.
3๏ธโฃ ํด์๋ html = soup, soup์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํด๋ธ๋ค.
res = requests.get(url, headers={"user-agent":user_agent})
res.encoding = "utf-8"
if res.status_code == 200:
soup = BeautifulSoup(res.text, "lxml")
a_tag_list = soup.select(a_selector)
for a_tag in a_tag_list:
print(a_tag.get("href"))
print(a_tag.attrs["href"])
else:
raise Exception(f"์์ฒญ ์คํจ. ์๋ต์ฝ๋: {res.status_code}")
โ
BeautifulSoup Parser(ํ์) ์ข
๋ฅ๋ "lxml", "html.parser", "html5lib" ์ค ํ๋๋ฅผ ์ ํํ๋ค.
html.parser๋ ํ์ด์ฌ ๋ด์ฅ์ผ๋ก ์ค์น๊ฐ ๋ถํ์ํ์ง๋ง ์๋๊ฐ ๋๋ฆฐํธ์ด๋ฉฐ,
html5lib์ HTML5 ํ์ค์ ๋ง๊ฒ ์๊ฒฉํ๊ฒ ํด์ํ๋ ํ์๋ผ์ ๋ ์๋๊ฐ ๋๋ฆฌ๋ค.
์์์ ์ฌ์ฉํ lxml์ C์ธ์ด ๊ธฐ๋ฐ์ด๋ผ ์๋๊ฐ ์ ์ผ ๋น ๋ฅด๊ณ ์์ ์ฑ์ด ์ข์ lxml๋ก ๋๋ถ๋ถ ์ฌ์ฉํ๋ค.
โ
a_tag๋ฅผ ๊ทธ๋๋ก printํด๋ณด๋ฉด select๋ก ๊ฐ์ ธ์ค๊ฒ ๋ html ๊ทธ๋๋ก๊ฐ ํ์๋๋ค.
ํด๋น html์์ ๋ด๊ฐ ์ํ๋ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ค๋ฉด a_tag์์๋ select๋ฅผ ํด์ ๋ ์์ธํ๊ฒ ๋ค์ด๊ฐ ์ ๋ ์๊ณ ,
๋ฐ๋ก get์ด๋ attrs๋ฅผ ๊ฐ์ง๊ณ ๋ด๊ฐ ์ํ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
๐ ๋์ ์นํฌ๋กค๋ง
๋์ ์นํฌ๋กค๋ง์ Selenium์ด ๋ํ์ ์ด๊ณ ์์ฆ์ Playwright๋ ๋ง์ด ์ฌ์ฉํ๋ค๊ณ ํ๋ค. ์์ ์๊ฐ์ Selenium์๋ํด์ ๋ฐฐ์ ๋ค.
option = webdriver.ChromeOptions()
option.add_argument("--headless")
driver_path = ChromeDriverManager().install()
service = Service(executable_path=driver_path)
browser = webdriver.Chrome(service=service, options = option)
๋์ ์นํฌ๋กค๋ง์ ์ปดํจํฐ์ ์กด์ฌํ๋ chromedriver.exe ํ์ผ์ ๊ฐ์ง๊ณ ํฌ๋กค๋ง์ ํ๊ธฐ๋๋ฌธ์
browser ๊ฐ์ฒด๋ฅผ ํตํด ์น ์ฌ์ดํธ์ ๋ฒํผ์ ๋๋ฅผ ์๋ ์๊ณ , ์คํฌ๋ฆฐ์ท์ ํ ์๋ ์๊ณ ์คํฌ๋กค๋ฅผ ๋ด๋ฆฌ๊ฒ ํ ์ ๋ ์๋ค.
execute_script("js code")๋ฅผ ํตํด์ ์น์ฌ์ดํธ์์ js์ฝ๋๋ฅผ ์คํ์ํฌ ์ ๋ ์๋ค.
โ
์น ํฌ๋กค๋ง์ ์์ํ๋ฉด ๊ธฐ๋ณธ์ผ๋ก ์น์ด ์ค์ ๋ก ๋จ๋ฉด์ ์๋์ด ๋๋ ํํ์ธ๋ฐ,,,
๋ธ๋ผ์ฐ์ ์ฐฝ์ ๋์ฐ์ง ์๊ณ ํฌ๋กค๋ง ํ๊ธฐ ์ํด์๋ option์ headless๋ฅผ ์ค์ ํด์ค์ผํ๋ค.
โ
ํ์ด์ง ์ด๋์ด๋ ๋ฌดํ์คํฌ๋กค์์ ์คํฌ๋กค์ ์งํํ ๋,
ํฌ๋กค๋ง์ ๋ฐ๋ก ํ๋ฉด ํ๋ฉด ๊ตฌ์ฑ์ด ์๋ฃ๋์ง ์์ ์ํ์ html์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋๊ฒ time.sleep(์ด), WebDriverWait.until(ํ๋ฉด์ด ๋จ๋ ์กฐ๊ฑด), ImplicitWait๊ฐ ์๋ค.
time.sleep(n) : ๋ฌด์กฐ๊ฑด n์ด๋งํผ ๊ธฐ๋ค๋ฆฌ๊ธฐ
WebDriverWait.until : ํ๋ฉด์ ๋จ๋ ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ฉด n์ด๊ฐ ๋์ง ์์๋ ๋ค์์ผ๋ก ๋์ด๊ฐ๋ค.
ImplicitWait : ์ ์ฒด ํ์ด์ง ๋ก๋ฉ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ n์ด๊ฐ ๋์ง ์์๋ ๋ค์์ผ๋ก ๋์ด๊ฐ๋ค.
https://selenium-python.readthedocs.io/waits.html
1๏ธโฃ ๋ฌดํ ์คํฌ๋กค ๊ฐ๋ฅํ ๋์ ์นํ์ด์ง ์ด์ด์ฃผ๊ธฐ
2๏ธโฃ ์ ์ผ ํ๋จ๊น์ง ๋ฌดํ ์คํฌ๋กค ์งํ
3๏ธโฃ html ๊ฐ์ ธ์ค๊ณ ์ํ๋ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
Selenium ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ ์ ์ด๋ ๋์ ์ด๋ ์๋์ผ๋ก ์น ํฌ๋กค๋ง ํ๊ฒ ๋ง๋ค๊ธฐ๋ ํ๊ณ , ๋งคํฌ๋ก๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
'AI > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Pandas] DataFrame - iloc, loc ์ธ๋ฑ์ (0) | 2025.10.29 |
|---|---|
| [Python] Yield ํค์๋์ Generator ํจ์ (0) | 2025.10.13 |
| [Python] ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ with๋ฌธ - ContextManager (0) | 2025.10.12 |
| [Python] ํด๋์ค์ ๋๋ ๋ณ์ ๋ฐ ๋ฉ์๋ (0) | 2025.10.04 |
| [Python] ํด๋์ค์ ๋ณ์ + ์ ๊ทผ์ง์ ์ getter, setter (0) | 2025.10.01 |