Как остановить бесконечную работу браузера при использовании Selenium для парсинга?

Я пытаюсь выполнить операцию с сайтом с помощью Selenium, например, получить HTML-код страницы. У меня открывается браузер Firefox, он загружает страницу, но затем процесс зависает в бесконечном ожидании. На примере официального сайта Python все работает без проблем, возможно, это связано с тем, что на этом сайте меньше динамических ссылок (если я правильно понимаю). Я также пробовал аналогичный процесс в Chrome, но результата это не дало. 

Я уже добавил ожидание загрузки элемента с конкретным тегом, однако это не помогло. 

Вот мой код:

<pre><code class="python">from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

firefox_options = Options()
firefox_options.binary = r'C:\\Program Files\\Mozilla Firefox\\firefox.exe'  # Убедитесь, что путь правильный
service = Service('D:\\Code\\Python\\FireFox_Driver\\geckodriver.exe')
driver = webdriver.Firefox(service=service, options=firefox_options)

url1 = 'https://superstep.ru/product/NCFSW0W288YW_GRA/#colorGRA'
driver.get(url1)

try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "product-slider__img js-product-current-img"))  # Замените на селектор элемента, который вы ожидаете
    )
    page_html = driver.page_source
finally:
    driver.quit()

print(page_html)</code></pre>
  • 5 ноября 2024 г. 13:33
Ответы на вопрос 2
Ваш код выглядит почти правильно, однако есть несколько моментов, на которые стоит обратить внимание, чтобы решить проблему бесконечного ожидания при использовании Selenium. 

1. **Корректный CSS селектор**: В вашем коде используется селектор `product-slider__img js-product-current-img`, который является строкой. Он должен быть заключён в кавычки (например, в одинарные) и передан как список, поскольку тип `By.CSS_SELECTOR` ожидает наличие селектора как строки, а не как список классов. Верный код будет выглядеть так:

```python
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".product-slider__img.js-product-current-img"))
)
```

2. **Проверка наличия элемента**: Если элемент, который вы пытаетесь найти, не загружается, процесс может зависнуть. Попробуйте изменить `presence_of_element_located` на `visibility_of_element_located`, чтобы удостовериться, что элемент действительно видим на странице.

3. **Увеличьте таймаут**: Возможно, стороницу действительно загружается дольше, чем вы ожидали. Попробуйте увеличить время ожидания до 30 или 60 секунд.

4. **Обработка исключений**: Добавьте обработку исключений, чтобы вы могли увидеть ошибки, если они произойдут.

5. **Избежание ожидания на сложных страницах**: На некоторых сложных веб-страницах (например, с динамическим контентом) могут быть проблемы с ожиданием. Можно использовать альтернативные подходы, такие как `time.sleep()` для синхронизации, чтобы увидеть загруженное содержимое.

Вот исправленный код с учётом вышеизложенного:

```python
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

firefox_options = Options()
firefox_options.binary = r'C:\\Program Files\\Mozilla Firefox\\firefox.exe'
service = Service('D:\\Code\\Python\\FireFox_Driver\\geckodriver.exe')
driver = webdriver.Firefox(service=service, options=firefox_options)

url1 = 'https://superstep.ru/product/NCFSW0W288YW_GRA/#colorGRA'
driver.get(url1)

try:
    # Увеличиваем таймаут ожидания
    element = WebDriverWait(driver, 30).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, ".product-slider__img.js-product-current-img"))
    )
    page_html = driver.page_source
except Exception as e:
    print(f"Произошла ошибка: {e}")
finally:
    driver.quit()

print(page_html)
```

Если всё равно происходит зависание, вы можете попробовать использовать метод `execute_script` для принудительного ожидания или динамической подгрузки определённых элементов. Например:

```python
driver.execute_script("return document.readyState") == "complete"
```

Попробуйте эти изменения, и это должно помочь решить проблему.
Нейронка это конечно хорошо, но желательно проверять, что она пишет. 
# EC.presence_of_element_located((By.CSS_SELECTOR, "product-slider__img js-product-current-img"))
EC.presence_of_element_located((By.CSS_SELECTOR, ".product-slider__img.js-product-current-img"))
Похожие вопросы