CodeGym /์ž๋ฐ” ์ฝ”์Šค /Python SELF KO /requests_html๋กœ ๋™์  ์ฝ˜ํ…์ธ  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

requests_html๋กœ ๋™์  ์ฝ˜ํ…์ธ  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

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

1. ๋™์  ์ฝ˜ํ…์ธ ์™€ JavaScript

BeautifulSoup๊ณผ requests ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์›น ์Šคํฌ๋ž˜ํ•‘ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ์ตํ˜”๋‹ค๋ฉด ์ด์ œ ๋” ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์œผ๋กœ ๋“ค์–ด๊ฐˆ ์ฐจ๋ก€์•ผ. ์˜ค๋Š˜์€ ์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๋Š” ๋™์•ˆ์—๋งŒ ๋™์ ์œผ๋กœ ๋กœ๋“œ๋˜๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด์ž. ๋ธŒ๋ผ์šฐ์ €๋งŒ '๋ฌดํ•œ ์Šคํฌ๋กค'์„ ์ข‹์•„ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ์•ผ. ์ด์ œ ๋„ˆ์˜ ์Šคํฌ๋ฆฝํŠธ๋„ ์ด ๊ธฐ์ˆ ์„ ๋ฐฐ์šธ ์‹œ๊ฐ„์ด์•ผ! ๐Ÿค–

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

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

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

requests_html ์„ค์น˜ํ•˜๊ธฐ

์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋จผ์ € ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ด. ์•„์ง ์„ค์น˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์ค˜:

Bash
pip install requests-html

requests_html ์‚ฌ์šฉํ•˜๊ธฐ

์„ค์น˜๋ฅผ ๋งˆ์ณค์œผ๋ฉด, requests_html์„ ์‚ฌ์šฉํ•ด์„œ ๋™์  ์ฝ˜ํ…์ธ ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์ž.

์˜ˆ์ œ: ํŽ˜์ด์ง€ ๋กœ๋“œ ๋ฐ ๋ Œ๋”๋ง

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋กœ ์‹œ์ž‘ํ•˜์ž: ํŽ˜์ด์ง€ ๋กœ๋“œ, JavaScript ์‹คํ–‰, ๋ฐ์ดํ„ฐ ์ถ”์ถœ. JavaScript ์‹คํ–‰ ํ›„์—๋งŒ ๋‚˜ํƒ€๋‚˜๋Š” ์š”์†Œ์˜ ํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

Python

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์€ ํŽ˜์ด์ง€ ์Šคํฌ๋กค์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋” ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค˜.

์ž๋™ ์Šคํฌ๋กค ์˜ˆ์ œ

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฌดํ•œ ๋‰ด์Šค ํ”ผ๋“œ๊ฐ€ ์žˆ๋Š” ํŽ˜์ด์ง€์—์„œ ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜์ž. ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด:

Python

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 ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์Šคํฌ๋กค ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋ผ.

Python
response.html.render(timeout=30)

์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์žฅ์• 

ํŽ˜์ด์ง€์˜ JavaScript๊ฐ€ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด. wait ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•„์š”ํ•œ ์š”์†Œ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค๋ณผ ์ˆ˜ ์žˆ์–ด.

Python
response.html.render(wait=2)

ํ™”๋ฉด ํ•ด์ƒ๋„์™€ ์žฅ์น˜ ์œ ํ˜•

์ผ๋ถ€ ์‚ฌ์ดํŠธ๋Š” ํ™”๋ฉด ํ•ด์ƒ๋„๋‚˜ ์žฅ์น˜ ์œ ํ˜•์— ๋”ฐ๋ผ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ๋„ ํ•ด. ์–ด๋–ค User-Agent๋กœ ์š”์ฒญ์„ ์‹คํ–‰ํ•˜๋Š”์ง€์™€ ๋ Œ๋”๋ง๋œ ์ฝ˜ํ…์ธ ๋ฅผ ํ™•์ธํ•ด๋ด.

Python

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์€ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์•ผ. ํ•˜์ง€๋งŒ ๊ทธ ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ณ  ํ”ํ•œ ์‹ค์ˆ˜๋ฅผ ํ”ผํ•˜๋ ค๋ฉด ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๊ผญ ์ฝ์–ด๋ด. ์ด๊ฑธ ์ฝ์œผ๋ฉด ์Šคํฌ๋กค ์กฐ์ž‘ ๋ฐ ๋ณต์žกํ•œ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์„ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ.

์ด ์ •๋„๋ฉด ๋™์  ์ฝ˜ํ…์ธ ๋‚˜ ๋ฌดํ•œ ์Šคํฌ๋กค์ด ๊ฒ๋‚˜์ง€ ์•Š์„ ์ •๋„๋กœ ๋ฌด์žฅํ•œ ๊ฑฐ์•ผ. ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ํ–‰๋™ํ•˜๊ณ , ๋„ˆ์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™ํ™”ํ•˜๋ ค๋Š” ์ฐฉํ•œ ํ•ด์ปค๋ผ๋Š” ๊ฑธ ์žŠ์ง€ ๋งˆ. ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๋Š” ์•„๋‹ˆ๋ผ๊ณ ! ๐Ÿ˜‡

1
ะžะฟั€ะพั
๋™์  ์ฝ˜ํ…์ธ  ์ฝ๊ธฐ,ย  33 ัƒั€ะพะฒะตะฝัŒ,ย  4 ะปะตะบั†ะธั
ะฝะตะดะพัั‚ัƒะฟะตะฝ
๋™์  ์ฝ˜ํ…์ธ  ์ฝ๊ธฐ
๋™์  ์ฝ˜ํ…์ธ  ์ฝ๊ธฐ
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION