์๋ ํ์ธ์ ๋ฏผ ์ ๋๋ค !! ๐ ์ด์ ํฌ๋กค๋ง์ ์ฌ์ฉํ๋ ์ด์ ์ ๋ํด์ ๋ธ๋ก๊ทธ๋ฅผ ์์ฑํด๋ณด์๋๋ฐ์. - ํฌ๋กค๋ง์ ์ฌ์ฉํ๋ ์ด์ ํด๋ฆญ -
์ฒซ ๋ฒ์งธ ํฌ๋กค๋ง ์ฌ์ฉ์์ ๋ก ์คํฌ์ธ ๋ฐฐํ ์ฌ์ดํธ์ ๋ด์ญ์ ๊ฐ์ ธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ํ์ csv ํ์ผ๋ก ์ ์ฅํ๋ ๊ณผ์ ์ ๊ฑฐ์ณค์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ค๋์ ํฌ๋กค๋ง์ ์ด์ฉํด์ ํฌ๋กค๋ง์ ์์ํ ๋ ๊ฐ์ฅ ๋จผ์ ์ฌ์ฉํ๋ค๋ ๋ค์ด๋ฒ ์ฃผ์์ฐจํธ , ๋ค์ ์ฃผ์์ฐจํธ ์ ๋ํด์ ์ถ๋ ฅํด๋ณด๋ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ์ต๋๋ค.
1. ํฌ๋กค๋ง์ ์ฌ์ฉํ๊ธฐ ์ํ ๊ธฐ๋ณธ ์ธํ
2. ๋ค์ด๋ฒ ์ฃผ์ ์ฐจํธ ํฌ๋กค๋ง
3. ๋๋์ & ๊ฒฐ๋ก
ํฌ๋กค๋ง์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ธฐ๋ณธ์ ์ธ ์ธํ
์ธ ํ์ํฉ๋๋ค. ์์ ์๋ ํฌ๋กฌ ๋๋ผ์ด๋ฒ๋ฅผ ์ง์ ๋ค์ด๋ฐ์ ํ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ ํ ์ดํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์๋๋ฐ์.
( โก๏ธ ํฌ๋กฌ ๋๋ผ์ด๋ฒ๋ฅผ ์ด์ฉํ๋ฉด ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ค๋ฃฐ ์ ์์ต๋๋ค.)
์์ฆ์๋ ๋ผ์ด๋ธ๋ฌ๋ฅผ ํตํ์ฌ ํฌ๋กฌ ๋๋ผ์ด๋ฒ๋ฅผ ์๋์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ต๋๋ค.
์ฌ๊ธฐ๊น์ง ์๊ณ ๊ณ์ ๋ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ด๋ค์ฐ๋ ๊ฑธ ๋ฐ๋ก ์ ์ฉ์์ผ๋ณด๊ฒ ์ต๋๋ค .
์ด์ ์ฌ์ง์ ์กด์ฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธํ ์ด ํ์ํ๋ฐ์. ํ๋์ฉ ์ฐจ๋ก์ฐจ๋ก ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ง๊ฒ ์ต๋๋ค ! .
์ดํดํ๊ธฐ ์ด๋ ค์ฐ์๋ค๋ฉด ์ผ๋จ ๋ณต์ฌ๋ถ์ฌ๋ฃ๊ธฐ๋ฅผ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค !! .
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๋ฅผ ์ต์ข ์ ์ผ๋ก ์ค์ ํ๋ค .
์ด๋ ๊ฒ ์ค์ ์ ๋ง์น์
จ๋ค๋ฉด ์ด์ ํฌ๋กค๋ง์ ํ ์ค๋น๋ฅผ ๋ชจ๋ ๋ง์น์
จ์ต๋๋ค .
์ด์ ๋ค์ดํธ์ ์ฃผ์์ฐจํธ๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํ๊ฒ ์ต๋๋ค .
๋ค์ด๋ฒ ์ฃผ์์ฐจํธ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ ์ ํฌ๊ฐ ํด์ผํ๋ ๊ณผ์ ์ด ์๋๋ฐ์.
์ธ๋ถ์ ์ธ ๋ด์ฉ์ด ๋ง์ด ์กด์ฌํ๊ฒ ์ง๋ง ๊ธฐ๋ณธ์ ์ธ ํ์
๋ค์ด๊ฐ๋ ๋ฐฉ๋ฒ์ ( ๋ค์ด๋ฒ -> ์ฃผ์ -> ๊ตญ๋ด์ฆ์ -> ํฌ์์๋ณ ๋งค๋ํํฉ์ผ๋ก ์งํํ์๋๋ฐ์ . )
์ฐพ์์ค๊ธฐ ์ด๋ ค์ฐ์ค ์ ์์ผ๋ ๋งํฌ ๋จ๊ฒจ๋๋ฆฝ๋๋ค โก๏ธ ๊ธ์ด์ด์ ๋์์ ์๊ธธ
์ด๋ฐ ์ฐฝ์ด ๋์ค์๋ฉด ์ด์ ๋ค์ ๋จ๊ณ๋ก ๊ฐ์๋ฉด ๋ฉ๋๋ค !
์ด์ ์ ๊ฐ ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋ถ๋ถ์ ์ ํ ๋ค์์ class , xpath , selector ์ค์
๋ญ๋ก ๊ฐ์ ธ์ฌ๊ฒ์ธ์ง ์ ํํด์ผํ๋๋ฐ ๋ณดํต class ์ xpath๋ฅผ ๋ง์ด ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด๋ฒ์ ์ ๋ xpath๋ฅผ ํ์ธํํ์ ๊ฐ์ ธ์์ต๋๋ค .
์ด์ ๋ชจ๋ ์ธํ
์ ๋ง์ณค์ผ๋ ์ฝ๋๋ฅผ ํ์ธํ๋ฌ ๊ฐ์์ฃ ! .
์ฝ๋๋ฅผ ๊ฐ๋ตํ๊ฒ ์ค๋ช ๋๋ฆฌ๋ฉด
1. driver.get์ ์ฌ์ฉ -> ์ํ๋ ํ์ด์ง ์ ์
.
2. driver.find_element(By.XPATH , 'xpath์ฃผ์') -> ๋ด๊ฐ ์ฐพ๊ณ ์ถ์ ๋ถ๋ถ์ ์์๋ฅผ ์ฐพ๊ธฐ
.
3. ๋ฐ๋ณต๋ฌธ ๋๋ ค์ ์ฐพ์์ค๊ธฐ
์์์ ๋ง์๋๋ฆฐ ๊ณผ์ ๊ณผ ๋์ผํ์ฃ ๐ ?
๐ค ํ์ง๋ง ์ด๋ ๊ฒ๋ง ๋ง์๋๋ฆฌ๋ฉด ๋ํ ์ผ ์ ์ธ ๋ถ๋ถ์ด ๋ง์ด ๋ชจ์๋ฅด๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ์ค๋ช ์ด ํ์ํฉ๋๋ค
# ํ๋์ฉ ๋ฆฌ์คํธ
# //*[@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ํ๊ทธ๊ฐ
- #4~8 , 12~16 , 20~24 , 28~32 ์ด๋ฐ ์์๋๋ก ์กด์ฌํ๋ค๋ ๊ฒ
- #์์๋ ๋ฌด์ํ tdํ๊ทธ๊ฐ ์กด์ฌํ๋ค๋ ๊ฒ ๋ ๊ฐ์ง ์์ต๋๋ค.
๐โโ๏ธ ์ด๋ ๊ฒ ์ฒ์์๋ xpath๋ฅผ ๋ง์ด ๊ฐ์ ธ์์ ๊ท์น์ฑ์ ์ ์ถํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ฌ๋๊ธฐ ์ ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ ํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ก์ ์ง ์๊ธฐ ํ๋ค๊ธฐ ๋๋ฌธ์ด์ฃ !
์ด์ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํ์ฌ csvํ์ผ๋ก ์ ์ฅํ์๋ฉด ๋ฉ๋๋ค!
์ง๊ธ ๋ณด์๋ฉด ์ฌ์ง์ ๊ฐ์ ธ์ฌ ์์๋ค์ด 9๊ฐ์ง์ธ๊ฒ์ ํ์ธํ์ค ์ ์์ฃ ??
์ด ๋ถ๋ถ์ ๊ธฐ์ตํ์๋ฉด์ ๋ค์์ผ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค !
โก๏ธ ์ง์คํด์ผํ ๋ถ๋ถ
9๊ฐ์ ์์๋ฅผ ํ๋์ฉ ๋ฐ๊ธฐ์ํด์ ๋ค์๊ณผ ๊ฐ์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด์คฌ์ต๋๋ค .
data = [result[i:i+9] for i in range(0, len(result), 9)]
ํฌ๋กค๋ง์ selenium์ผ๋ก ์งํํ๋ฉด์ ๋๋์ ์ ๋งค์ฐ ์ ์ฉํ๋ค๋ ์ ์ด์์ต๋๋ค.
์กฐ๊ธ๋ง ๊ตฌ์กฐ๋ฅผ ์ตํ๋ค๋ณด๋ฉด ๊ฐ์ ธ์ค๋ ์๊ฐ์ด ๋งค์ฐ ๋นจ๋ผ์ง๊ณ ์ํ๋ ๋ถ๋ถ์ ํ์คํ๊ฒ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ๊ฐ์ ์ด ์์ต๋๋ค .
ํ์ง๋ง ์ ๊ฐ ๊ฐ์ ธ์จ ๋ด์ฉ๋ค์ ๋ณํ๋ ์ฃผ์์ด ์๋ ๊ธฐ์กด๊น์ง์ ๋ด์ฉ์ด์์ผ๋ฏ๋ก
request + beautifulsoup์ ์ด์ฉํ๋๊ฒ ๋ ์ข๋ค๊ณ ๋๊ผ์ต๋๋ค .
์ด ๋ธ๋ก๊ทธ์์๋ Selenium๊ณผ beautifulsoup์ ๋ํด์๋ ๊น๊ฒ ๋ค๋ฃจ์ง๋ ์์ง๋ง
selenium -> ๋์ , ๋๋ฆผ
beautifulsoup -> ์ ์ , ๋น ๋ฆ
์ด ์ ๋๋ง ์๊ณ ๊ฐ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค . ์ง๋ ์ฃผ์ ๋ด์ฉ์ ์ ์ (๋ณํ์ง ์๋ ๋ฐ์ดํฐ)์ด๊ธฐ ๋๋ฌธ์ beautifulsoup์ ์ด์ฉํด์ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ์ค๋ ๊ฒ ์ข๋ค๋ ๋ง์์ ๋๋ค . ์ค๋๋ ํ์ดํ ์ ๋๋ค !!