๐Ÿ“•Week2 day3(์›น์Šคํฌ๋ž˜ํ•‘ ๊ธฐ์ดˆ)

๋ฐ•์ค€ํฌยท2023๋…„ 8์›” 30์ผ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

๋ชฉ๋ก ๋ณด๊ธฐ
10/28
post-thumbnail

์›น ๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™” - Selenium


๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™” ํ•˜๊ธฐ

selenium์€ Python์„ ์ด์šฉํ•ด์„œ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋™ํ™” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

Web Driver
์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์—ฐ๋™์„ ์œ„ํ•ด์„œ๋Š” WebDriver๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
WebDriver๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋™ํ™” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

์…€๋ ˆ๋‹ˆ์›€ ์‹œ์ž‘

#๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

๊ทธ ๋‹ค์Œ ๋ถˆ๋Ÿฌ์˜จ ๋ชจ๋“ˆ webdriver์—์„œ Chrome() ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("URL์ฃผ์†Œ") #์›ํ•˜๋Š” URL์ฃผ์†Œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํฌ๋กฌ ์ฐฝ์ด ๊ณ„์† ์ผœ์ ธ์žˆ๊ฒŒ ๋˜๋Š”๋ฐ with-as๊ตฌ๋ฌธ์œผ๋กœ ๋ช…๋ น์ด ๋๋‚˜๋ฉด driver์„ ์ข…๋ฃŒํ•˜๋„๋ก ๋ช…๋ นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
    driver.get("http://www.example.com")
    print(driver.page_source())\
  • Driver์—์„œ ํŠน์ • ์š”์†Œ ์ถ”์ถœํ•˜๊ธฐ
    selenium์€ ๋ฐ›์•„์˜จ ์‘๋‹ต์œผ๋กœ๋ถ€ํ„ฐ ํŠน์ • ์š”์†Œ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ด๋ฏธ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ !

์‘๋‹ต์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” driver/์š”์†Œ์— ๋Œ€ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์†Œ ํ•˜๋‚˜ ์ฐพ๊ธฐ

.find_element(by, target)
by : ๋Œ€์ƒ์„ ์ฐพ๋Š” ๊ธฐ์ค€ : ID, TAG_NAME, CLASS_NAME, ...
target : ๋Œ€์ƒ์˜ ์†์„ฑ
์š”์†Œ ์—ฌ๋Ÿฌ๊ฐœ ์ฐพ๊ธฐ

.find_elements(by, target)
by : ๋Œ€์ƒ์„ ์ฐพ๋Š” ๊ธฐ์ค€ : ID, TAG_NAME, CLASS_NAME, ...
target : ๋Œ€์ƒ์˜ ์†์„ฑ

with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
    driver.get("http://www.example.com")
    print(driver.find_elements(By.TAG_NAME, "p").text)

Wait and Call


Implicit / Explicit Wait

Selenium์€ ๋™์  ์›น ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ์ง€์›์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ช…์‹œ์  ๊ธฐ๋‹ค๋ฆผ(Explicit Wait) ๊ณผ ์•”๋ฌต์  ๊ธฐ๋‹ค๋ฆผ(Implicit Wait) ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Explicit Wait: ๋‹ค ๋กœ๋”ฉ์ด ๋  ๋•Œ๊นŒ์ง€ ์ง€์ •ํ•œ ์‹œ๊ฐ„ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆผ (e.g. ๋‹ค ๋กœ๋”ฉ์ด ๋  ๋•Œ๊นŒ์ง€ 5์ดˆ๋™์•ˆ ๊ธฐ๋‹ค๋ ค!)
Implicit Wait: ํŠน์ • ์š”์†Œ์— ๋Œ€ํ•œ ์ œ์•ฝ์„ ํ†ตํ•œ ๊ธฐ๋‹ค๋ฆผ (e.g. ์ด ํƒœ๊ทธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค!)

๐Ÿ’กXPath?

  • XPath๋Š” XML, HTML ๋ฌธ์„œ ๋“ฑ์˜ ์š”์†Œ์˜ ์œ„์น˜๋ฅผ ๊ฒฝ๋กœ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
    driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
    driver.implicitly_wait(10)
    print(driver.find_element(By.XPATH,'//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[3]/div/a/div[2]/p[1]').text)

find_element๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๋ ค๋Š” ๋ฐ์ดํ„ฐ์˜ XPATH๋ฅผ ์ธ์ž๋กœ ๋„ฃ์œผ๋ฉด ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ๊ฐ€์ ธ์˜ค๋ ค๋Š” ์›น ํŽ˜์ด์ง€๊ฐ€ ๋™์  ํŽ˜์ด์ง€์ด๊ธฐ ๋•Œ๋ฌธ์— 10์ดˆ๋™์•ˆ Implicit Wait์„ ์ง„ํ–‰ํ•˜๋„๋ก ํ•ด์„œ ์Šคํฌ๋ž˜ํ•‘์ด ์ž˜ ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

from selenium.webdriver.support import expected_conditions as EC

with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
    driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
    element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[3]/div/a/div[2]/p[1]')))
    print(element.text)

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ EC.presence_of_element_located()๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋™์  ์›นํŽ˜์ด์ง€ ์Šคํฌ๋ž˜ํ•‘์ด ์ด๋ฃจ์–ด ์ง€๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ


๐Ÿ’กSelenium์„ ์ด์šฉํ•ด์„œ ๋งˆ์šฐ์Šค Event๋ฅผ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Mouse Event

์›น ํŽ˜์ด์ง€์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ๋“ค์„ Event๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์šฐ์Šค๋กœ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ์ด๋ฒคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋งˆ์šฐ์Šค ์›€์ง์ด๊ธฐ(move)
๋งˆ์šฐ์Šค ๋ˆ„๋ฅด๊ธฐ(press down)
๋งˆ์šฐ์Šค ๋–ผ๊ธฐ(press up)
...
์ €ํฌ๋Š” ๋ฒ„ํŠผ์„ ์ฐพ์€ ํ›„ ์ด๋ฅผ ํด๋ฆญํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
๋งˆ์šฐ์Šค ์ž…๋ ฅ์€ ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

์ž…๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ๋Œ€์ƒ ์š”์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. (find_element() ์ด์šฉ)
์ž…๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ๋‚ด์šฉ์„ click์„ ํ†ตํ•ด ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
.perform()์„ ํ†ตํ•ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

button = driver.find_element(By.XPATH, '//*[@id="main-app-gnb-header"]/div/div/div[1]/div/div[2]/div/div/div[1]/span[1]/a[1]')
ActionChains(driver).click(button).perform

driver๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋งˆ์šฐ์Šค๋ฅผ ํด๋ฆญํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ


๐Ÿ’กSelenium์„ ์ด์šฉํ•ด์„œ ํ‚ค๋ณด๋“œ Event๋ฅผ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Keyboard Event

์›น ํŽ˜์ด์ง€์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ๋“ค์„ Event๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค๋ณด๋“œ๋กœ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ์ด๋ฒคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ‚ค๋ณด๋“œ ๋ˆ„๋ฅด๊ธฐ(press down)
ํ‚ค๋ณด๋“œ ๋–ผ๊ธฐ(press up)
...
์ €ํฌ๋Š” ์ž…๋ ฅ์ฐฝ(input ํƒœ๊ทธ์˜ form)์— ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์€ ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

์ž…๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ๋Œ€์ƒ ์š”์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. (find_element() ์ด์šฉ)
์ž…๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ๋‚ด์šฉ์„ send_keys_to_element๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
.perform()์„ ํ†ตํ•ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋Š” id๊ฐ€ textInput์ธ ์š”์†Œ์— "abc"๋ฅผ ์ž…๋ ฅํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

text_input = driver.find_element(By.ID, "textInput")
ActionChains(driver).send_keys_to_element(text_input, "abc").perform()

๐Ÿ’กselenium์„ ์ด์šฉํ•˜์—ฌ ๋™์ ์ธ ์›นํŽ˜์ด์ง€๋ฅผ ์Šคํฌ๋ž˜ํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๋‹ค.

profile
๊ฒŒ์„๋ €๋˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณต๋ถ€

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