Несколько недель назад я работал над новым отчетом игры клиента. Платформа, предоставляющая сообщения о кампании, не имеет публичных API для создания отчетов о кампании по запросу с любым видом ключа разработчика для доступа.
Но можно запросить такие отчеты, используя их приборную панель. Я знаю, что это немного странно полагаться на UI для загрузки таких отчетов Но это был единственный способ получить доступ к ценным данным клиента.
Давайте определим требования к этой идее:
- Должен быть автономным сценарием Python для легкого выполнения и интеграции с существующими библиотеками ETL
- не должно требовать дополнительного программного обеспечения на сервере, кроме пакета Docker (это довольно гибко)
Сейчас мы готовы попробовать и построить что-то бегаемое. В этом сообщении будет использоваться конкретные библиотеки для получения доступа к процессу докена из-за конкретной версии установленного пакета в CentOS (в моем примере).
Мои требования. Atxt:
docker==2.1.0 splinter==0.7.7 timeout-decorator==0.3.3
Splinter Хорошая библиотека завершает драйверы браузера при автоматизации чего-либо на страницах.
Давайте определим класс для бега Google Chrome
Контейнер, позже мы будем использовать, прежде чем получить доступ к странице через Splinter
библиотека.
class _ChromeContainer: ''' _ChromeContainer should handle run of chrome docker container on background. Requires to have docker service on machine to pull images and run images. ''' def __init__(self): self.__image_name = "selenium/standalone-chrome:3.10.0" self.__client = docker.from_env() def run(self): ''' Startup docker container with chromedriver, waiting for running state ''' client = self.__client self.container = client.containers.run(self.__image_name, detach=True, ports={'4444/tcp': None}) @timeout_decorator.timeout(120) def waiting_up(client: docker.client.DockerClient, container): while True: container.reload() if container.status == "running": break time.sleep(1) waiting_up(client, self.container) def quit(self): ''' kills and deletes named container ''' self.container.kill() @property def public_port(self): container = self.__chrome_container.container return container.attrs["NetworkSettings"]["Ports"]["4444/tcp"][0]["HostPort"]
Теперь мы готовы использовать Splinter
и AHD _ChromeContainer
автоматизировать вашу задачу.
import timeout_decorator import docker from splinter import Browser class Worker: def __init__(self): self.__chrome_container = _ChromeContainer() def process(self): self.__chrome_container.run() self.__web_client = Browser('remote', url="http://127.0.0.1:{}/wd/hub".format(self.__chrome_container.public_port), browser='chrome') # Example for login request: try: self.__login() finally: self.__web_client.quit() self.__chrome_container.quit() def __login(self): self.__web_client.visit("http://www.example.com/login") self.__web_client.fill('developer_session[email]', 'EXAMPLE_USERNAME') self.__web_client.fill('developer_session[password]', 'EXAMPLE_PASSWORD') button = self.__web_client.find_by_id('developer_session_submit') button.click()
Это пример, и это возможно продлить подобные шаги, такие как __Login
В вашем Рабочий
класс.
Спасибо за чтение!:)
Оригинал: “https://dev.to/oivoodoo/browser-automation-using-docker-and-python-2j2o”