Von AWS Lambda, wenn Sie den Browser mit Selen × Chrom betreiben möchten Ich bin süchtig danach, wie man eine Ebene erstellt, also werde ich sie veröffentlichen.
Ich möchte Selen x Chrom auf AWS Lambda ausführen.
windows 10 Pro python 3.7 chromdriver 2.37 headless-chromium 64.0.3282.167
Erstens sind AWS Lambda-Schichten wie allgemeine Funktionen, die von Lamda gemeinsam verwendet werden können. Es kann wie unten gezeigt vom Lambda-Hauptgerät aus als aufgerufen bezeichnet werden. Indem Sie einen Teil der Funktion ausschneiden, können Sie den Lambda-Körper leichter machen. Indem Sie es leichter machen, können Sie den Nachteil vermeiden, dass der Code nicht angezeigt werden kann, weil die Kapazität des Modulsatzes beispielsweise zu groß ist, wie unten gezeigt.
Dieses Mal wollte ich es mit chromeDriver aus Python mit Selen implementieren, also Erstellen Sie die folgenden zwei Ebenen.
** 1. Schicht, in der die Selenbibliothek gespeichert ist ** ** 2. Ebene zum Speichern von chromeDriver **
↓ Ebenenkonfiguration
Das Herstellungsverfahren wird unten beschrieben.
Führen Sie den folgenden Befehl in einem beliebigen Ordner aus. Ich denke, Sie haben bereits Selen mit Pip installiert. Da es eine Aufgabe ist, die zu installierende Bibliothek vorzubereiten, erfolgt dies an einem anderen Ort als dem Ausführungsmodul.
Vorbereitung des Selenmoduls
pip install -t ./python/lib/python3.7/site-packages selenium
Zip aus dem Python-Ordner.
Erstellen Sie neue Ebenen auf dem Lambda-Konsolenbildschirm. Geben Sie zum Zeitpunkt der Erstellung die Zip-Datei 3 an und erstellen Sie sie.
Siehe die in 4 mit der Lambda-Funktion erstellten Ebenen. Wenn Sie im Bildschirm "Ebeneneinstellungen" die Option "Benutzerdefinierte Ebene **" auswählen, wird diese in den Optionen angezeigt.
Anruf von Lambda mit Import.
Importanweisung
from selenium import webdriver
Wenn die obige Konfiguration falsch ist, tritt der folgende Fehler auf.
Fehleranweisung
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'selenium'
Bereiten Sie den offiziell verteilten Treiber vor (2 Punkte). Chromdriver-Händler: https://chromedriver.storage.googleapis.com/index.html?path=2.37/ Headless-Chrom-Distributor: https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip
Platzieren Sie die beiden oben genannten Punkte in demselben Ordner und komprimieren Sie sie in einer Linux-Umgebung.
Wenn Sie es in einer Windows-Umgebung komprimieren, wird der folgende Fehler angezeigt, auch wenn Sie lamda ausführen. Selbst in der Linux-Umgebung tritt der folgende Fehler auf, wenn die Berechtigung jeder Datei nicht 777 ist.
Fehleranweisung
[ERROR] WebDriverException: Message: 'chromedriver' executable may have wrong permissions. Please see https://sites.google.com/a/chromium.org/chromedriver/home
Für WindowsPC gibt es die folgenden Methoden zum Komprimieren in der Linux-Umgebung. Ich könnte es auch tun.
Siehe die in 4 mit der Lambda-Funktion erstellten Ebenen.
Rufen Sie es auf, indem Sie den folgenden Pfad von Lambda angeben. In der Spezifikation der AWS Lambda-Schichten wird sie in ** / opt ** platziert. Geben Sie daher Folgendes an.
Importanweisung
driver = webdriver.Chrome(executable_path ="/opt/chromedriver", chrome_options=options)
Wenn der Pfad falsch ist, z. B. wenn keine Option vorhanden ist, tritt ein Fehler auf.
Fehleranweisung
[ERROR] WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
Sowohl Lamda als auch Selen sind langsam. Stellen Sie daher den Timeout-Wert von Lamda auf einen längeren Wert ein. Der Standardwert ist 3 Sekunden, daher tritt fast eine Zeitüberschreitung auf und der folgende Fehler tritt auf.
Fehleranweisung
Task timed out after XX.XX seconds
Einstellen des Timeout-Werts
Der endgültige Code für Lamda ist unten.
lamda_function.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def lambda_handler(event, context):
LINE_NOTIFY_URL = "https://notify-api.line.me/api/notify"
options = Options()
options.binary_location = '/opt/headless-chromium'
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--single-process')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(executable_path ='/opt/chromedriver', chrome_options=options)
driver.get("https://xxxxxxxxxxx")
Bei anderen Artikeln verwendeten die meisten serverless.yml oder cloudFormation. Ich wusste nicht viel darüber, also habe ich die obige Methode gewählt. Ich hoffe, es ist hilfreich für diejenigen, die Selen zum ersten Mal ohne Server installieren.
Recommended Posts