Naprawianie błędu „Nie można odczytać właściwości Null (Odczyt„ ShadowRoot ”)” Selenium Web Scraping

Naprawianie błędu „Nie można odczytać właściwości Null (Odczyt„ ShadowRoot ”)” Selenium Web Scraping
Selenium

Zrozumienie i naprawienie typowych błędów JavaScript w Selenium

Podczas skrobania sieci za pomocą , napotkanie błędów związanych z JavaScriptem nie jest rzadkością, szczególnie w przypadku dynamicznych elementów sieciowych, takich jak . Jednym z częstych błędów, z jakimi borykają się programiści, jest , co często ma miejsce podczas interakcji ze złożonymi elementami strony.

Ten błąd zwykle pojawia się, gdy Selenium nie może uzyskać dostępu lub interakcji z elementami wewnątrz pliku , unikalny typ enkapsulowanej struktury DOM używany przez wiele nowoczesnych stron internetowych w celu zapewnienia lepszej modułowości. W Pythonie używanie Selenium do sterowania przeglądarką może być trudne w przypadku takich elementów.

W kontekście skrobania stron internetowych z platform takich jak Shopee, wyskakujące okienka lub banery często korzystają z cieni DOM, których programowe zamknięcie może być trudne. Problem ten może utrudniać płynny przepływ zautomatyzowanych zadań i zakłócać gromadzenie danych.

Ten przewodnik przeprowadzi Cię przez jasne rozwiązanie problemu błąd i zapewniają praktyczne podejście do zamykania wyskakujących okienek osadzonych w cieniu DOM w Shopee .

Rozkaz Przykład użycia
shadowRoot Służy do uzyskiwania dostępu do elementów w cieniu DOM. Cień DOM izoluje pewne elementy od głównego drzewa DOM, wymagając dostępu do nich właściwości ShadowRoot. W tym skrypcie służy do lokalizowania przycisku zamykania w wyskakującym okienku.
execute_script() Ta metoda Selenium umożliwia wykonanie surowego kodu JavaScript w sesji przeglądarki. Jest to niezbędne podczas interakcji z elementami Shadow DOM, ponieważ tradycyjne metody Selenium mogą nie działać.
WebDriverWait() To polecenie konfiguruje jawne oczekiwania w Selenium. Zapewnia, że ​​skrypt czeka, aż zostanie spełniony określony warunek, na przykład element stanie się klikalny. Ma to kluczowe znaczenie dla dynamicznego ładowania treści, co widać w wyskakujących okienkach Shopee.
expected_conditions Moduł ten zawiera warunki, których można używać z WebDriverWait, takie jak widoczność lub obecność elementu. Zapewnia to, że operacje takie jak kliknięcie będą wykonywane tylko wtedy, gdy docelowe elementy będą gotowe.
EC.presence_of_element_located() Warunek używany z WebDriverWait w celu zapewnienia obecności docelowego elementu w modelu DOM. Jest to szczególnie przydatne podczas oczekiwania na załadowanie elementów w cieniu DOM.
EC.element_to_be_clickable() Kolejny przydatny warunek WebDriverWait, zapewniający widoczność docelowego elementu i możliwość kliknięcia przed próbą jakiejkolwiek interakcji, co zmniejsza liczbę błędów na dynamicznych stronach internetowych.
By.CSS_SELECTOR Ta metoda umożliwia lokalizowanie elementów za pomocą ich selektorów CSS. Jest to szczególnie przydatne podczas celowania w elementy wewnątrz cienia DOM, które mogą nie być dostępne przy użyciu standardowych metod XPath.
driver.quit() Zapewnia, że ​​instancja przeglądarki zostanie poprawnie zamknięta po zakończeniu działania skryptu. Ważną, najlepszą praktyką jest unikanie pozostawiania otwartych sesji przeglądarki.

Jak obsługiwać Shadow DOM i wyskakujące okienka w Selenium Web Scraping

Skrypty podane powyżej mają na celu rozwiązanie typowego problemu napotykanego podczas skrobania stron internetowych podczas interakcji z elementami cienia DOM. Cień DOM to część strony internetowej, która działa niezależnie od głównego DOM, często używana w złożonych komponentach sieciowych. W kontekście witryn scrapingowych, takich jak Shopee, wyskakujące okienka często pojawiają się w cieniu DOM, co może prowadzić do błędów w przypadku dostępu za pomocą tradycyjnych metod Selenium. Pierwszy skrypt ma na celu zamknięcie wyskakującego okienka za pomocą wykonania JavaScript , potężne narzędzie, które pozwala Selenium uruchamiać surowy JavaScript w kontekście przeglądarki.

Kluczowym wyzwaniem jest to, że elementy wewnątrz cienia DOM nie są dostępne za pomocą typowych poleceń Selenium, takich jak . Zamiast tego używamy JavaScript, aby przejść do cienia DOM za pomocą nieruchomość. Skrypt celuje w przycisk zamykania wyskakującego okienka Shopee, najpierw uzyskując dostęp do jego elementu hosta w tle, a następnie wysyłając zapytanie do jego wewnętrznej struktury. Korzystając , skrypt może manipulować i zamykać elementy wewnątrz tego izolowanego modelu DOM. To rozwiązanie działa dobrze w połączeniu z jawnym oczekiwaniem na obsługę dynamicznych elementów strony, które ładują się asynchronicznie.

Drugi skrypt wprowadza , niezbędne narzędzie do zarządzania czasem dynamicznych elementów strony. Ponieważ wyskakujące okienka Shopee ładują się asynchronicznie, bezpośrednia interakcja z tymi elementami może powodować błędy. Aby tego uniknąć, gwarantuje, że elementy, z którymi chcemy wejść w interakcję, są w pełni załadowane i gotowe. Skrypt ten czeka na obecność zarówno głównego elementu DOM, jak i elementów cienia DOM. Metoda zapewnia, że ​​Selenium oddziałuje z elementami dopiero wtedy, gdy są one widoczne i obecne, co ma kluczowe znaczenie dla uniknięcia błędów odniesienia zerowego.

W obu skryptach sytuacje błędów obsługujemy za pomocą a block, aby mieć pewność, że program nie ulegnie awarii z powodu nieoczekiwanych błędów, takich jak nieznalezienie elementów. Obsługa błędów jest szczególnie ważna podczas scrapowania stron internetowych, które często aktualizują swoją strukturę lub zmieniają zachowanie wyskakujących okienek. Dodatkowo skrypty te postępują zgodnie z najlepszymi praktykami, kończąc sesję przeglądarki za pomocą po wykonaniu, aby uniknąć wycieków pamięci lub problemów z wydajnością.

Obsługa Shadow DOM i zamykanie wyskakujących okienek za pomocą Selenium w Pythonie

Używanie Pythona z Selenium WebDriver do interakcji z elementami Shadow DOM i dynamicznej obsługi wyskakujących okienek.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import JavascriptException
import time
# Initialize WebDriver with Chrome
options = Options()
driver = webdriver.Chrome(service=Service(), options=options)
# Open Shopee website
driver.get('https://www.shopee.co.th/')
# Click the Thai language button
th_button = driver.find_element(By.XPATH, '/html/body/div[2]/div[1]/div[1]/div/div[3]/div[1]/button')
th_button.click()
# Pause to allow popups to load
time.sleep(3)
# Try to close the shadow DOM popup
try:
    close_button = driver.execute_script('return document.querySelector("shopee-banner-popup-stateful")'
                                      '.shadowRoot.querySelector("div.shopee-popup__close-btn")')
    close_button.click()
except JavascriptException as e:
    print("Error: ", e)
# Close the browser
driver.quit()

Używanie WebDriverWait do interakcji Shadow DOM

Używanie jawnych oczekiwań w Selenium, aby upewnić się, że elementy w Shadow DOM są gotowe do interakcji.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
# Initialize WebDriver with Chrome
options = Options()
driver = webdriver.Chrome(service=Service(), options=options)
# Open Shopee website
driver.get('https://www.shopee.co.th/')
# Click the Thai language button
th_button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div[1]/div[1]/div/div[3]/div[1]/button'))
)
th_button.click()
# Wait for the shadow DOM popup to be present
try:
    shadow_host = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'shopee-banner-popup-stateful'))
    )
    shadow_root = driver.execute_script('return arguments[0].shadowRoot', shadow_host)
    close_button = shadow_root.find_element(By.CSS_SELECTOR, 'div.shopee-popup__close-btn')
    close_button.click()
except Exception as e:
    print("Error closing the popup: ", e)
# Close the browser
driver.quit()

Obsługa treści dynamicznych za pomocą Selenium WebDriver

Kolejnym kluczowym aspektem, który należy wziąć pod uwagę podczas pracy z Selenium WebDriver przy przeglądaniu stron internetowych, jest sposób obsługi które stale aktualizują się lub zmieniają po załadowaniu strony. Wiele nowoczesnych witryn internetowych, takich jak Shopee, używa JavaScript do dynamicznego ładowania i aktualizowania treści. Oznacza to, że elementy na stronie mogą nie być dostępne od razu po załadowaniu strony. W takich przypadkach domyślne zachowanie Selenium polegające na oczekiwaniu na zdarzenie ładowania strony może nie być wystarczające. Używanie jawnego oczekiwania, takiego jak może rozwiązać ten problem, czekając, aż pojawią się określone elementy lub staną się klikalne.

Do skrobania witryn z wyskakującymi okienkami, banerami lub złożonymi komponentami interfejsu użytkownika, na których opierają się ważne jest, aby wiedzieć, jak z nimi współdziałać. Komponenty te ukrywają elementy w izolowanej strukturze DOM, do których nie można uzyskać dostępu tradycyjnymi metodami, takimi jak selektory XPath lub CSS. Korzystanie z Komenda pomaga wypełnić tę lukę, umożliwiając uruchamianie JavaScript bezpośrednio w przeglądarce, zapewniając dostęp do cienia DOM i umożliwiając interakcję z takimi elementami, jak przyciski zamykania lub pola formularzy w ukrytych częściach strony.

Dodatkowo w takich przypadkach kluczowa staje się obsługa błędów. Strony internetowe często mogą zmieniać swoją strukturę, co prowadzi do zepsucia skrobaków. Właściwe użycie bloki w Pythonie pozwalają wyłapać błędy takie jak i obchodź się z nimi z wdziękiem, upewniając się, że zgarniacz nie ulegnie niespodziewanej awarii. Włączenie rejestrowania w celu przechwycenia szczegółów błędu może pomóc w zidentyfikowaniu pierwotnej przyczyny i rozwiązaniu jej w przyszłych problemach.

  1. Co to jest cień DOM i dlaczego jest trudno dostępny?
  2. The to izolowane drzewo DOM, którego twórcy stron internetowych używają do hermetyzacji elementów i zapobiegania wpływowi stylów lub skryptów w dokumencie głównym. Dostęp do niego jest trudny, ponieważ tradycyjne metody Selenium nie obsługują bezpośredniej interakcji z elementami Shadow DOM.
  3. Jak to się dzieje pomóc w interakcji z cieniem DOM?
  4. umożliwia uruchamianie JavaScript bezpośrednio w sesji przeglądarki, umożliwiając dostęp do elementów Shadow DOM, które w innym przypadku byłyby nieosiągalne przy użyciu zwykłych poleceń Selenium.
  5. Dlaczego ważne dla skrobania treści dynamicznych?
  6. zapewnia, że ​​skrypt czeka na określone warunki, takie jak możliwość kliknięcia lub obecność elementu, przed interakcją z nim. Ma to kluczowe znaczenie w przypadku obsługi zawartości dynamicznej, która ładuje się asynchronicznie.
  7. Co powinienem zrobić, gdy się spotkam ?
  8. występuje, gdy występuje problem z wykonaniem kodu JavaScript. Implementacja obsługi błędów przy użyciu bloki mogą pomóc w wyłapaniu tych błędów i zarządzaniu nimi bez zawieszania całego skryptu.
  9. Jak zamknąć dynamiczne wyskakujące okienka korzystające z cieni DOM?
  10. Aby zamknąć dynamiczne wyskakujące okienka zamknięte w cieniu DOM, musisz najpierw uzyskać dostęp do katalogu głównego za pomocą a następnie znajdź przycisk zamykania wyskakującego okienka w cieniu DOM.

Interakcja z elementami Shadow DOM może być trudna, gdy używasz Selenium do skrobania stron internetowych. Jednakże, wykorzystując wykonanie JavaScript i jawne oczekiwanie, możesz skutecznie zarządzać elementami, do których trudno uzyskać dostęp za pomocą standardowych metod.

Prawidłowo obsługując błędy i włączając oczekiwania, możesz mieć pewność, że Twoje skrypty skrobania są solidne i niezawodne. Techniki te pomogą uniknąć typowych pułapek podczas pracy z zawartością dynamiczną i wyskakującymi okienkami osadzonymi w cieniu DOM, zapewniając płynniejsze przeglądanie.

  1. Informacje na temat interakcji z elementami Shadow DOM w Selenium z Dokumentacja Selenium WebDriver .
  2. Informacje na temat obsługi błędów JavaScriptException z Przepełnienie stosu .
  3. Wytyczne dotyczące najlepszych praktyk dotyczących skrobania treści dynamicznych w Internecie za pomocą Prawdziwy Python .