ํฌ๋กค๋ง ํ๋ค๋ณด๋ฉด, ์ ์ ์ฝ๋ ์คํ์ ๋ฉ์ถฐ์ผ ํ ํ์๊ฐ ์๊ธด๋ค.
์ฃผ๋ ์์ธ์ 2๊ฐ์ง๊ฐ ์์ ๊ฒ ๊ฐ์๋ฐ,
์ฒซ๋ฒ์จฐ, ์ฝ๋์ ์คํ์๋๊ฐ ๋๋ฌด ๋นจ๋ผ, ์น ์๋ฒ์ ๋ฐ์ดํฐ๊ฐ ์ ์ก์ด ๋๋ ค์, ์ค์ ์ฌ์ดํธ๊ฐ ์ด๋ฆฌ์ง๋ ์์๋๋ฐ ์ฝ๋๊ฐ ๋จผ์ ์คํ๋๋ ๊ฒฝ์ฐ์ด๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ๊ฐ ์นํ๊ฒ ๋๋ค.
๋๋ฒ์งธ, ๋ฐ๋ณต์ ์ธ ํฌ๋กค๋ง ์์ ์ ์๋ฒ์ ๋ง์ ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ์ ๋ฐํ๋ ํฐ ์์ธ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก, ์์นซํ๋ฉด ์ฐ๋ฆฌ์ ip๊ฐ ์ ๊น ์ ์ง ๋นํ ์๋ ์๋ค. ํฌ๋กค๋ง ์์ ์ ์งํํ๋ค๊ฐ ๊ฐ์๊ธฐ ip๊ฐ ๋งํ๋ฒ๋ฆฌ๋ฉด, ์ด๋ณด๋ค ์ฌํ ๊ฒฝ์ฐ๋ ์์ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ์ ํ ์ฌ์ด๊ฐ์ ๋ฏธํ์ด ํ์ํ ๊ฒ์ด๋ค.
๋ณธ๊ฒฉ์ ์ผ๋ก time.sleep ๋ฌธ๊ณผ implicit wait ๋ฌธ์ ๋น๊ตํ๋ฉด, ํ์คํ time.sleep ๋ณด๋ค implicit wait ์ด ์ข์ ๊ฒ ๊ฐ๋ค. ์๋๋ค.
ํฌ์คํ ์ ํ๋ค๋ณด๋, 3๊ฐ์ง explicit wait ๊น์ง ์ ๋ถ ์ ๋๋ก ์๊ณ , ์ ์ ํ ์์ด์ ์ฐ๋ ๊ฒ์ด ์ฑ๋ฅ๋ฉด์ด๋ ์์ ๋๋ฉด์ด๋ ๊ฐ์ฅ best ์ธ ๊ฒ ๊ฐ๋ค.
์ ์ ์กฐ๊ฑด์ ip ๋ถํ์ ์๊ด์์ด, ๋น ๋ฅด๊ฒ ํฌ๋กค๋งํ ์ ์๋ ์ฌ์ดํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ค.
๋ง์ฝ์ ์ข ์ฌ์ดํธ๊ฐ ํค๋นํ๊ณ , ์ด๋ฌํ ์ฐจ๋จ ๋ฅ๋ ฅ์ด ์๋ค๋ฉด, time.sleep๋ฌธ์ ํตํด ๊ฐ์ ๋ก ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒ์ ๋ฉ์ถ ์ ์๋ค.
๊ทธ ์ ์ ๊ธฐ๋ณธ์ ์ธ time.sleep ๊ณผ implicit wait์ ์ฐจ์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
time.sleep
import time
time.sleep(2)
๊ทธ๋๋ ๋ฐ์ดํฐ ์์ด ๋ง์์ง๋ฉด, ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํด์ผ ๋ ๊ฒ๊ฐ๋ค.
- ์ผ๋ถ ip์์๋ ๋์ผํ ์๊ฐ์ ์ฌ๊ณ ์ ๊ทผํ๋ ๊ฒ๋ ๋ง์์๋ ์์ผ๋, ๊ฐ์ฅ best๋ random ํจ์๋ฅผ ์ฐ๋ ๊ฒ์ด๋ค
- random ํจ์๋ random ๋ชจ๋์ ๋ถ๋ฌ์์ผํ๋ค.
import time
import random
for url in url_list:
html = requests.get(url).text
time.sleep( random.uniform(1,4) ) # 1~4์ด ์ฌ์ด ๋๋คํ ์๊ฐ์ผ๋ก ์ฌ์ด์ค
# ๋๋
time.sleep(random.randint(1,4)) # 1~4์ด ์ฌ์ด ๋๋คํ ์๊ฐ์ผ๋ก ์ฌ์ด์ค
# ์
๋ ฅ ํ๋ผ๋ฏธํฐ a๋ถํฐ b๊น์ง์ ๋ฒ์ ์ค
# ์์์ ์ ์๋ฅผ ๋ฐํ (a <= N <= b)
# ๋๋
time.sleep(random.random()) # ๋ฐ ์ด๋ฆฐ ๊ตฌ๊ฐ(semi-open range)
# [0.0, 1.0) ๋ฌด์์ float ์ซ์๋ฅผ ๋ฐํ
implicit wait
๋ณดํต์ explicitly wait ๋ ๊ฐ์ด ์๋๋ฐ, ๋๋ ๊ทธ๊ฒ๋ณด๋ค ์ด๊ฒ ๋ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ค.
์ฐ์ , ๋ฌด์๋ณด๋ค ์ฝ๋๋ฅผ ์ ๋ ฅํ๊ฒ ๋๋ฉด, ์๋ฒ๋ ํต์ ํ๊ธฐ ๋๋ฌธ์, ์๊ฐ์ฐจ๋ผ๋ ๊ฒ์ด ์๊ธฐ๊ฒ ๋๋ค.
์๋ฅผ๋ค์ด, driver.get(‘https://naver.com’) ๋ช ๋ น์ด๋ฅผ ์ฐ๋ฉด,
์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ธฐ๋ ์ ์, ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ์๋ ๊ฒ์ ์ด๋ป๊ฒ ํ ๊น?
์ ๋ํ ๋์ ๋ค์ ๋ช ๋ น์ด๊ฐ ์คํ๋๋ฉด,
์ปดํจํฐ๋ ๋น์ฐํ ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ํด๊ฒฐ๋ฐฉ๋ฒ์ ํ๋ฉด์ด ๋ฐ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ธ๋ฐ, ์ ๋ ๋์์์ ๊ธฐ๋ค๋ฆฌ๋ ๋ฐฉ๋ฒ์ด 2๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
๋ฐ๋ก implicitly wait (์นํ์ด์ง ์ ์ฒด๊ฐ ๋์ด์ฌ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋ฐฉ๋ฒ) ์ explicitly wait (์นํ์ด์ง์ ์ผ๋ถ๋ถ์ด ๋ํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ) ์ด๋ค.
์ด๊ฒ ์ข์๊ฒ, ๋ฐ๋ก 10์ด๋ก ์ ๋ ฅ์ ํด๋๋ ํด๋น ์ฝ๋๊ฐ ์คํ๋๊ณ , ์ฌ์ดํธ๊ฐ ์ ์ํ๋๋ฐ 1์ด๋ง์ ์ ์ฐ๊ฒฐ์ด ๋์๋ค๋ฉด, 10์ด๊ฐ ์ง๋์ง ์์๋ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ ์ ์๊ณ , ์ ์์ด ์ํ ํ์ง ์๊ณ ์นํ์ด์ง๊ฐ ๋์ด์ค์ง ์์๋๋, ๊ธฐ๋ค๋ ค๋ณด๋ค๊ฐ 10์ด ์ดํ์ ๊ทธ๋ฅ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ํฐ ๋ฌธ์ ๊ฐ ํ๋ ์๋ค.
์ด๋ค ์ฌ์ดํธ๋ ์ ์์ ํ ๋ ํ๋ฒ์ ๋ชจ๋ ํ์ด์ง๊ฐ ๋ค ๋์ค๋ ๊ฒฝ์ฐ๋ ์๊ธด ํ์ง๋ง, ์ ์ฒด ํ์ด์ง์ ์ผ๋ถ๋ถ๋ง ๋จผ์ ๋์ค๊ฑฐ๋ ๋ฆ๊ฒ ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ์์ ์๋ ์๋ค.
์ด๊ฒ์ ๋์ DOM ์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ ์ด๋ ค์ด ์ฉ์ด์ด๊ธด ํ๋ค. ์ฌํํ๊ฒ, ํ๋ฒ์ ์นํ์ด์ง๊ฐ ํ์๋์ง ์๋ ๊ฒฝ์ฐ๋ ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ๋ผ.
์ด๋ฐ ๊ฒฝ์ฐ์ implicitly wait ๋ฅผ 8์ด๋ก ์ค์ ํ๊ณ , 1์ด๋ง์ ๋์ด์๋๋ฐ, ์นํ์ด์ง์ ์ผ๋ถ๋ถ์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ตฌํ๋์ด ์์ด, ๊ทธ ์ผ๋ถ๋ถ์ด ํ๋ฉด์์์ ๋ ๋๋ง ๋๋๋ผ ๋ฆ๊ฒ ํ์๋์๋ค๋ฉด ์ด๋ป๊ฒํ ๊น?
์๋ฅผ๋ค์ด, ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์ ์ ์ํ๋๋ฐ, ๋ด์ฉ์ ๋จ์ง๋ง, ๊ตฌ๊ธ ์๋์ผ์ค ๊ด๊ณ ์ ๊ฒฝ์ฐ, ๋ก๊ณ ๋ง ๋จ๋ ๊ฒฝ์ฐ์ด๋ค.
์ด๋ ๋ฌธ์ ๋, ์นํ์ด์ง ๋จ์์ ์ ๋ณด๊ฐ ๋์ด์์ผ๋, ์ผ๋ถ js์ ๋ด์ฉ์ด ๋ ๋๋ง ๋๊ธฐ ์ ์ ๊ทธ ๋ค์ ๋ช ๋ น์ด๊ฐ ์๋์ด ๋๋ ๊ฒ์ด๋ค.
์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ๋ง๊ธฐ์ํด, explicitly wait ๋ฅผ ์ฌ์ฉํ๋ค. ๋ฐ๋ก ๋ด๊ฐ ์ฐพ๊ณ ์ ํ๋, ํฌ๋กค๋งํ๊ณ ์ ํ๋ ๋ถ๋ถ์ด ํ์๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ์๋ฌดํํด๋๋ ๊ฒ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก import ํด์ผํ๋ ๋ชจ๋์ด ๋ง์ผ๋, ์ฐธ๊ณ ํ์.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome('chromedriver.exe')
driver.get("https://naver.com")
element = WebDriverWait(driver, 8).until( EC.presence_of_element_located(By.ID, "idname") ) )
1)
๋๋ต์ ์ธ ์ค๋ช ์ผ๋ก, element ๋ณ์๋ฅผ ์์ฑ ->
2)
WebDriverWait(driver, 8) ๊ตฌ๋ํ driver๋ ์ ๋ ๋์์ผ๋ก ๊ตฌ๋ํ ๋๋ผ์ด๋ฒ๋ก์,
8์ด๊น์ง ๊ทธ ๋ถ๋ถ์ด ํ์ํ ๋๊น์ง ๊ธฐ๋ค๋ ค๋ณด๊ฒ ๋ค๋ ์๋ฏธ [(๋ฌผ๋ก 8์ด ์ด์ ์ ๊ทธ ๋ถ๋ถ์ด ๋ํ๋๋ฉด 8์ด๊น์ง ๋ค ๊ธฐ๋ค๋ฆฌ์ง ์๋๊ฒ!!)]
3)
-> ์ด๋ค ๋ถ๋ถ์ ๋ํ ๊ฒ์ธ์ง? -> ์๋ ๋จผํธ๊ฐ ๋ํ๋๋ฉด ํด๋น ์๋ ๋จผํธ๋ฅผ element ๋ณ์๊ฐ ๊ฐ๋ฆฌํด
4)
EC.presence_of_element_located( ) ๊ดํธ ์์ ์์๊ฐ ๋์ฌ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ผ๋ ์๋ฏธ๋ก์,
๋ณดํต ID ๊ฐ์ด๋, ํด๋์ค์ด๋ฆ, xpath, name, css_selector, partial_link_text(์ผ๋ถ ํ ์ค๋ง ์ผ์น), link_text(์ ๋ถ ์ผ์น)
๊ธฐ์กด์ find_by_element_class_name ๋ฑ๊ณผ ๊ฐ์ด find_by~ ๊ตฌ๋ฌธ๊ณผ ๋น์ทํ๋ค๊ณ ์๊ฐ๋๋ฉฐ,
์ ์ฒด ๊ดํธ์ ๊ฐ์๊ฐ ๋ง์ง๋ง์ 3๊ฐ๊ฐ ์จ๋ค๋ ๊ฒ์ ์์ง๋ง์.
(By.ID, ‘์์ด๋์ด๋ฆ’)
(By.CLASS_NAME, ‘ํด๋์ค๋ช
’)
(By.XPATH, ‘xpath๊ฒฝ๋ก’)
(By.NAME, ‘๋ค์๋ช
’)
(By.CSS_SELECTOR, ‘CSS์
๋ ํฐ’)
(By.PARTIAL_LINK_TEXT, ‘๋งํฌํ
์คํธ์ผ๋ถ๋ถ’)
(By.LINK_TEXT, ‘๋งํฌํ
์คํธ(์ ๋ถ์ผ์น)’)
EC.element_to_be_clickable((By.ID, 'up')
EC.element_to_be_clickable((By.CLASS_NAME, 'car_class')
EC.element_to_be_clickable((By.NAME, 'KimJ')
๋
'๐๏ธ์ํํธ์จ์ด > ๐ปpython' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] TypeError: 'NoneType' object is not iterable ์ค๋ฅ ํด๊ฒฐ ๋ฐฉ๋ฒ (0) | 2021.11.25 |
---|---|
[python] ํ์ด์ pd.concat (0) | 2021.11.25 |
[python] ํฌ๋กค๋ง์ ํ์ํ ํจ์ : filter, lambda, map (0) | 2021.11.25 |
python ์ฝ๋ ์๊ฐ ๊ณ์ฐ (0) | 2021.11.24 |
Kernel died with exit code 1073741845 ์๋ฌ (0) | 2021.11.23 |