Несколько недель назад я работал над новым отчетом игры клиента. Платформа, предоставляющая сообщения о кампании, не имеет публичных 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”