Скрипты очистки веб-страниц с использованием селена не работают внутри контейнера докеров ⇐ Python
-
Anonymous
Скрипты очистки веб-страниц с использованием селена не работают внутри контейнера докеров
У меня есть пара сценариев очистки веб-страниц с использованием Selenium и Firefox. Я пытаюсь запустить их внутри контейнера докеров. Я использую Arch Linux, но я внимательно следовал инструкциям по установке на официальном веб-сайте докеров, посвященным Arch, и отлично запустил тестовый контейнер. Этот контейнер пытается запустить только один из этих сценариев, который работает в моей системе в venv с теми же установленными пакетами, которые указаны в файле require.txt. Я также позаботился о том, чтобы загрузить совместимые версии браузера и драйвера в файле докера, поэтому не понимаю, почему при запуске докера я получаю ошибки, специфичные для веб-драйвера.
Ошибки:
2023-12-06 02:12:20 Traceback (последний вызов): 2023-12-06 02:12:20 Файл "/home/retupmoc/PycharmProjects/EffortScraper/app/dimeFetch/AssistFetch.py", строка 18, в 2023-12-06 02:12:20 драйвер = webdriver.Firefox(сервис=сервис, параметры=опции) 2023-12-06 02:12:20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^ 2023-12-06 02:12:20 Файл "/usr/local/lib/python3.11/site-packages/selenium/webdriver/firefox/webdriver.py", строка 67, в __init__ 2023-12-06 02:12:20 super().__init__(command_executor=executor, options=options) 2023-12-06 02:12:20 Файл "/usr/local/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", строка 208, в __init__ 2023-12-06 02:12:20 self.start_session(возможности) 2023-12-06 02:12:20 Файл "/usr/local/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", строка 292, в start_session 2023-12-06 02:12:20 ответ = self.execute(Command.NEW_SESSION, caps)["значение"] 2023-12-06 02:12:20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2023-12-06 02:12:20 Файл "/usr/local/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", строка 347, выполняется 2023-12-06 02:12:20 self.error_handler.check_response(ответ) 2023-12-06 02:12:20 Файл "/usr/local/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py", строка 229, в check_response 2023-12-06 02:12:20 поднять исключения_класс (сообщение, экран, трассировка стека) 2023-12-06 02:12:20 selenium.common.Exceptions.WebDriverException: Сообщение: процесс неожиданно закрыт со статусом 255 Скрипт:
импортировать ОС импортировать CSV время импорта импортировать numpy как np из даты и времени импорта даты и времени из веб-драйвера импорта селена из selenium.webdriver.common.by импортировать из selenium.webdriver.support.ui импортировать WebDriverWait из selenium.webdriver.support импортируйте ожидаемые_условия как EC из службы импорта selenium.webdriver.firefox.service как FirefoxService из selenium.webdriver.firefox.options импортируйте параметры как FirefoxOptions # Настройте параметры Firefox и WebDriver сервис = FirefoxService() параметры = FirefoxOptions() options.add_argument('-headless') # Раскомментируйте, если вы работаете в безголовом режиме options.add_argument("--window-size=1920x,1080") драйвер = webdriver.Firefox(сервис=сервис, параметры=опции) # Откройте веб-страницу driver.get('https://www.nba.com/stats/players/passi ... ENTIAL_AST') # Подождем, пока загрузятся данные таблицы печать('1') table = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'nba-stats-content-block'))) печать('2') заголовки = table.find_elements(By.TAG_NAME, 'th') печать('3') header_titles = [header.text для заголовка в заголовках] print("Логски") печать (header_titles) # Замена избыточного «AST» фактическим именем заголовка header_titles[9] = "Вторичные помощники" header_titles[10] = "Потенциальные помощники" header_titles[11] = "AssistPointsCreated" header_titles[12] = "AdjustedAssists" header_titles[13] = "AstToPass%" header_titles[14] = "AdjAstToPass%" xbutton = WebDriverWait(driver,3).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".onetrust-close-btn-handler.onetrust-close-btn-ui.banner-close-button.ot-close-icon" ))) xbutton.click() # Условные присваивания если len(header_titles) > 9: header_titles[9] = "Вторичные помощники" если len(header_titles) > 10: header_titles[10] = "Потенциальные помощники" если len(header_titles) > 11: header_titles[11] = "AssistPointsCreated" # Сортировка таблицы по клику на заголовок таблицы (сортировка по подборам) time.sleep(np.random.uniform(3.80,6.0)) header_to_sort = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, '//th[text()="AST"]'))) time.sleep(np.random.uniform(1.0,1.45)) header_to_sort.click() time.sleep(np.random.uniform(4.0,5.35)) # Заменить более надежным условием ожидания # Найдите раскрывающийся список по известному префиксу имени класса dropdown_prefix = "Выпадающий_выбор" # Это постоянный префикс имени класса раскрывающийся список = WebDriverWait(драйвер, 10).until( EC.presence_of_element_located((By.XPATH, f"//select[starts-with(@class, '{dropdown_prefix}')]")) ) # Выберите опцию «Все» по ее значению all_option_value = "-1" all_option = dropdown.find_element(By.XPATH, f"//option[@value='{all_option_value}']") all_option.click() # Получить текущую дату и время для имени файла current_time = datetime.now() timestamp = current_time.strftime("%Y%m%d_%H%M%S") #сохраняем файлы .csv в папку архива каталог = "Архив помощников" если нет os.path.exists(каталог): os.madeirs (каталог) print(f"Каталог '{каталог}' создан") # Откройте новый CSV-файл с отметкой времени в имени, чтобы сохранить данные. имя файла = os.path.join(каталог, f'passing_data_{timestamp}.csv') table = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'nba-stats-content-block'))) с open(filename, 'w', newline='') как файл: писатель = csv.writer(файл) Writer.writerow(header_titles) # Записываем заголовки в CSV-файл. rows = table.find_elements(By.TAG_NAME, 'tr') для строки в строках: # Получить все столбцы строки cols = row.find_elements(By.TAG_NAME, 'td') # Запишите столбцы в CSV Writer.writerow([col.text для столбца в столбцах]) # Закрываем драйвер драйвер.выйти() DockerFile:
# Использовать официальную среду выполнения Python в качестве родительского образа ИЗ питона: 3.11.6 #Установим рабочий каталог /app WORKDIR/home/retupmoc/PycharmProjects/EffortScraper/приложение # Скопируйте содержимое каталога PyCharmProjects в контейнер /app КОПИРОВАТЬ. . # Установите все необходимые пакеты, указанные в файле require.txt. RUN pip install --upgrade pip \ && pip install -r требования.txt # Удалить существующий драйвер geckodriver из PATH, если он присутствует. ВЫПОЛНИТЬ rm /usr/local/bin/geckodriver || истинный # Установите GeckoDriver ЗАПУСК wget https://github.com/mozilla/geckodriver/ ... x64.tar.gz \ && tar -zxvf geckodriver-v0.33.0-linux64.tar.gz \ && драйвер mv geckodriver /usr/local/bin/ \ && rm geckodriver-v0.33.0-linux64.tar.gz # Определить переменную среды ENV NAME комбоFetch # Запускаем сценарии dimeFetch иboundFetch по умолчанию при запуске контейнера CMD ["python", "dimeFetch/AssistFetch.py"]
У меня есть пара сценариев очистки веб-страниц с использованием Selenium и Firefox. Я пытаюсь запустить их внутри контейнера докеров. Я использую Arch Linux, но я внимательно следовал инструкциям по установке на официальном веб-сайте докеров, посвященным Arch, и отлично запустил тестовый контейнер. Этот контейнер пытается запустить только один из этих сценариев, который работает в моей системе в venv с теми же установленными пакетами, которые указаны в файле require.txt. Я также позаботился о том, чтобы загрузить совместимые версии браузера и драйвера в файле докера, поэтому не понимаю, почему при запуске докера я получаю ошибки, специфичные для веб-драйвера.
Ошибки:
2023-12-06 02:12:20 Traceback (последний вызов): 2023-12-06 02:12:20 Файл "/home/retupmoc/PycharmProjects/EffortScraper/app/dimeFetch/AssistFetch.py", строка 18, в 2023-12-06 02:12:20 драйвер = webdriver.Firefox(сервис=сервис, параметры=опции) 2023-12-06 02:12:20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^ 2023-12-06 02:12:20 Файл "/usr/local/lib/python3.11/site-packages/selenium/webdriver/firefox/webdriver.py", строка 67, в __init__ 2023-12-06 02:12:20 super().__init__(command_executor=executor, options=options) 2023-12-06 02:12:20 Файл "/usr/local/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", строка 208, в __init__ 2023-12-06 02:12:20 self.start_session(возможности) 2023-12-06 02:12:20 Файл "/usr/local/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", строка 292, в start_session 2023-12-06 02:12:20 ответ = self.execute(Command.NEW_SESSION, caps)["значение"] 2023-12-06 02:12:20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2023-12-06 02:12:20 Файл "/usr/local/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", строка 347, выполняется 2023-12-06 02:12:20 self.error_handler.check_response(ответ) 2023-12-06 02:12:20 Файл "/usr/local/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py", строка 229, в check_response 2023-12-06 02:12:20 поднять исключения_класс (сообщение, экран, трассировка стека) 2023-12-06 02:12:20 selenium.common.Exceptions.WebDriverException: Сообщение: процесс неожиданно закрыт со статусом 255 Скрипт:
импортировать ОС импортировать CSV время импорта импортировать numpy как np из даты и времени импорта даты и времени из веб-драйвера импорта селена из selenium.webdriver.common.by импортировать из selenium.webdriver.support.ui импортировать WebDriverWait из selenium.webdriver.support импортируйте ожидаемые_условия как EC из службы импорта selenium.webdriver.firefox.service как FirefoxService из selenium.webdriver.firefox.options импортируйте параметры как FirefoxOptions # Настройте параметры Firefox и WebDriver сервис = FirefoxService() параметры = FirefoxOptions() options.add_argument('-headless') # Раскомментируйте, если вы работаете в безголовом режиме options.add_argument("--window-size=1920x,1080") драйвер = webdriver.Firefox(сервис=сервис, параметры=опции) # Откройте веб-страницу driver.get('https://www.nba.com/stats/players/passi ... ENTIAL_AST') # Подождем, пока загрузятся данные таблицы печать('1') table = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'nba-stats-content-block'))) печать('2') заголовки = table.find_elements(By.TAG_NAME, 'th') печать('3') header_titles = [header.text для заголовка в заголовках] print("Логски") печать (header_titles) # Замена избыточного «AST» фактическим именем заголовка header_titles[9] = "Вторичные помощники" header_titles[10] = "Потенциальные помощники" header_titles[11] = "AssistPointsCreated" header_titles[12] = "AdjustedAssists" header_titles[13] = "AstToPass%" header_titles[14] = "AdjAstToPass%" xbutton = WebDriverWait(driver,3).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".onetrust-close-btn-handler.onetrust-close-btn-ui.banner-close-button.ot-close-icon" ))) xbutton.click() # Условные присваивания если len(header_titles) > 9: header_titles[9] = "Вторичные помощники" если len(header_titles) > 10: header_titles[10] = "Потенциальные помощники" если len(header_titles) > 11: header_titles[11] = "AssistPointsCreated" # Сортировка таблицы по клику на заголовок таблицы (сортировка по подборам) time.sleep(np.random.uniform(3.80,6.0)) header_to_sort = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, '//th[text()="AST"]'))) time.sleep(np.random.uniform(1.0,1.45)) header_to_sort.click() time.sleep(np.random.uniform(4.0,5.35)) # Заменить более надежным условием ожидания # Найдите раскрывающийся список по известному префиксу имени класса dropdown_prefix = "Выпадающий_выбор" # Это постоянный префикс имени класса раскрывающийся список = WebDriverWait(драйвер, 10).until( EC.presence_of_element_located((By.XPATH, f"//select[starts-with(@class, '{dropdown_prefix}')]")) ) # Выберите опцию «Все» по ее значению all_option_value = "-1" all_option = dropdown.find_element(By.XPATH, f"//option[@value='{all_option_value}']") all_option.click() # Получить текущую дату и время для имени файла current_time = datetime.now() timestamp = current_time.strftime("%Y%m%d_%H%M%S") #сохраняем файлы .csv в папку архива каталог = "Архив помощников" если нет os.path.exists(каталог): os.madeirs (каталог) print(f"Каталог '{каталог}' создан") # Откройте новый CSV-файл с отметкой времени в имени, чтобы сохранить данные. имя файла = os.path.join(каталог, f'passing_data_{timestamp}.csv') table = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'nba-stats-content-block'))) с open(filename, 'w', newline='') как файл: писатель = csv.writer(файл) Writer.writerow(header_titles) # Записываем заголовки в CSV-файл. rows = table.find_elements(By.TAG_NAME, 'tr') для строки в строках: # Получить все столбцы строки cols = row.find_elements(By.TAG_NAME, 'td') # Запишите столбцы в CSV Writer.writerow([col.text для столбца в столбцах]) # Закрываем драйвер драйвер.выйти() DockerFile:
# Использовать официальную среду выполнения Python в качестве родительского образа ИЗ питона: 3.11.6 #Установим рабочий каталог /app WORKDIR/home/retupmoc/PycharmProjects/EffortScraper/приложение # Скопируйте содержимое каталога PyCharmProjects в контейнер /app КОПИРОВАТЬ. . # Установите все необходимые пакеты, указанные в файле require.txt. RUN pip install --upgrade pip \ && pip install -r требования.txt # Удалить существующий драйвер geckodriver из PATH, если он присутствует. ВЫПОЛНИТЬ rm /usr/local/bin/geckodriver || истинный # Установите GeckoDriver ЗАПУСК wget https://github.com/mozilla/geckodriver/ ... x64.tar.gz \ && tar -zxvf geckodriver-v0.33.0-linux64.tar.gz \ && драйвер mv geckodriver /usr/local/bin/ \ && rm geckodriver-v0.33.0-linux64.tar.gz # Определить переменную среды ENV NAME комбоFetch # Запускаем сценарии dimeFetch иboundFetch по умолчанию при запуске контейнера CMD ["python", "dimeFetch/AssistFetch.py"]