1. ๋์ ํ์ด์ง ์๊ฐ
JavaScript ๋๋ถ์ ์ฝํ
์ธ ๋ฅผ ์ค์๊ฐ์ผ๋ก ์
๋ฐ์ดํธํ๋ ์น์ฌ์ดํธ์์ ๋ฐ์ดํฐ๋ฅผ ์คํฌ๋ํํ๋ ค๊ณ ์๋ํ ์ ์ด ์๋ค๋ฉด,
์ด๊ฒ์ด ์ผ๋ง๋ ๊ณจ์น ์ํ ์ผ์ผ ์ ์๋์ง ์ ๊ฑฐ์ผ. ํ์ง๋ง ๊ฑฑ์ ํ์ง ๋ง! ๋ณต์กํ ์ฝ๋๋ ๋ง๋ฒ์ฒ๋ผ ๋ณด์ด๋๋ก
์ค์ ํ ์ ์์ด. ์ด์ requests_html
์ด ์ด๋ฐ ์ฝํ
์ธ ์ ์ด๋ป๊ฒ ์์
ํ ์ ์๋์ง ์์๋ณด์.
๋ชจ๋ ์น ํ์ด์ง๊ฐ ๋๊ฐ์ด ์ ์ฉํ ๊ฒ์ ์๋์ผ. ์ด๋ค ํ์ด์ง๋ ์ฝํ ์ธ ๋ฅผ ์ฆ์ ๋ก๋ํ๊ณ , ๋ค๋ฅธ ํ์ด์ง๋ JavaScript๋ฅผ ํตํด ๋์ ์ผ๋ก ์ฝํ ์ธ ๋ฅผ ์์ฑํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ ์ ์์ด. ์ด๊ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ค๋ ์ฌ๋๋ค์๊ฒ ๋ช ๊ฐ์ง ์ด๋ ค์์ ๋ง๋ค์ด. ์๋ํ๋ฉด ๊ฐ๋ฐ์ ๋๊ตฌ์์ ๋ณด์ด๋ HTML์ด ํ์ค ์์ฒญ์ ํตํด ์ป๋ HTML๊ณผ ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ด์ผ.
๋์ ์ฝํ ์ธ ์คํฌ๋ํ ์ ๋ฐ์ํ๋ ๋ฌธ์
requests์ ๊ฐ์ ์น ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ถ๋ถ์ ์๋ฒ ์๋ต๋ง ์ฒ๋ฆฌํ๊ณ JavaScript๋ฅผ ์คํํ ์ ์์ด. ์ด๋ ์ฝํ ์ธ ๊ฐ JavaScript๋ฅผ ํตํด ๋ก๋๋๊ฑฐ๋ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ, ํ์ค ์์ฒญ์์ ํด๋น ์ฝํ ์ธ ๋ฅผ ์ ํ ํ์ธํ ์ ์์์ ์๋ฏธํด.
2. requests_html
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ requests_html
์ด ๋ฑ์ฅํด! ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ requests์ ๊ฐ๋จํจ๊ณผ
JavaScript ์คํ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ ฅํจ์ ๊ฒฐํฉํด. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ JavaScript ์คํ์
์ง์ํ๋ ๊ธฐ๋ณธ ๋ ๋๋ง ์์ง์ ์ ๊ณตํ์ฌ, ๋ง์น ์ค์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ
๋์ ์น ํ์ด์ง์ ์ํธ์์ฉํ ์ ์๊ฒ ํด์ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ๋ฐ ์ค์
์์
์ ์์ํ๋ ค๋ฉด requests_html
์ ์ค์นํ์. ๋ค๊ฐ ์ข์ํ๋ ํฐ๋ฏธ๋์ ์ด๊ณ
์๋ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด ๋ผ:
pip install requests-html
ํ๋ฅญํด, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค์น๋์ด! ์ด์ ์ด๊ฑธ ์ฌ์ฉํ ์ ์์ด.
JavaScript ์ฝํ
์ธ ๋ฅผ ์ถ์ถํ๊ธฐ ์ํ requests_html
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
requests_html
๋๋ถ์ ์ฐ๋ฆฌ ์ถ์ด ๋ ์ฌ์์ก์ด. ์ค์ ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง
์ดํด๋ณด์. JavaScript๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ํ์ด์ง๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์.
from requests_html import HTMLSession
# HTML ์ธ์
์ ์์ฑ
session = HTMLSession()
# ์น ํ์ด์ง ์์ฒญ ์คํ
response = session.get('https://example-dynamic-page.com')
# JavaScript ๋ ๋๋ง
response.html.render()
# ๋ฐ์ดํฐ ์ถ์ถ
data = response.html.find('#dynamic-content', first=True)
print(data.text)
์ด๊ฒ ๋ฐ๋ก ๋ง๋ฒ์ด์ง! requests์๋ ๋ฌ๋ฆฌ requests_html
์
.render()
๋ฉ์๋๋ฅผ ์ ๊ณตํ์ฌ ํ์ด์ง๋ฅผ "์คํ"ํ๊ณ JavaScript๋ฅผ ์คํํ ์ ์์ด.
ํ์ด์ง๊ฐ "์ด์๋ฌ์" ๋, ์ด์ ์ ๋ฐฐ์ด ์ ํ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์์ด.
3. ๋ฐ์ดํฐ ์ถ์ถ ์์
์ด์ ์ฌํ์ ์ผ๋ก ๋ค์ด๊ฐ ๋ช ๊ฐ์ง ์์ ๋ฅผ ์ดํด๋ณด์. ์ด๊ฑธ ํตํด requests_html
์ด
๋ค์ํ ์ํฉ์์ ์ฐ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๋์์ฃผ๋์ง ๋ณผ ์ ์์ด.
๋์ ํ์ด์ง์์ ๋ฐ์ดํฐ ์ถ์ถ ์ค์ต
์๋ฅผ ๋ค์ด, ์คํฌ๋กค ํ์๋ง ์ต์ ๋ด์ค๋ฅผ ๋ก๋ํ๋ ํ์ด์ง๊ฐ ์๋ค๊ณ ์์ํด ๋ณด์.
requests_html
์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ํ๋์ ๋ชจ๋ฐฉํ ์ ์์ด.
url = 'https://example-news-site.com'
# ํ์ด์ง ๋ก๋
response = session.get(url)
# ๋ ๋๋ง ์คํ(ํ์ํ ๊ฒฝ์ฐ ํ์์์ ์ฆ๊ฐ)
response.html.render(timeout=20)
# ๋ด์ค ์์ ์ฐพ๊ธฐ
news_items = response.html.find('.news-item')
for item in news_items:
print(item.text)
์ด์ ์ ์ก์ ์ ์์๋ ์ฝํ ์ธ ์ ์ก์ธ์คํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ฝ๊ณ ๊ฐ๋จํ์ง ์ ์ ์์ง!
requests_html
๋ก ๋ก๋๋ JavaScript ์ฝํ
์ธ ์ฒ๋ฆฌ
requests_html
๊ณผ ์ด์ ๊ฐ์์์ ์ดํด๋ณธ CSS ์ ํ์๋ฅผ ์ฌ์ฉํ๋ฉด,
๋ง์น ์ฌ๋ฌ ํด ๋์ ์คํฌ๋ํ์ ์ฐ์ตํ ๊ฒ์ฒ๋ผ ์น ํ์ด์ง ์ฝํ
์ธ ๋ฅผ ์์
ํ ์ ์์ด!
# ์ฒซ ๋ฒ์งธ ๋ด์ค ํค๋๋ผ์ธ ์์ ์ ํ
headline = response.html.find('.news-headline', first=True)
print(headline.text)
# ์์์์ ๋งํฌ ์ถ์ถ
link = headline.find('a', first=True).attrs['href']
print(link)
4. ์ค์ ํ๊ณผ ํธ๋ฆญ
requests_html
์ ๊ฐ๋ ฅํ ๋๊ตฌ์ง๋ง, ์ด๋ฅผ ์ฌ์ฉํ ๋๋ ๋ช ๊ฐ์ง๋ฅผ ๊ธฐ์ตํด์ผ ํด:
- ํ์์์๊ณผ ์ง์ฐ์๊ฐ: ๋ ๋ณต์กํ ํ์ด์ง์๋ ๋ ๋๋ง ํ์์์์ ์กฐ์ ํ๋ ๊ฒ์ ์์ง ๋ง. ์ด๋ ๋๋ฆฐ ๋ก๋๋ก ์ธํ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ผ.
-
๋ ๋๋ง ์ฑ๋ฅ:
requests_html
์ JavaScript๋ฅผ ๋ ๋๋งํ๋ฏ๋ก ๋ง์ ๋ฆฌ์์ค๋ฅผ ์๋ชจํ ์ ์์ด. ๋ฐ์ดํฐ๊ฐ ๋ง๊ฑฐ๋ ๋ณต์กํ ํ์ด์ง๋ฅผ ์์ ํ ๋ ์ด๋ก ์ธํด ํ๋ก์ธ์ค๊ฐ ๋๋ ค์ง ์ ์์ด. -
CAPTCHA์ ๋ด ๋ฐฉ์ง:
requests_html
์ ๋ด ๋ฐฉ์ง ๊ธฐ์ ์ด๋ CAPTCHA๋ฅผ ์ฐํํ์ง ๋ชปํด. ๋ ๋ณต์กํ ๊ฒฝ์ฐ์๋ Selenium ๊ฐ์ ํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์.
GO TO FULL VERSION