Python - Selenium

2026. 4. 6. 08:35ยท๐Ÿ Python

Selenium

 

 

โœ… Selenium์ด๋ž€?


์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ๋žŒ์ด ์ง์ ‘ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž๋™์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ

(BeautifulSoup๋Š” html์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.)

 

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

from selenium import webdriver
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options

KEYWORD = "buy domain"

options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
browser: WebDriver = webdriver.Chrome(options=options)

browser.get("https://google.com")

search_bar = WebDriverWait(browser, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, "gLFyf"))
)
search_bar.send_keys(KEYWORD)
search_bar.send_keys(Keys.ENTER)

search_results = WebDriverWait(browser, 10).until(
    EC.presence_of_all_elements_located((By.CLASS_NAME, "MjjYud"))
)

for index, search_result in enumerate(search_results):
    if search_result.is_displayed() and search_result.size["height"] > 0:
        search_result.screenshot(f"screenshots/{KEYWORD}x{index}.png")

browser.quit()

๊ตฌ๊ธ€ ์‚ฌ์ดํŠธ ์—ด๊ณ  ๊ฒ€์ƒ‰์ฐฝ์„ ์ฐพ์•„ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ ์€ ํ›„ ์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด๊ณ , ์ด๋™ํ•œ ํŽ˜์ด์ง€์—์„œ class๋กœ element ์ฐพ๋Š” ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ, ์ฐพ์„ ๋•Œ๊นŒ์ง€ 10์ดˆ๊ฐ„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๋งŒ์•ฝ ์ผ์ฐ ์ฐพ์•˜๋‹ค๋ฉด 10์ดˆ๋ฅผ ์ „๋ถ€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฐ”๋กœ ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ ํ™”๋ฉด์— ๋ณด์ด๊ณ  height๊ฐ€ 0์ด ์•„๋‹Œ ๋ชจ๋“  element๋“ค์„ ์ฐพ์•„ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ๋Š”๋‹ค.

 

https://selenium-python.readthedocs.io/waits.html#explicit-waits

 

 

์œ„์˜ options๋Š” ์‚ฌ๋žŒ ์ธ์ฆ ํŽ˜์ด์ง€๊ฐ€ ๋œจ์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•.

 

browser.quit() vs browser.close()

quit()์€ ๋ธŒ๋ผ์šฐ์ € ์ „์ฒด + ์„ธ์…˜์ข…๋ฃŒ

close()๋Š” ํ˜„์žฌ ํƒญ๋งŒ ๋‹ซ๋Š”๋‹ค.

 

 

โœ… Selenium์œผ๋กœ ํŒŒ์ด์ฌ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ธ์ž๋ฅผ ๋ณด๋‚ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.


execute_script()

browser.execute_script(
    """
    alert(arguments[0])
""",
    "hello!!",
)

 

execute_script(script, *args)

 

Scrapping ํ•  ๋•Œ ํ•„์š”์—†๋Š” element ์ง€์šฐ๊ธฐ

browser.execute_script(
    """
    const shitty = arguments[0];
    shitty.parentElement.removeChild(shitty)
    """,
    shitty_element,
)

 

 

โœ… ์Šคํฌ๋กค ํ•  ์ˆ˜ ์žˆ๋Š” ์ „์ฒด ๋†’์ด ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•


document.body.scrollHeight

์Šคํฌ๋กค ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด๊ฐ€ ๋ช‡ ํ”ฝ์…€์ธ์ง€ ์•Œ๋ ค์ค€๋‹ค.

์ด ๋†’์ด๋ฅผ ๋ธŒ๋ผ์šฐ์ €์˜ ์‚ฌ์ด์ฆˆ๋กœ ๋‚˜๋ˆ„๋ฉด ์Šคํฌ๋กค์„ ๋ช‡ ๋ฒˆ ํ•ด์•ผ ํ• ์ง€ ๋‚˜์˜จ๋‹ค.

JavaScript์—์„œ Python์œผ๋กœ ๊ฐ’์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•

for size in sizes:
    browser.set_window_size(size, 949)
    browser.execute_script("return document.body.scrollHeight")
    time.sleep(5)

script๋‚ด์— return์„ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

์Šคํฌ๋กคํ•˜๊ธฐ

import time
from math import ceil
from selenium import webdriver
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

BROWSER_HEIGHT = 949

browser: WebDriver = webdriver.Chrome()

browser.get("https://nomadcoders.co")

browser.maximize_window()

time.sleep(6)
ActionChains(browser).send_keys(Keys.ESCAPE).perform()


sizes = [480, 960, 1366, 1920]

# print(browser.get_window_size())

for size in sizes:
    browser.set_window_size(size, BROWSER_HEIGHT)
    browser.execute_script("window.scrollTo(0, 0)")
    time.sleep(3)
    scroll_size = browser.execute_script("return document.body.scrollHeight")
    total_sections = ceil(scroll_size / BROWSER_HEIGHT)

    for section in range(total_sections):
        browser.execute_script(f"window.scrollTo(0, {(section + 1) * BROWSER_HEIGHT})")
        browser.save_screenshot(f"screenshots/{size}x{section + 1}.png")
        time.sleep(2)
input("pause")

 

 

โœ… Action Chains


ActionChains = "์‚ฌ์šฉ์ž์˜ ๋ณตํ•ฉ ํ–‰๋™(ํ‚ค๋ณด๋“œ + ๋งˆ์šฐ์Šค)์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” ๋„๊ตฌ"

(์‚ฌ๋žŒ์ฒ˜๋Ÿผ ํ–‰๋™์„ ํ‰๋‚ด ๋‚ด๊ธฐ ์œ„ํ•œ Selenium ๋„๊ตฌ)

Usage

for hashtag in hashtags:
    ActionChains(browser).key_down(Keys.COMMAND).click(hashtag).perform()

 

 

โœ… Window handles


์—ด๋ ค ์žˆ๋Š” ๋ชจ๋“  ์ฐฝ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

for window in browser.window_handles:
    browser.switch_to.window(window)
    hashtag_name = browser.current_url.split("explore/search/keyword/?q=%23")[-1].strip(
        "/"
    )
    print(hashtag_name)
    time.sleep(1)

 

 

โœ… Xpath


class๋‚˜ name๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ๋„ element๋ฅผ ํŠน์ •ํ•˜๊ธฐ ํž˜๋“ค ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

XPath๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋”ธ๊น์œผ๋กœ ํ•ด๋‹น element๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

'๐Ÿ Python' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Python - venv ๊ฐ€์ƒ ํ™˜๊ฒฝ ์„ธํŒ…(macOS), pyenv  (0) 2026.04.06
'๐Ÿ Python' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Python - venv ๊ฐ€์ƒ ํ™˜๊ฒฝ ์„ธํŒ…(macOS), pyenv
j2yonghwa
j2yonghwa
Trying to be a fullstack developer ๐Ÿš€
  • j2yonghwa
    j2yonghwa
    j2yonghwa
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (156)
      • โฐ Daily WakaTime (1)
      • ๐Ÿ–๏ธ ๋…ธ๋งˆ๋“œ์ฝ”๋” (2)
      • ๐Ÿบ Dev Setup (3)
      • ๐Ÿ”ญ Tech Info (1)
      • ๐Ÿšซ Error (1)
      • ๐Ÿ“‚ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (23)
      • ♣๏ธ Next.js 14 (10)
      • ♠๏ธ Next.js 12 (20)
      • ๐Ÿ›ธ React Native (12)
      • ๐Ÿฆ‹ TypeScript (1)
      • ๐Ÿ Python (2)
      • ๐ŸŒŠ TailwindCSS (4)
      • ๐Ÿงฉ SQL (25)
      • ๐Ÿ’Ž Prisma (5)
      • ๐ŸŒฑ MongoDB (4)
      • ๐ŸŽฏ Redis (1)
      • ๐Ÿงฌ GraphQL (2)
      • ๐Ÿ”ฅ Firebase (7)
      • ๐Ÿ’ธ Third-Party Services (2)
      • ๐Ÿ•ธ๏ธ Web (1)
      • ๐Ÿ† ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (23)
      • ๐Ÿ“™ ๋ชจ๋”ฅ๋‹ค (5)
      • ๐Ÿ“— ์ฝ”ํ…Œ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ -JS- (0)
      • ๐Ÿ“˜ ํด๋ฆฐ์ฝ”๋“œ (0)
      • ๐Ÿฏ ๊ฟ€ํŒ ๐Ÿ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • ๊นƒํ—™
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    next.js 14
    MySQL
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    Next.js
    mongoDB
    React Native
    dev setup
    SQL
    0๋ ˆ๋ฒจ
    ๋ชจ๋”ฅ๋‹ค
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ž…๋ฌธ
    Python
    react router
    API
    Firebase
    Prisma
    tailwindcss
    next.js 12
    PostgreSQL
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
j2yonghwa
Python - Selenium
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”