(2) ๐Ÿƒโ€โ™‚๏ธ ํฌ๋กค๋ง ์‹ค์ œ๋กœ ํ•ด๋ณด๊ธฐ ( ๋„ค์ด๋ฒ„์ฃผ์‹์ฐจํŠธ selenium , pandas , plotly )

0
post-thumbnail

์•ˆ๋…•ํ•˜์„ธ์š” ๋ฏผ ์ž…๋‹ˆ๋‹ค !! ๐Ÿ™‚ ์–ด์ œ ํฌ๋กค๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด์„œ ๋ธ”๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜๋Š”๋ฐ์š”. - ํฌ๋กค๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ํด๋ฆญ -

์ฒซ ๋ฒˆ์งธ ํฌ๋กค๋ง ์‚ฌ์šฉ์˜ˆ์ œ๋กœ ์Šคํฌ์ธ  ๋ฐฐํŒ… ์‚ฌ์ดํŠธ์˜ ๋‚ด์—ญ์„ ๊ฐ€์ ธ์™€์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„์— csv ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์˜ค๋Š˜์€ ํฌ๋กค๋ง์„ ์ด์šฉํ•ด์„œ ํฌ๋กค๋ง์„ ์‹œ์ž‘ํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋„ค์ด๋ฒ„ ์ฃผ์‹์ฐจํŠธ , ๋‹ค์Œ ์ฃผ์‹์ฐจํŠธ ์— ๋Œ€ํ•ด์„œ ์ถœ๋ ฅํ•ด๋ณด๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿƒโ€โ™‚๏ธ๐Ÿƒโ€โ™‚๏ธ ๋”ฐ๋ผ์˜ค์‹œ์ฃ !!

๋ชฉ์ฐจ

1. ํฌ๋กค๋ง์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ์„ธํŒ…
2. ๋„ค์ด๋ฒ„ ์ฃผ์‹ ์ฐจํŠธ ํฌ๋กค๋ง
3. ๋Š๋‚€์  & ๊ฒฐ๋ก 

(1). ํฌ๋กค๋ง์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ์„ธํŒ…

ํฌ๋กค๋ง์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ๋ณธ์ ์ธ ์„ธํŒ…์ธ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ „์—๋Š” ํฌ๋กฌ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ง์ ‘ ๋‹ค์šด๋ฐ›์€ ํ›„ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ ํ•œ ์ดํ›„ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™”๋Š”๋ฐ์š”.
( โžก๏ธ ํฌ๋กฌ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ด์šฉํ•˜๋ฉด ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์š”์ฆ˜์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฅผ ํ†ตํ•˜์—ฌ ํฌ๋กฌ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ๊นŒ์ง€ ์•Œ๊ณ  ๊ณ„์‹ ๋‹ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋Œ์–ด๋‹ค์“ฐ๋Š” ๊ฑธ ๋ฐ”๋กœ ์ ์šฉ์‹œ์ผœ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค .

โœ“ (1-1) ์„ธํŒ…

์ด์ „ ์‚ฌ์ง„์— ์กด์žฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ธํŒ…์ด ํ•„์š”ํ•œ๋ฐ์š”. ํ•˜๋‚˜์”ฉ ์ฐจ๋ก€์ฐจ๋ก€ ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง€๊ฒ ์Šต๋‹ˆ๋‹ค ! .

์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šฐ์‹œ๋‹ค๋ฉด ์ผ๋‹จ ๋ณต์‚ฌ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค !! .

import time
import pandas as pd
# selenium and ChormeDriver
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

# options
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(options=options)

ํฌ๋กค๋ง์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ selenium ๊ธฐ๋ณธ ์„ธํŒ…
import time โžก๏ธ time.sleep('์›ํ•˜๋Š” ์‹œ๊ฐ„')์œผ๋กœ ์‹œ๊ฐ„์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
import pandas as pd โžก๏ธ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”๋ฅผ ์ด์šฉํ•˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํ”„๋ ˆ์ž„์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค
#selenium
from selenium import webdriver โžก๏ธ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‹๋ณ„ํ•œ๋‹ค
from selenium.webdriver.common.by import By โžก๏ธ ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ์š”์†Œ๋ฅผ ์‹๋ณ„ํ•œ๋‹ค
from webdriver_manager.chrome import ChromeDriverManager โžก๏ธ
์›น ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์„ค์น˜์—†์ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค .
#options
options = webdriver.ChromeOptions() โžก๏ธ Option ์„ค์ •ํ•œ๋‹ค
options.add_experimental_option("excludeSwitches", ["enable-logging"]) โžก๏ธ ๋กœ๊น…์„ ์„ค์ •(๊ธฐ๋ก์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก )
driver = webdriver.Chrome(options=options)โžก๏ธ webdriver๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค .

์ด๋ ‡๊ฒŒ ์„ค์ •์„ ๋งˆ์น˜์…จ๋‹ค๋ฉด ์ด์ œ ํฌ๋กค๋ง์„ ํ•  ์ค€๋น„๋ฅผ ๋ชจ๋‘ ๋งˆ์น˜์…จ์Šต๋‹ˆ๋‹ค .
์ด์ œ ๋„ค์ดํŠธ์˜ ์ฃผ์‹์ฐจํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค .

(2) ๋„ค์ด๋ฒ„ ์ฃผ์‹์ฐจํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ.

๋„ค์ด๋ฒ„ ์ฃผ์‹์ฐจํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ ์ €ํฌ๊ฐ€ ํ•ด์•ผํ•˜๋Š” ๊ณผ์ •์ด ์žˆ๋Š”๋ฐ์š”.
์„ธ๋ถ€์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์ด ์กด์žฌํ•˜๊ฒ ์ง€๋งŒ ๊ธฐ๋ณธ์ ์ธ ํ‹€์€

  1. ๋‚ด๊ฐ€ ์ฐพ๊ณ ์žํ•˜๋Š” ํŽ˜์ด์ง€ ์—ด๊ธฐ
  2. ๋‚ด๊ฐ€ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์€ ์š”์†Œ๋ฅผ ์ฐพ๊ธฐ
  3. ๋ฐ˜๋ณต๋ฌธ ๋Œ๋ฆฌ๊ธฐ(csvํŒŒ์ผ๊ณผ , jsonํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ)
  4. csv,jsonํŒŒ์ผ ์ €์žฅ์‹œํ‚ค๊ธฐ.
    ์ด๋ ‡๊ฒŒ ์กด์žฌํ•˜๊ณ  matplotlib , plotly ๋“ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ณผ์ •๋„ ์กด์žฌํ•œ๋‹ต๋‹ˆ๋‹ค. ์ด์ œ ์„ค๋ช…์„ ๋ชจ๋‘ ๋งˆ์ณค์œผ๋‹ˆ ๋ฐ”๋กœ ์‹ค์Šต์„ ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค .

โœ“ (2-1) ๋‚ด๊ฐ€ ์ฐพ๊ณ ์‹ถ์€ ํŽ˜์ด์ง€ ์—ด๊ธฐ

๋“ค์–ด๊ฐ€๋Š” ๋ฐฉ๋ฒ•์€ ( ๋„ค์ด๋ฒ„ -> ์ฃผ์‹ -> ๊ตญ๋‚ด์ฆ์‹œ -> ํˆฌ์ž์ž๋ณ„ ๋งค๋„ํ˜„ํ™ฉ์œผ๋กœ ์ง„ํ–‰ํ•˜์˜€๋Š”๋ฐ์š” . )
์ฐพ์•„์˜ค๊ธฐ ์–ด๋ ค์šฐ์‹ค ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋งํฌ ๋‚จ๊ฒจ๋“œ๋ฆฝ๋‹ˆ๋‹ค โžก๏ธ ๊ธ€์“ด์ด์˜ ๋„์›€์˜ ์†๊ธธ

์ด๋Ÿฐ ์ฐฝ์ด ๋‚˜์˜ค์‹œ๋ฉด ์ด์ œ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๊ฐ€์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค !

โœ“ (2-2) ๋‚ด๊ฐ€ ์ฐพ๊ณ ์‹ถ์€ ๋ถ€๋ถ„ ์ฐพ๊ธฐ

์ด์ œ ์ œ๊ฐ€ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์„ ์ •ํ•œ ๋‹ค์Œ์— class , xpath , selector ์ค‘์—
๋ญ๋กœ ๊ฐ€์ ธ์˜ฌ๊ฒƒ์ธ์ง€ ์„ ํƒํ•ด์•ผํ•˜๋Š”๋ฐ ๋ณดํ†ต class ์™€ xpath๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ์— ์ €๋Š” xpath๋ฅผ ํ™•์ธํ•œํ›„์— ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค .

xpath ๊ฐ€์ ธ์˜ค๋Š”๋ฒ• โžก๏ธ

์ด์ œ ๋ชจ๋“  ์„ธํŒ…์„ ๋งˆ์ณค์œผ๋‹ˆ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๋Ÿฌ ๊ฐ€์‹œ์ฃ  ! .

์ฝ”๋“œ๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…๋“œ๋ฆฌ๋ฉด

1. driver.get์„ ์‚ฌ์šฉ -> ์›ํ•˜๋Š” ํŽ˜์ด์ง€ ์ ‘์†
.
2. driver.find_element(By.XPATH , 'xpath์ฃผ์†Œ') -> ๋‚ด๊ฐ€ ์ฐพ๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์˜ ์š”์†Œ๋ฅผ ์ฐพ๊ธฐ
.
3. ๋ฐ˜๋ณต๋ฌธ ๋Œ๋ ค์„œ ์ฐพ์•„์˜ค๊ธฐ


์•ž์—์„œ ๋ง์”€๋“œ๋ฆฐ ๊ณผ์ •๊ณผ ๋™์ผํ•˜์ฃ  ๐Ÿ˜Š ?

๐Ÿค” ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ๋งŒ ๋ง์”€๋“œ๋ฆฌ๋ฉด ๋””ํ…Œ์ผ ์ ์ธ ๋ถ€๋ถ„์ด ๋งŽ์ด ๋ชจ์ž๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์ธ ์„ค๋ช…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

  1. ๊ทœ์น™์„ฑ์ฐพ๊ธฐ -> tr ํƒœ๊ทธ์•ˆ์— tdํƒœ๊ทธ๊ฐ€ ์กด์žฌํ•  ๊ฒƒ ์ด๋ผ๋Š” ๊ฒƒ์„ ์œ ์ถ”


    # ํ•˜๋‚˜์”ฉ ๋ฆฌ์ŠคํŠธ
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[12]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[16]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[4]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[5]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[6]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[7]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[20]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[28]


# ๋ฆฌ์ŠคํŠธ ๋‚ด์˜ ๊ทœ์น™์„ฑ
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[4]/td[1]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[4]/td[2]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[4]/td[3]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[4]/td[4]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[4]/td[5]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[4]/td[6]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[4]/td[7]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[4]/td[8]
    # //*[@id="content"]/div[2]/table[1]/tbody/tr[4]/td[9]

๊ทœ์น™์„ฑ์„ ์ฐพ์•„๋‚ธ ๊ฒฐ๊ณผ๋ฅผ ์ฃผ์‹์ฐจํŠธ์˜ trํƒœ๊ทธ๊ฐ€

  1. #4~8 , 12~16 , 20~24 , 28~32 ์ด๋Ÿฐ ์ˆœ์„œ๋Œ€๋กœ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ
  2. #์•ˆ์—๋Š” ๋ฌด์ˆ˜ํ•œ tdํƒœ๊ทธ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ ๋‘ ๊ฐ€์ง€ ์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ’โ€โ™‚๏ธ ์ด๋ ‡๊ฒŒ ์ฒ˜์Œ์—๋Š” xpath๋ฅผ ๋งŽ์ด ๊ฐ€์ ธ์™€์„œ ๊ทœ์น™์„ฑ์„ ์œ ์ถ”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ˆ™๋‹ฌ๋˜๊ธฐ ์ „์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋– ํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์กŒ์„ ์ง€ ์•Œ๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์ด์ฃ  !

์ด์ œ ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ csvํŒŒ์ผ๋กœ ์ €์žฅํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

(2-3) ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ csvํŒŒ์ผ ์ €์žฅ

์ง€๊ธˆ ๋ณด์‹œ๋ฉด ์‚ฌ์ง„์— ๊ฐ€์ ธ์˜ฌ ์š”์†Œ๋“ค์ด 9๊ฐ€์ง€์ธ๊ฒƒ์„ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์ฃ  ??
์ด ๋ถ€๋ถ„์„ ๊ธฐ์–ตํ•˜์‹œ๋ฉด์„œ ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค !

โžก๏ธ ์ง‘์ค‘ํ•ด์•ผํ•  ๋ถ€๋ถ„
9๊ฐœ์˜ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ฐ›๊ธฐ์œ„ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•ด์คฌ์Šต๋‹ˆ๋‹ค .

 data = [result[i:i+9] for i in range(0, len(result), 9)]

(3) ๊ฒฐ๊ณผ & ๋Š๋‚€์ 

๐Ÿ’โ€โ™‚๏ธ ๊ฒฐ๊ณผ โฌ‡๏ธ

ํฌ๋กค๋ง์„ selenium์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋Š๋‚€์ ์€ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๋Š” ์ ์ด์˜€์Šต๋‹ˆ๋‹ค.
์กฐ๊ธˆ๋งŒ ๊ตฌ์กฐ๋ฅผ ์ตํžˆ๋‹ค๋ณด๋ฉด ๊ฐ€์ ธ์˜ค๋Š” ์‹œ๊ฐ„์ด ๋งค์šฐ ๋นจ๋ผ์ง€๊ณ  ์›ํ•˜๋Š” ๋ถ€๋ถ„์„ ํ™•์‹คํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ•์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค .
ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ๊ฐ€์ ธ์˜จ ๋‚ด์šฉ๋“ค์€ ๋ณ€ํ•˜๋Š” ์ฃผ์‹์ด ์•„๋‹Œ ๊ธฐ์กด๊นŒ์ง€์˜ ๋‚ด์šฉ์ด์˜€์œผ๋ฏ€๋กœ
request + beautifulsoup์„ ์ด์šฉํ•˜๋Š”๊ฒŒ ๋” ์ข‹๋‹ค๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค .

์ด ๋ธ”๋กœ๊ทธ์—์„œ๋Š” Selenium๊ณผ beautifulsoup์— ๋Œ€ํ•ด์„œ๋Š” ๊นŠ๊ฒŒ ๋‹ค๋ฃจ์ง€๋Š” ์•Š์ง€๋งŒ
selenium -> ๋™์  , ๋Š๋ฆผ
beautifulsoup -> ์ •์  , ๋น ๋ฆ„

์ด ์ •๋„๋งŒ ์•Œ๊ณ ๊ฐ€์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค . ์ง€๋‚œ ์ฃผ์‹ ๋‚ด์šฉ์€ ์ •์ (๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ)์ด๊ธฐ ๋•Œ๋ฌธ์— beautifulsoup์„ ์ด์šฉํ•ด์„œ ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒŒ ์ข‹๋‹ค๋Š” ๋ง์”€์ž…๋‹ˆ๋‹ค . ์˜ค๋Š˜๋„ ํŒŒ์ดํŒ… ์ž…๋‹ˆ๋‹ค !!

profile
ํ•ญ์ƒ ์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€