CodeGym /์ž๋ฐ” ์ฝ”์Šค /Python SELF KO /JavaScript ์ฝ˜ํ…์ธ  ์ž‘์—…

JavaScript ์ฝ˜ํ…์ธ  ์ž‘์—…

Python SELF KO
๋ ˆ๋ฒจ 33 , ๋ ˆ์Šจ 1
์‚ฌ์šฉ ๊ฐ€๋Šฅ

1. ๋™์  ํŽ˜์ด์ง€ ์†Œ๊ฐœ

JavaScript ๋•๋ถ„์— ์ฝ˜ํ…์ธ ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์›น์‚ฌ์ดํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํฌ๋ž˜ํ•‘ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๊ณจ์น˜ ์•„ํ”ˆ ์ผ์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ๊ฑฐ์•ผ. ํ•˜์ง€๋งŒ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ! ๋ณต์žกํ•œ ์ฝ”๋“œ๋Š” ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด. ์ด์ œ requests_html์ด ์ด๋Ÿฐ ์ฝ˜ํ…์ธ ์™€ ์–ด๋–ป๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด์ž.

๋ชจ๋“  ์›น ํŽ˜์ด์ง€๊ฐ€ ๋˜‘๊ฐ™์ด ์œ ์šฉํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์•ผ. ์–ด๋–ค ํŽ˜์ด์ง€๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์ฆ‰์‹œ ๋กœ๋“œํ•˜๊ณ , ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋Š” JavaScript๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ช‡ ๊ฐ€์ง€ ์–ด๋ ค์›€์„ ๋งŒ๋“ค์–ด. ์™œ๋ƒํ•˜๋ฉด ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ๋ณด์ด๋Š” HTML์ด ํ‘œ์ค€ ์š”์ฒญ์„ ํ†ตํ•ด ์–ป๋Š” HTML๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์•ผ.

๋™์  ์ฝ˜ํ…์ธ  ์Šคํฌ๋ž˜ํ•‘ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

requests์™€ ๊ฐ™์€ ์›น ์ž‘์—… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋Œ€๋ถ€๋ถ„์€ ์„œ๋ฒ„ ์‘๋‹ต๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ  JavaScript๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์–ด. ์ด๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ JavaScript๋ฅผ ํ†ตํ•ด ๋กœ๋“œ๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ, ํ‘œ์ค€ ์š”์ฒญ์—์„œ ํ•ด๋‹น ์ฝ˜ํ…์ธ ๋ฅผ ์ „ํ˜€ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ด.

2. requests_html ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ requests_html์ด ๋“ฑ์žฅํ•ด! ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” requests์˜ ๊ฐ„๋‹จํ•จ๊ณผ JavaScript ์‹คํ–‰ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐ•๋ ฅํ•จ์„ ๊ฒฐํ•ฉํ•ด. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” JavaScript ์‹คํ–‰์„ ์ง€์›ํ•˜๋Š” ๊ธฐ๋ณธ ๋ Œ๋”๋ง ์—”์ง„์„ ์ œ๊ณตํ•˜์—ฌ, ๋งˆ์น˜ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์  ์›น ํŽ˜์ด์ง€์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ๋ฐ ์„ค์ •

์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด requests_html์„ ์„ค์น˜ํ•˜์ž. ๋„ค๊ฐ€ ์ข‹์•„ํ•˜๋Š” ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ผ:

Bash
pip install requests-html

ํ›Œ๋ฅญํ•ด, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋์–ด! ์ด์ œ ์ด๊ฑธ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด.

JavaScript ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•œ requests_html ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

requests_html ๋•๋ถ„์— ์šฐ๋ฆฌ ์‚ถ์ด ๋” ์‰ฌ์›Œ์กŒ์–ด. ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž. JavaScript๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž.

Python

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์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ํ–‰๋™์„ ๋ชจ๋ฐฉํ•  ์ˆ˜ ์žˆ์–ด.

Python

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 ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋งˆ์น˜ ์—ฌ๋Ÿฌ ํ•ด ๋™์•ˆ ์Šคํฌ๋ž˜ํ•‘์„ ์—ฐ์Šตํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์›น ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ๋ฅผ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์–ด!

Python

# ์ฒซ ๋ฒˆ์งธ ๋‰ด์Šค ํ—ค๋“œ๋ผ์ธ ์š”์†Œ ์„ ํƒ
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 ๊ฐ™์€ ํˆด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„.
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION