Я создал скрипт для очистки веб-страниц, который использует Selenium с undetected_chromedriver для очистки веб-страниц. Запуск сценария на моем локальном компьютере работает нормально, но у него возникают проблемы с подключением при запуске в докере/контейнере.
За исключением того, что проблемы с подключением возникают не к самому веб-сайту, а к локальному хосту в случайном порядке. порт, который, как я предполагаю, предназначен для связи с драйвером Chrome.
Error: HTTPConnectionPool(host='localhost', port=59175): Max retries exceeded with url: /session/2447d84a58ac677fa2a41dc4280bd779/url (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))
Если эти исключения не выдаются, скрипт просто зависает во время вызовов chromedriver (но не при инициализации экземпляра chrome)
В контейнере (используя top) я вижу, что Chrome использует мало ресурсов и процесс «chrome_crashpad». Возможно ли, что Chrome просто дает сбой/зависает?
Использование python3.12 локально, python3.10 в контейнере.
Я видел эта тема касается той же проблемы, но я не вызываю driver.close или driver.quit где-либо в своем коде.
Это не проблема с веб-сайтом сама по себе, потому что та же ошибка возникает при попытке запросить другие URL-адреса.
Это не проблема сети, потому что когда я запускаю контейнер, я могу нормально выполнить wget на сайте .
Я не думаю, что это проблема undetected_chromedriver, потому что при переключении на стандартный селеновый хромированный драйвер все равно возникают проблемы.
Соответствующий код:
import json
from time import sleep
import undetected_chromedriver as uc
from selenium import webdriver
from selenium.webdriver.common.by import By
class WebDriver:
def __init__(self) -> None:
options = webdriver.ChromeOptions()
options.add_argument("--incognito")
options.add_argument("--no-sandbox")
options.add_argument('--disable-gpu')
options.add_argument("--window-size=1280,1696")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--blink-settings=imagesEnabled=false")
self.driver = uc.Chrome(options=options)
def get(self, url: str, retries: int = 3):
for i in range(retries):
try:
self.driver.get(url)
return True
except Exception as e:
print(f"[WebDriver] ({i + 1}/{retries}) Error: {e}")
sleep(3)
print(f"[WebDriver] Failed to get {url}")
return False
def get_page_source(self):
return self.driver.page_source
def get_page_json(self):
json_text = self.driver.find_element(By.TAG_NAME, "pre").text
return json.loads(json_text)
from webdriver import WebDriver
from queue import Queue
from threading import Lock
class WebDriverPool:
def __init__(self, pool_size=4):
self.pool = Queue()
self.lock = Lock()
for i in range(pool_size):
self.pool.put(self.create_driver())
def get_driver(self) -> WebDriver:
with self.lock:
return self.pool.get()
def return_driver(self, webdriver):
with self.lock:
self.pool.put(webdriver)
def create_driver(self) -> WebDriver:
return WebDriver()
print("TESTING1")
driver0 = WebDriver()
driver0.get("https://example.com")
print(driver0.get_page_source())
print("TESTING2")
driver1 = self.wd_pool.get_driver()
driver2 = self.wd_pool.get_driver()
driver1.get("https://example.com")
driver2.get("https://example.com")
print(driver1.get_page_source())
print(driver2.get_page_source())
self.wd_pool.return_driver(driver1)
self.wd_pool.return_driver(driver2)
Файл Docker
FROM selenium/standalone-chrome
USER root
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
xvfb
ENV DISPLAY=:99
WORKDIR /scrape
COPY . ./
RUN pip3 install -r requirements.txt
RUN chmod +x run.sh
ENTRYPOINT ["./run.sh"]
Точка входа в Docker:
#!/bin/bash
echo "[ENTRYPOINT] Starting Xvfb $DISPLAY"
Xvfb $DISPLAY -screen 0 1280x1024x24 & \
echo "[ENTRYPOINT] main.py $1 $2"
exec python3 main.py $1 $2
Подробнее здесь: https://stackoverflow.com/questions/785 ... xt-in-dock
Selenium (необнаруженный драйвер Chrome) не может подключиться к контексту браузера в докере ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Необнаруженный Chromedriver не использует последнюю версию Chromedriver для моего браузера
Anonymous » » в форуме Python - 0 Ответы
- 40 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Необнаруженный Chromedriver не использует последнюю версию Chromedriver для моего браузера
Anonymous » » в форуме Python - 0 Ответы
- 31 Просмотры
-
Последнее сообщение Anonymous
-