[PYTHON] Selen läuft in 15 Minuten

Selen in 10 Minuten zu verstehen war sehr hilfreich, deshalb habe ich eine kleine Fortsetzung ohne Erlaubnis gemacht.

Ziele dieses Artikels

[Methode 1 von "Selen in 10 Minuten zu verstehen"](https://qiita.com/Chanmoro/items/9a3c86bb465c1cce738a#%E6%96%B9%E6%B3%951-doceker-%E3%81%A7% Laut E7% 92% B0% E5% A2% 83% E6% A7% 8B% E7% AF% 89) dauert es einige Zeit, um die Umgebung aufzubauen, indem eine Verbindung zu dem zuvor erstellten und verschobenen Selenium Docker-Container hergestellt wird. Sie können sich leicht mit Selen anlegen, ohne es zu müssen. Der Docker-Container funktioniert jedoch auch nach Verwendung des Selenium-Skripts weiter, und Sie müssen ihn selbst beenden.

In diesem Artikel werden wir den Prozess des Stoppens und Löschens des Docker-Containers nach dem Ausführen des Skripts automatisieren. Also ** Es ist eine Lüge, dass dieser Artikel ein Selen-Artikel ist. ** Titelbetrug. Es tut uns leid.

Dieser Artikel zeigt Ihnen eine gute Möglichkeit, mit einem Docker-Container mit dem Docker SDK für Python unter Selen zu arbeiten. ..

TL;DR Installieren Sie zunächst Docker SDK für Python.

pip install docker
import docker
import time
from selenium import webdriver
from contextlib import contextmanager

SELENIUM_IMAGE = 'selenium/standalone-chrome:3.141.59-xenon'


@contextmanager
def selenium_container():
    client = docker.from_env()
    try:
        selenium_image = client.images.get(SELENIUM_IMAGE)
    except docker.errors.ImageNotFound:
        selenium_image = client.images.pull(SELENIUM_IMAGE)

    container = client.containers.run(
        selenium_image, detach=True, remove=True,
        ports={4444: 4444}, shm_size='2g')
    try:
        while b'Selenium Server is up' not in container.logs():
            time.sleep(0.1)
        yield container
    finally:
        container.kill()


@contextmanager
def selenium_driver():
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    driver = webdriver.Remote(
        command_executor='http://localhost:4444/wd/hub',
        desired_capabilities=options.to_capabilities(),
        options=options,
    )
    try:
        yield driver
    finally:
        driver.quit()


def test():
    with selenium_container(), selenium_driver() as driver:
        driver.get('https://qiita.com')
        print(driver.current_url)


if __name__ == '__main__':
    test()

Kommentar

contextmanager

@contextmanager
def selenium_container():

Ich habe contextlib.contextmanager verwendet, um den Container normal zu beenden, selbst wenn ein Fehler auftritt. Gleiches gilt für den Webdriver.

Holen Sie sich das Docker-Image

    client = docker.from_env()
    try:
        selenium_image = client.images.get(SELENIUM_IMAGE)
    except docker.errors.ImageNotFound:
        selenium_image = client.images.pull(SELENIUM_IMAGE)

Holen Sie sich zuerst das Selenium Docker-Bild. Wenn Sie es noch nicht gezogen haben, ziehen Sie es zuerst.

docker run

    container = client.containers.run(
        selenium_image, detach=True, remove=True,
        ports={4444: 4444}, shm_size='2g')

Dies entspricht "Docker-Lauf -d -p 4444: 4444 --shm-Größe = 2 g Selen / Standalone-Chrom: 3.141.59-Xenon".

docker kill

    try:
        while b'Selenium Server is up' not in container.logs():
            time.sleep(0.1)
        yield container
    finally:
        container.kill()

Da wir "remove = True" übergeben, geht "client.containers.run ()" zum nächsten Schritt über, sobald wir den Docker-Container starten. Daher ist Webdriver zu diesem Zeitpunkt noch nicht bereit. Zuerst müssen Sie warten, bis es fertig ist. Wenn die Vorbereitung abgeschlossen ist, gibt das Docker-Containerprotokoll "06: 53: 00.628" aus. INFO [SeleniumServer.boot] - Selenium Server ist auf Port 4444 usw. in Betrieb. Drehen Sie also die while-Schleife, bis diese Ausgabe erhalten wird. Warten Sie [^ 1].

[^ 1]: Docker SDK für Python-Dokumentation hat logs () Es ist geschrieben, dass return str, aber bitte beachten Sie, dass es zum Zeitpunkt des Schreibens des Artikels aus irgendeinem Grund bytes zurückgibt.

Wenn Sie bereit sind, geben Sie den Behälter. Dieser erhaltene Container kann als mit selenium_container () als Container referenziert werden:. Die Verarbeitung von selenium_driver wird angehalten, wenn ein Container ausgegeben wird, und wartet, bis er den with-Block verlässt. Wenn der Prozess abgeschlossen ist oder ein Fehler innerhalb des with-Blocks auftritt und den with-Block verlässt, wird der selenium_driver erneut gestartet und die container.kill () des finally-Blocks ausgeführt. Ich werde das machen.

Zusammenfassung

Jetzt müssen Sie nicht mehr vergessen, den Docker-Container oder den Webdriver zu beenden. Hab ein gutes Selenleben!

Recommended Posts

Selen läuft in 15 Minuten
Lerne Pandas in 10 Minuten
Schaben mit Selen in Python
Scraping mit Selen in Python
Wrapper mit Hadoop in Python
Starten Sie in 5 Minuten GIMP Python-Fu
Scraping mit Selen in Python (Basic)
Problem, bei dem Apscheduler zweimal in Flask ausgeführt wurde - gefixt
Lassen Sie uns BERT in etwa 30 Minuten erleben.
Kratzen mit schöner Suppe in 10 Minuten
Schreiben Sie Selentestcode in Python
Ich habe versucht, GAN in Colaboratory auszuführen
Machen Sie matplotlib in 3 Minuten mit Japanisch kompatibel
Stellen Sie Django in 3 Minuten mit Docker-Compose bereit
[Verständnis in 3 Minuten] Der Beginn von Linux
[Python] Pandas in 10 Minuten vollständig zu verstehen
Ich kann das Element in Selen nicht bekommen!
Grundlagen zum Ausführen von NoxPlayer in Python
Djangos External Key Tutorial in 10 Minuten
Screenshots des Webfischens mit Selen und Chrom.
Holen Sie sich die Cloud-Protokollierung in Python in 10 Minuten
Einfrieren mit send_keys der Dateiauswahl beim Ausführen des Selenium Web Driver in Python [PhantomJS]