Depuis AWS Lambda, lorsque vous souhaitez utiliser le navigateur avec sélénium × chrome Je suis accro à la création d'un calque, alors je le posterai.
Je souhaite exécuter selenium x chrome sur AWS Lambda.
windows 10 Pro python 3.7 chromdriver 2.37 headless-chromium 64.0.3282.167
-Comment créer et appeler la fonction AWS lambda -Comment faire un programme python qui peut faire fonctionner le navigateur avec le webdriver sélénium.
Tout d'abord, les couches AWS Lambda sont comme des fonctions courantes qui peuvent être utilisées en commun depuis lamda. Il peut être appelé comme référencé à partir de l'unité principale Lambda, comme illustré ci-dessous. En supprimant une partie de la fonction, vous pouvez alléger le corps lambda. En l'allégeant, vous pouvez éviter l'inconvénient que le code ne peut pas être affiché car la capacité du jeu de modules est trop grande, par exemple, comme indiqué ci-dessous.
Cette fois, je voulais l'implémenter avec chromeDriver de python avec du sélénium, donc Créez les deux couches suivantes.
** 1. Couche qui stocke la bibliothèque de sélénium ** ** 2. Couche pour stocker chromeDriver **
↓ Configuration des couches
La méthode de fabrication est décrite ci-dessous.
Exécutez la commande suivante dans n'importe quel dossier. Je pense que vous avez déjà fait pip install sélénium, Comme c'est une tâche de préparer la bibliothèque à installer, cela se fait dans un endroit différent du module d'exécution.
Préparation du module sélénium
pip install -t ./python/lib/python3.7/site-packages selenium
Zip à partir du dossier python.
Créez une nouvelle couche à partir de l'écran de la console lambda. Au moment de la création, spécifiez le fichier zip de 3 et créez-le.
Reportez-vous aux couches créées en 4 à partir de la fonction Lambda. Si vous sélectionnez ** Custom Layer ** dans l'écran des paramètres de la couche, il sera affiché dans les options.
Appel de lambda avec import.
déclaration d'importation
from selenium import webdriver
Si la configuration ci-dessus est incorrecte, l'erreur suivante se produit.
déclaration d'erreur
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'selenium'
Préparez le pilote officiellement distribué (2 points). Distributeur chromdriver: https://chromedriver.storage.googleapis.com/index.html?path=2.37/ Distributeur headless-chrome: https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip
Placez les deux points ci-dessus dans le même dossier et fermez-les dans un environnement Linux.
Si vous le zippez dans un environnement Windows, vous obtiendrez l'erreur suivante même si vous exécutez lamda. Même dans l'environnement Linux, si l'autorisation de chaque fichier n'est pas 777, l'erreur suivante se produira.
déclaration d'erreur
[ERROR] WebDriverException: Message: 'chromedriver' executable may have wrong permissions. Please see https://sites.google.com/a/chromium.org/chromedriver/home
Pour windowsPC, il existe les méthodes suivantes pour compresser dans l'environnement Linux. Je pourrais faire l'un ou l'autre.
Reportez-vous aux couches créées en 4 à partir de la fonction Lambda.
Appelez depuis lambda en spécifiant le chemin suivant. Dans la spécification des couches AWS Lambda, il se trouve dans ** / opt **, spécifiez donc ce qui suit.
déclaration d'importation
driver = webdriver.Chrome(executable_path ="/opt/chromedriver", chrome_options=options)
Si le chemin est incorrect, par exemple en l'absence d'option, une erreur se produit.
déclaration d'erreur
[ERROR] WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
Le lamda et le sélénium sont lents, définissez donc la valeur de temporisation de lamda sur une valeur plus longue. La valeur par défaut est de 3 secondes, donc il expire presque et l'erreur suivante se produit.
déclaration d'erreur
Task timed out after XX.XX seconds
Définition de la valeur du délai d'expiration
Le code final pour lamda est ci-dessous.
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")
En regardant d'autres articles, la plupart d'entre eux utilisaient serverless.yml ou cloudFormation. Je ne savais pas grand-chose à ce sujet, alors j'ai pris la méthode ci-dessus. J'espère que cela sera utile pour ceux qui installent le sélénium sans serveur pour la première fois.
Recommended Posts