1. ๋์ ์ฝํ ์ธ ์ JavaScript
BeautifulSoup๊ณผ requests ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์น ์คํฌ๋ํ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ์ตํ๋ค๋ฉด ์ด์ ๋ ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์ผ๋ก ๋ค์ด๊ฐ ์ฐจ๋ก์ผ. ์ค๋์ ์คํฌ๋กค์ ๋ด๋ฆฌ๋ ๋์์๋ง ๋์ ์ผ๋ก ๋ก๋๋๋ ์ฝํ ์ธ ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ ์๋์ง ์์๋ณด์. ๋ธ๋ผ์ฐ์ ๋ง '๋ฌดํ ์คํฌ๋กค'์ ์ข์ํ๋ ๊ฒ ์๋์ผ. ์ด์ ๋์ ์คํฌ๋ฆฝํธ๋ ์ด ๊ธฐ์ ์ ๋ฐฐ์ธ ์๊ฐ์ด์ผ! ๐ค
์ธํฐ๋ท์๋ ๋์ ์ผ๋ก ๋ก๋๋๋ ํ์ด์ง๊ฐ ๋์ณ๋. ์ด๋ฐ ํ์ด์ง๋ JavaScript์ ์ํธ์์ฉํ ๋ ์ฝํ ์ธ ๊ฐ ์ ๋ฐ์ดํธ๋๊ณ ๋ํ๋์ง. ์ด JavaScript๊ฐ ๋ฐ๋ก ํด๋ผ์ด์ธํธ ์ธก์์ "๋ง๋ฒ์ ๋ถ๋ฆฌ๊ฒ ํ๋" ์ญํ ์ ํด. ์ด๋ฐ ํ์ด์ง๋ ์น ์คํฌ๋ํผ์๊ฒ ์ถ๋ณต์ผ ์๋ ์๊ณ ์ ์ฃผ์ผ ์๋ ์์ด. ์ฌ์ฉ์์๊ฒ๋ ๋ ์ธํฐ๋ํฐ๋ธํ๊ณ ํธ๋ฆฌํ์ง๋ง, requests ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ JavaScript๋ฅผ ์ดํดํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ํ์ด์ง๋ฅผ ์คํฌ๋ํํ๋ ์์ ์ด ๋ ์ด๋ ค์์ง์ง.
2. requests_html
๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋คํํ๋ ๋๋ ์๋ค์ํผ ์ธ์์๋ requests_html
์ด ์์ด.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ requests์ ๊ฐ๋ ฅํจ๊ณผ Pyppeteer์ ๋ธ๋ผ์ฐ์ ์ ์ฌ ๋ ๋๋ง ๊ธฐ๋ฅ์ ๊ฒฐํฉํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ผ. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๋์ ์ฝํ
์ธ ๋ฅผ ํฌํจํ ํ์ด์ง๋ฅผ ๋ก๋ํ๊ณ ๋ ๋๋งํ ์
์์ผ๋ฉฐ, JavaScript๊น์ง ์คํํ๊ณ ํ์ด์ง scroll๋ ํ ์ ์์ด.
requests_html
์ค์นํ๊ธฐ
์์ ์ ์์ํ๋ ค๋ฉด ๋จผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ผ ํด. ์์ง ์ค์นํ์ง ์์๋ค๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํด์ค:
pip install requests-html
requests_html
์ฌ์ฉํ๊ธฐ
์ค์น๋ฅผ ๋ง์ณค์ผ๋ฉด, requests_html
์ ์ฌ์ฉํด์ ๋์ ์ฝํ
์ธ ๋ฅผ ๋ก๋ํ๊ณ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์
์ดํด๋ณด์.
์์ : ํ์ด์ง ๋ก๋ ๋ฐ ๋ ๋๋ง
๊ฐ๋จํ ์์ ๋ก ์์ํ์: ํ์ด์ง ๋ก๋, JavaScript ์คํ, ๋ฐ์ดํฐ ์ถ์ถ. JavaScript ์คํ ํ์๋ง ๋ํ๋๋ ์์์ ํ ์คํธ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ ๋ฅผ ์ดํด๋ณด์.
from requests_html import HTMLSession
# ์ธ์
์์ฑ
session = HTMLSession()
# ํ์ด์ง ๋ก๋
response = session.get('https://example.com/dynamic-page')
# JavaScript ์คํํ์ฌ ํ์ด์ง ๋ ๋๋ง
response.html.render()
# ๋ ๋๋ง ํ ๋ํ๋๋ ์์์ ํ
์คํธ ์ถ์ถ
content = response.html.find('#dynamic-content', first=True)
print(content.text)
์ด ์์ ์์๋ render()
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ requests_html
์ด ํ์ด์ง์
JavaScript๋ฅผ ์คํํ๊ฒ ํ๊ณ , ํ์ค ๋ก๋๋ก๋ ์จ๊ฒจ์ง ์ฝํ
์ธ ๋ฅผ ๋ ๋๋งํ์ด.
3. ์๋ ํ์ด์ง ์คํฌ๋กค
๊ฐ๋ ๋์ ์ฝํ
์ธ ๋ ์ฆ์ ๋ก๋๋์ง ์๊ณ ํ์ด์ง๋ฅผ ์คํฌ๋กคํด์ผ ๋ํ๋. ์ด ๊ฒฝ์ฐ
requests_html
์ ํ์ด์ง ์คํฌ๋กค์ ์๋ฎฌ๋ ์ด์
ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ก๋ํ ์ ์๊ฒ ๋์์ค.
์๋ ์คํฌ๋กค ์์
์๋ฅผ ๋ค์ด, ๋ฌดํ ๋ด์ค ํผ๋๊ฐ ์๋ ํ์ด์ง์์ ๊ฐ๋ฅํ ๋ง์ ํญ๋ชฉ์ ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๊ณ ํ์. ์ด๋ ๊ฒ ํ ์ ์์ด:
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://example.com/infinite-scroll')
# ํ์ด์ง ๋ ๋๋ง ๋ฐ ์คํฌ๋กค
response.html.render(scrolldown=5, sleep=1)
# ๋ชจ๋ ๋ด์ค ์์ดํ
์ถ์ถ
news_items = response.html.find('.news-item')
for news_item in news_items:
print(news_item.text)
์ฌ๊ธฐ์ render()
๋ฉ์๋๋ scrolldown
๊ณผ
sleep
๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐ๋ก ๋ฐ๋๋ฐ, ์ด๋ ํ์ด์ง๋ฅผ ๋ช ๋ฒ ์๋๋ก ์คํฌ๋กคํ๊ณ ๊ฐ
์คํฌ๋กค ์ฌ์ด์ ์ผ๋ง๋ ๋๊ธฐํ ์ง๋ฅผ ์๋ฏธํด.
4. ์ค์ ํ์ฉ
์ ์ด๋ฐ ์๋ ์คํฌ๋กค ๊ฐ์ ์ผ์ ํด์ผ ํ ๊น? ๐ค
- ๋ง์ผํ ์กฐ์ฌ: ๋ง์ ํ์ฌ๊ฐ ํธ๋ ๋ ๋ฐ ์๋น์ ํ๋์ ๋ถ์ํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ฌด์ ํ ์ถ๋ ฅํ๋ ํ์ด์ง๋ฅผ ์ฌ์ฉํด.
-
์์
๋ฏธ๋์ด ๋ชจ๋ํฐ๋ง: ๋ง์ ์์
๋ฏธ๋์ด ํ๋ซํผ์ด ๋ฌดํ ์คํฌ๋กค์ ์ฌ์ฉํ๋ฏ๋ก,
requests_html
์ ๋ฐ์ดํฐ ์์ง ๋ฐ ๋ชจ๋ํฐ๋ง์ ์ ์ฉํ ๋๊ตฌ์ผ. - ๋ด์ค ๋ฐ ์ ๋ฐ์ดํธ: ๋ฌดํ ๋ด์ค ํผ๋์์ ๋ด์ค ํค๋๋ผ์ธ ๋ฐ ๊ธฐ์ฌ๋ฅผ ์ถ์ถํ๋ฉด ๋น ๋ฅธ ๋ถ์์ ์ํด ์ ์ฉํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ด.
5. ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ํด๊ฒฐ์ฑ
๋์ ํ์ด์ง ๋ฐ requests_html ์์ ์ค์๋ ์ข ์ข ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด. ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด์:
๋ ๋๋ง ๋ฌธ์
๋๋ก๋ render()
๋ฉ์๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์ง ์์ ์ ์์ด, ํนํ ํ์ด์ง๊ฐ ๋๋ฌด
ํฌ๊ฑฐ๋ ๋ณต์กํ ๋. ์ด๋ด ๋๋ timeout
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํด ๋ ๋๋ง ์๊ฐ์ ๋๋ฆฌ๊ฑฐ๋
์คํฌ๋กค ํ์๋ฅผ ์ค์ด๋ ๊ฒ์ด ๋์์ด ๋ผ.
response.html.render(timeout=30)
์คํฌ๋ฆฝํธ ์คํ ์ฅ์
ํ์ด์ง์ JavaScript๊ฐ ์คํฌ๋ฆฝํธ ์คํ์ ์ฐจ๋จํ๊ฑฐ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด. wait
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํด์ ํ์ํ ์์๊ฐ ๋ํ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค๋ณผ ์ ์์ด.
response.html.render(wait=2)
ํ๋ฉด ํด์๋์ ์ฅ์น ์ ํ
์ผ๋ถ ์ฌ์ดํธ๋ ํ๋ฉด ํด์๋๋ ์ฅ์น ์ ํ์ ๋ฐ๋ผ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๊ธฐ๋ ํด. ์ด๋ค User-Agent๋ก ์์ฒญ์ ์คํํ๋์ง์ ๋ ๋๋ง๋ ์ฝํ ์ธ ๋ฅผ ํ์ธํด๋ด.
response.session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
6. ์ถ๊ฐ ์ฝ์๊ฑฐ๋ฆฌ
requests_html
์ ๊ฐ๋ ฅํ ๋๊ตฌ์ผ. ํ์ง๋ง ๊ทธ ๋ชจ๋ ๊ฐ๋ฅ์ฑ์ ์ต๋ํ ํ์ฉํ๊ณ
ํํ ์ค์๋ฅผ ํผํ๋ ค๋ฉด
๊ณต์ ๋ฌธ์๋ฅผ ๊ผญ ์ฝ์ด๋ด. ์ด๊ฑธ ์ฝ์ผ๋ฉด
์คํฌ๋กค ์กฐ์ ๋ฐ ๋ณต์กํ ํ์ด์ง ๋ ๋๋ง์ ๋ ์ ์ดํดํ ์ ์์ ๊ฑฐ์ผ.
์ด ์ ๋๋ฉด ๋์ ์ฝํ ์ธ ๋ ๋ฌดํ ์คํฌ๋กค์ด ๊ฒ๋์ง ์์ ์ ๋๋ก ๋ฌด์ฅํ ๊ฑฐ์ผ. ์กฐ์ฌ์ค๋ฝ๊ฒ ํ๋ํ๊ณ , ๋์ ์คํฌ๋ฆฝํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์๋ํํ๋ ค๋ ์ฐฉํ ํด์ปค๋ผ๋ ๊ฑธ ์์ง ๋ง. ์ ์์ ์ธ ์ฌ์ฉ์๋ ์๋๋ผ๊ณ ! ๐
GO TO FULL VERSION