Selenium(Python) + Docker

S3
На сайте с 29.03.2012
Offline
304
717

Попробу. поверить: что здесь обитают не только вебмастера частные и задам вопрос? Теоретически парсинг сайтов - хлеб для местных: так что надеюсь: что найдутся спецы? К делу.

Нужно написать парсер пары десятков сайтов. В принципе несложно, но проблема, что половина команды работает на винде, кто-то на линухе, кто-то(я) на Маке.

У меня развернуть систему ушло примерно час, на на винде приходится тратить примерно по два часа на поднятие системы в virtualenv.

Задумал написать докер контейнер, в котором все это будет вертеться. Вроде сделал. Теперь установка выполняется реально одной командой. Но словил такую вещь - в  докере Селениум умеет работать только в --headless режиме. Если хочу посмотреть, как происходит скрапинг - это невозможно. Хотя все прекрасно работает. Когда парсинг включает в себя клики - хотелось бы видеть как это происходит для дебага. 

Может кто сталкивался с такой проблемой? Я в отдельном контейнере поднимаю образ с хромом и даже пробрасываю его на локалхост. Но контейнер с селениумом не видит в упор его. Я уже и сети прописал общие и дабваг адрес и порт указал - бесполезно(

Может кто сталкивался и может помочь?

-S
На сайте с 10.12.2006
Offline
1355
#1
S3
На сайте с 29.03.2012
Offline
304
#2

Спасибо, я примерно все это и настраиваю, кроме vnc сервера, он он тоже не помогает. Проблема в том что драйвер внутри сети не видит Хром и не стартует

-S
На сайте с 10.12.2006
Offline
1355
#3
Sly32 :

Может кто сталкивался с такой проблемой? Я в отдельном контейнере поднимаю образ с хромом и даже пробрасываю его на локалхост. Но контейнер с селениумом не видит в упор его. Я уже и сети прописал общие и дабваг адрес и порт указал - бесполезно(

Может кто сталкивался и может помочь?

Разумно будет показать docker-compose.yml

S3
На сайте с 29.03.2012
Offline
304
#4
-= Serafim =- #:

Разумно будет показать docker-compose.yml

да пожалста:

version: "3"

services:
  postgres:
    build:
      context: docker/postgres_db/.docker-containers/postgres
    restart: "on-failure"
#    expose:
#      - 5432
    env_file:
      - docker/postgres_db/.docker-env/dev/postgres.env
    environment:
      - POSTGRES_DB_USER=docker
    ports:
      - "5433:5432"
    ulimits:
      nproc: 128000
      nofile:
        soft: 50000
        hard: 120000
    networks:
      - solid-scraper

  parser-backend:
    build:
      context: .
    container_name: parser-backend
#    image: 130962004394.dkr.ecr.us-east-1.amazonaws.com/fastapi:backend
    env_file:
      - .env
#    environment:
#      PORT: 8000
#      DB_ENDPOINT: db
    ports:
      - '8040:8000'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./:/code
      - ./app/:/code/app
    restart: "on-failure"
    command: uvicorn app.main:app --reload --host localhost --port 8000
    networks:
      - solid-scraper
    depends_on:
      - selenium-chrome-standalone
      - postgres

  selenium-chrome-standalone:
    container_name: chrome-selenium
    ports:
      - "4444:4444"
    image: "selenium/standalone-chrome"
    networks:
      - solid-scraper


volumes:
  postgres:
  parser-backend:
  chrome-selenium:
-S
На сайте с 10.12.2006
Offline
1355
#5
Проблема может может быть связана с тем, что контейнер parser-backend зависит от контейнера selenium-chrome-standalone, но механизм depends_on не гарантирует, что зависимый контейнер полностью готов. Можно попробовать https://github.com/vishnubob/wait-for-it/ чтобы ждать, пока контейнер selenium-chrome-standalone запустится.

Например:

command: bash -c "./wait-for-it.sh selenium-chrome-standalone:4444 -- uvicorn
app.main:app --reload --host localhost --port 8000"

S3
На сайте с 29.03.2012
Offline
304
#6
-= Serafim =- #:
но механизм depends_on не гарантирует, что зависимый контейнер полностью готов.

Почему не гарантирует - я в консоли логов вижу что он его перезапускает несколько раз, пока бэкенд не стартанет.

Кроме того я вижу что запущен, я на него могу зайти через локалхост.

В итоге вот такой эксепшен падает:

File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 346, in execute
    self.error_handler.check_response(response)
  File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: crashed.
  (chrome not reachable)
  (The process started from chrome location /opt/google/chrome/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

Не понимаю, как путь правильно прописать  к хрому. Пытаюсь так:

        chrome_options.add_argument("--remote-debugging-port=99")
        chrome_options.add_experimental_option("debuggerAddress", "172.31.0.1:99")

или так


        chrome_options.add_experimental_option("debuggerAddress", "chrome-selenium:4444")
Denk
На сайте с 30.01.2007
Offline
145
#7
Получилось решить? Тоже интересует)
S1
На сайте с 23.06.2006
Offline
128
#8
version: "3"
services:
  selenium-hub:
    image: selenium/hub:latest
    ports:
      - "4444:4444"

  chrome-node:
    image: selenium/node-chrome:latest
    depends_on:
      - selenium-hub
    environment:
      - HUB_HOST=selenium-hub
    ports:
      - "5900:5900"

  firefox-node:
    image: selenium/node-firefox:latest
    depends_on:
      - selenium-hub
    environment:
      - HUB_HOST=selenium-hub
    ports:
      - "5901:5900"
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

# Задайте URL для хаба Selenium Grid
hub_url = "http://localhost:4444/wd/hub"

# Задайте желаемые параметры браузера
capabilities = DesiredCapabilities.CHROME.copy()
capabilities["platform"] = "LINUX"  # Используйте "LINUX" для контейнеров

# Подключитесь к удаленному браузеру через Selenium Grid
driver = webdriver.Remote(command_executor=hub_url, desired_capabilities=capabilities)

# Пример использования
driver.get("https://www.example.com")
print(driver.title)

# Закройте браузер после использования
driver.quit()

Посмотрите такой вариант, я сейчас примерно такое же тестирую.

lutskboy
На сайте с 22.11.2013
Offline
173
#9
я не в теме. это даст возможность смотреть как выполняется процесс? то есть в режиме headless=false? 

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий