๋ฐ๋ธŒ์ฝ”์Šค_๋ฐ์ดํ„ฐ์—”์ง€๋‹ˆ์–ด๋ง

[Week3 ์›น๋ฐ์ดํ„ฐ ํฌ๋กค ๋ฐ ๋ถ„์„] TIL 8์ผ์ฐจ - ๋ฐ์ดํ„ฐ ํฌ๋กค๋ง ๊ธฐ์ดˆ(2)

๐Ÿช„ํ•˜๋ฃจ๐Ÿช„ 2023. 10. 25. 17:20
728x90

1) BeautifulSoup

์–ด์ œ request.get ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์›น ํŽ˜์ด์ง€๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํฌ๋ž˜ํ•‘ํ•˜๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ์˜ ๊ตฌ๋ถ„ ์—†์ด ํ•œ ์ค„๋กœ ํ‘œ์‹œ๋œ๋‹ค.

์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด BeautifulSoup ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉ๋ณด์ž.

 

BeautifulSoup ํŒจํ‚ค์ง€๋ž€?

html๊ณผ xml๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑ ํ•˜๋Š” ํŒจํ‚ค์ง€๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„ํŽธํ•˜๊ฒŒ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

html์˜ ํƒœ๊ทธ๋ช…, id, class ์ด๋ฆ„์„ ์ด์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด ๋ฐ์ดํ„ฐ ํฌ๋กค๋ง/์Šคํฌ๋ž˜ํ•‘ ์‹œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

 

์‚ฌ์šฉ

1. ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋Š ์œ„์น˜์—, ์–ด๋–ค ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ ธ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

2. requests.get ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ์›น์‚ฌ์ดํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์–ด์˜จ๋‹ค.

3. ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ BeautifulSoup ๊ฐ์ฒด๋กœ ๋งŒ๋“ ๋‹ค.

4. ํƒœ๊ทธ๋ช…/id/class ์ด๋ฆ„์„ ์ด์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์–ป์–ด์˜จ๋‹ค.

# ์Šคํฌ๋ž˜ํ•‘์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์™€๋ด…์‹œ๋‹ค.
import requests
from bs4 import BeautifulSoup

## ํƒœ๊ทธ ๋ช…(div)์œผ๋กœ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ
soup.find("div")
## ํƒœ๊ทธ๋ช…(div)๊ณผ id์ด๋ฆ„์œผ๋กœ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ
soup.find("div", id="id์ด๋ฆ„")
## ํƒœ๊ทธ๋ช…(div)๊ณผ class์ด๋ฆ„์œผ๋กœ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ
soup.find("div", "class์ด๋ฆ„")

 

5. ํŽ˜์ด์ง€๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํŽ˜์ด์ง€๋งˆ๋‹ค ์Šคํฌ๋ž˜ํ•‘ํ•ด์•ผ ํ•œ๋‹ค.

ํ•œ ๋ฒˆ์— ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ์Šคํฌ๋ž˜ํ•‘ํ•˜๋ฉด ๋งŽ์€ ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, time ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ์ผ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ ์ˆ˜๊ณ  ์Šคํ”„๋ž˜ํ•‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

ํŽ˜์ด์ง€์˜ ๊ฒฝ์šฐ ๋ณดํ†ต, url์— ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค.

import time

for i in range(1, page_num+1):
    res=requests.get("์Šคํฌ๋ž˜ํ•‘์„์›ํ•˜๋Š”ํŽ˜์ด์ง€์ฃผ์†Œ?page={}".format(i), user_agent)
    soup=BeautifulSoup(res.text, "html.parser")
    print(question.find("๋ฐ์ดํ„ฐ์ฐพ๊ธธ์›ํ•˜๋Š”์กฐ๊ฑด").text.strip())
    time.sleep(0.5)

 

2) Selenium

๊ทธ๋Ÿฐ๋ฐ, ์š”์ฆ˜ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋™์  ์›น ํŽ˜์ด์ง€์˜ ๊ฒฝ์šฐ BeautifulSoup ํŒจํ‚ค์ง€๋งŒ์„ ์ด์šฉํ•œ๋‹ค๋ฉด ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์—†์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

 

์›น ์‚ฌ์ดํŠธ๋Š” ํฌ๊ฒŒ ์ •์  ์›น์‚ฌ์ดํŠธ์™€ ๋™์  ์›น์‚ฌ์ดํŠธ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

์›น ํŽ˜์ด์ง€์˜ ์ข…๋ฅ˜

  • ์ •์  ์›น ์‚ฌ์ดํŠธ : HTML ๋‚ด์šฉ์ด ๊ณ ์ •
  • ๋™์  ์›น ์‚ฌ์ดํŠธ : HTML ๋‚ด์šฉ์ด ๋™์ ์œผ๋กœ ๋ณ€ํ•จ

์ •์  ์›น ์‚ฌ์ดํŠธ์˜ ๊ฒฝ์šฐ ๋™๊ธฐ์ ์œผ๋กœ ๋žœ๋”๋ง→๋ฐ์ดํ„ฐ๋กœ๋”ฉ→์‘๋‹ต์ด ์ง„ํ–‰๋˜์ง€๋งŒ,

๋™์  ์›น ์‚ฌ์ดํŠธ์˜ ๊ฒฝ์šฐ ๋น„๋™๊ธฐ์ ์ธ (๋žœ๋”๋ง→), (๋ฐ์ดํ„ฐ๋กœ๋”ฉ→)์ด ์ผ์–ด๋‚œ๋‹ค. ๋žœ๋”๋ง์ด ์™„๋ฃŒ๋œ ํ›„์— ์‘๋‹ต์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๋•Œ์— ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ฑ„๋กœ ์›น ์‚ฌ์ดํŠธ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋•Œ, ๋ฐ์ดํ„ฐ ์Šคํฌ๋ž˜ํ•‘์„ ์ง„ํ–‰ํ•˜๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ์˜ ๋กœ๋”ฉ์€ ์•ˆ๋œ ์ƒํƒœ๋กœ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์—†์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค. ๋•Œ๋ฌธ์— Selenium ํŒจํ‚ค์ง€๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

 

 

728x90