Préparez un environnement pour le scraping avec la pile suivante pour prendre en charge les sites avec Javascript
Bibliothèque requise Exécution locale
pip install python-lambda-local
Déployer
pip install lambda-uploader
Si vous souhaitez l'essayer rapidement, veuillez visiter le référentiel suivant https://github.com/akichim21/python_scraping_in_lambda
selenium (driver: phantomjs) est utilisé pour générer du HTML exécuté par js et extraire le titre. Enfin, un script qui tue juste phantomjs avec close () et quit ().
lambda_function.py
#!/usr/bin/env python
import time # for sleep
import os # for path
import signal
import selenium
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
def lambda_handler(event, context):
# set user agent
user_agent = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36")
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = user_agent
dcap["phantomjs.page.settings.javascriptEnabled"] = True
browser = webdriver.PhantomJS(
service_log_path=os.path.devnull,
executable_path="./phantomjs",
service_args=['--ignore-ssl-errors=true', '--load-images=no', '--ssl-protocol=any'],
desired_capabilities=dcap
)
browser.get('http://google.com')
title = browser.title
browser.close()
browser.quit()
return title
Non utilisé cette fois, mais utilisé lors du passage d'arguments comme event ["key1"]
event.json
{
"key3": "value3",
"key2": "value2",
"key1": "value1"
}
Créer et remplacer le rôle. Cette fois, ce n'est pas 50 Mo ou plus, donc je n'utiliserai pas s3, mais si j'utilise d'autres bibliothèques, ce sera bientôt 50 Mo ou plus, donc s3 est requis. Si vous définissez s3_bucket, le fichier sera téléchargé via s3.
Comme le nom est souvent utilisé lors de l'exécution, utilisez un nom approprié en production. Réglez la mémoire, le délai, etc. de manière appropriée en fonction du script.
lambda.json
{
"name": "python_scraping_test",
"description": "python_scraping_test",
"region": "ap-northeast-1",
"runtime": "python2.7",
"handler": "lambda_function.lambda_handler",
"role": "arn:aws:iam::00000000:role/lambda_basic_execution",
"timeout": 60,
"memory": 128,
"variables": {
"production": "True"
},
"ignore": [
"\\.git.*",
"/.*\\.pyc$",
"/.*\\.zip$"
]
}
Insérez uniquement du sélénium avec pip. Enregistrez phantomjs en tant que binaire.
requirements.txt
selenium
Exécuter en utilisant python-lambda-local f est le nom de la fonction et t est le (s) timeout (s).
python-lambda-local -f lambda_handler -l ./ -t 60 lambda_function.py event.json
résultat
[root - INFO - 2017-03-19 08:16:05,271] Event: {u'test': u'test'}
[root - INFO - 2017-03-19 08:16:05,271] START RequestId: 4e881a1b-3f7a-4de8-9afb-aee6f6b5dac6
[root - INFO - 2017-03-19 08:16:06,766] END RequestId: 4e881a1b-3f7a-4de8-9afb-aee6f6b5dac6
[root - INFO - 2017-03-19 08:16:06,766] RESULT:
Google
[root - INFO - 2017-03-19 08:16:06,766] REPORT RequestId: 4e881a1b-3f7a-4de8-9afb-aee6f6b5dac6 Duration: 1494.06 ms
Puisque ~ / .aws / credentials sont utilisés, s'il n'est pas défini, définissez-le
Installer si aws-cli n'existe pas
pip install awscli
aws configure
Si virtualenv comme conda est dans un endroit spécial, gardez une trace de l'endroit. Emplacement
pip show virtualenv
lambda-uploader
##Si virtualenv est un emplacement spécial, prenez le répertoire Location comme argument(Quand vagrant, anaconda3, env sont py2, ça ressemble à ça
lambda-uploader --virtualenv=/home/vagrant/.pyenv/versions/anaconda3-4.1.0/envs/py2/lib/python2.7/site-packages
Recommended Posts