κ°œλ°œπŸ’»/Python

[Python] Shadow DOM 크둀링 - Selenium

壓倒 2022. 11. 1. 03:34

Selenium No Such Element μ—λŸ¬

졜근 Selenium을 μ‚¬μš©ν•˜μ—¬ 크둀러λ₯Ό ꡬ좕할 일이 생겨 ν‰μ†Œμ™€ 같이 Xpath, Selector 등을 μ‚¬μš©ν•˜μ—¬ ꡬ좕을 μ‹œλ„ν•˜μ˜€λ‹€.

 

ν•˜μ§€λ§Œ, Selenium μ‚¬μš© μ‹œ κ°€μž₯ ν”ν•œ μ—λŸ¬μΈ selenium.common.exceptions.NoSuchElementException: Message:no such element:Unable to locate element:{"method":"css selector", "selector':"μ‹€μ œ μ‚¬μš©ν•œ ꡬ문" μ—λŸ¬κ°€ λ°œμƒν•˜μ—¬ λͺ¨λ“  방법을 동원해 μˆ˜μ •ν•˜μ˜€μœΌλ‚˜ 였λ₯˜λŠ” ν•΄κ²°λ˜μ§€ μ•Šμ•˜λ‹€.

 

ν•΄λ‹Ή μ—λŸ¬λ₯Ό ν•΄κ²°ν•˜λŠ” λ°©λ²•μ—λŠ” 클래슀 λͺ…에 곡백이 μ‘΄μž¬ν•˜μ—¬ 곡백 λŒ€μ‹ μ— 점(.)을 μ‚¬μš©ν•˜μ—¬ ν•΄κ²°, λ‘œλ”© μ‹œκ°„μœΌλ‘œ μΈν•œ 였λ₯˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•œ μ‹œκ°„ μ§€μ—° μ½”λ“œ μΆ”κ°€, λ™μΌν•œ 클래슀 λͺ… λ“± μ—¬λŸ¬ 방법이 μ‘΄μž¬ν•˜μ§€λ§Œ λͺ¨λ“  방법이 ν†΅ν•˜μ§€ μ•Šμ•˜λ‹€.

(ν•΄λ‹Ή μ—λŸ¬ ν•΄κ²° 방식은 ν•΄λ‹Ή ν¬μŠ€νŒ… 글을 μ°Έκ³ ν•˜μ˜€λ‹€.)

https://zeuskwon-ds.tistory.com/67

 

[selenium] 크둀링 no such element 였λ₯˜ ν•΄κ²°

μ…€λ ˆλ‹ˆμ›€ μ—λŸ¬ 크둀링을 ν•˜λ©΄μ„œ element에 μ ‘κ·Όν•˜λŠ” μ½”λ“œ μ‹€ν–‰μ‹œ κ°€μž₯ 많이 λ§Œλ‚˜λŠ” μ—λŸ¬λŠ” no such element일 것이닀. λ‚΄κ°€ μ§€μ •ν•œ element(css_selector = rogA2c)의 값을 λͺ»μ°Ύμ„ 경우 λ°œν–‰ν•˜λŠ” μ—λŸ¬μ΄λ‹€. λ‚΄κ°€

zeuskwon-ds.tistory.com

 

 

Shadow DOM 

λͺ¨λ“  방법을 λ™μ›ν•˜μ˜€μœΌλ‚˜ ν•΄κ²°λ˜μ§€ μ•Šμ•„ 크둀링 λŒ€μƒ μ‚¬μ΄νŠΈμ˜ μ½”λ“œλ₯Ό μœ μ‹¬νžˆ 보던 쀑 λ‹€μŒκ³Ό 같이 #shadow-root λ¬Έμžμ—΄μ΄ μ—¬λŸ¬ 개 μ‘΄μž¬ν•˜λŠ” 것을 λ°œκ²¬ν•˜μ˜€λ‹€.

#Shados-root

 

ν•΄λ‹Ή μ½”λ“œλ₯Ό κ΅¬κΈ€λ§ν•œ κ²°κ³Ό Shadow DOM μš”μ†Œκ°€ 적용된 것을 μ•Œ 수 μžˆμ—ˆλ‹€.

 

일반적으둜 HTML μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μ•˜μ„ λ•Œ #document, #shadow-root λ¬Έμžμ—΄μ΄ μ‘΄μž¬ν•˜κ³  ν•˜λ‹¨μ— 또 HTML μ½”λ“œκ°€ μ‘΄μž¬ν•  λ•Œ Shadow DOM μš”μ†Œκ°€ μ μš©λ˜μ–΄ μžˆλ‹€κ³  νŒλ‹¨ν•  수 μžˆλ‹€.

 

Shadow DOMμ΄λž€?

HTML 개발 μ‹œ μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§€λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ μˆ¨κ²¨λ†“μ€ HTML μš”μ†Œμ΄λ‹€.

일반 μ‚¬μš©μžκ°€ λ³Ό 수 μ—†μœΌλ©° F1ν‚€λ₯Ό λˆ„λ₯Έ ν›„ 개발자 도ꡬλ₯Ό μ„ νƒν•˜λ©΄ μˆ¨κ²¨μ§„ DOM μš”μ†ŒκΉŒμ§€ λ³Ό 수 μžˆλŠ” μ˜΅μ…˜μ„ 체크할 κ²½μš°μ—λŠ” λͺ¨λ‘ λ³Ό 수 μžˆλ‹€.

Show user agent shadow DOM

 

Shadow DOM μš”μ†Œκ°€ μ μš©λ˜μ—ˆμ„ λ•Œ μš”μ†Œκ°€ μˆ¨κ²¨μ§„ μƒνƒœμ΄λ―€λ‘œ 크둀링을 μ‹œλ„ν•˜λ©΄ μ›ν•˜λŠ” elementλ₯Ό μ°Ύμ§€ λͺ»ν•˜μ—¬ No such element μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” κ²ƒμ΄μ—ˆλ‹€.

 

 

 

Shadow DOM 크둀링 방법

Seleniumμ—μ„œλŠ” ν˜„μž¬ Shadow DOM에 λŒ€ν•œ κΈ°λŠ₯을 μ§€μ›ν•˜λŠ”μ§€ λͺ¨λ₯΄κ² μœΌλ‚˜ pyshadowλΌλŠ” ν”ŒλŸ¬κ·ΈμΈμ΄ μ‘΄μž¬ν•œλ‹€.

https://pypi.org/project/pyshadow/

 

pyshadow

Selenium plugin to manage shadow DOM elements on web page.

pypi.org

 

ν•΄λ‹Ή ν”ŒλŸ¬κ·Έ 인을 μ‚¬μš©ν•  경우 Shadow DOM μš”μ†Œμ— λŒ€ν•œ 접근이 κ°€λŠ₯ν•˜λ©° μ„€μΉ˜λŠ” 일반 λͺ¨λ“ˆκ³Ό λ™μΌν•˜κ²Œ λ‹€μŒκ³Ό 같은 λͺ…λ μ–΄λ‘œ μ„€μΉ˜ν•œλ‹€.

pip install pyshadow

 

pyshadow의 importλŠ” λ‹€μŒκ³Ό 같이 ν•œλ‹€.

from pyshadow.main import Shadow

 

이후 μ‹€μ œ μ½”λ“œμ—μ„œλŠ” driver.get('μ›ν•˜λŠ” URL) μ½”λ“œ 이후 Shadow 객체λ₯Ό μ„ μ–Έν•˜κ³  κΈ°μ‘΄ μ‚¬μš© 방식과 λ™μΌν•˜κ²Œ find_element()λ₯Ό μ‚¬μš©ν•˜λ©΄ μ›ν•˜λŠ” κ²°κ³Όλ₯Ό 크둀링 ν•  수 μžˆλ‹€. 일뢀 μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

driver.get('크둀링 λŒ€μƒ URL')

shadow = Shadow(driver) # Shadow 객체 μ„ μ–Έ
temp = shadow.find_element('~~')

 

 

 

였λ₯˜, 잘λͺ»λœ 점 λ˜λŠ” κΆκΈˆν•œ 점이 μžˆμœΌμ‹œλ‹€λ©΄ λŒ“κΈ€ λ‚¨κ²¨μ£Όμ„Έμš”β—