[Python] Scraping dans AWS Lambda

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

Script d'exécution

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

Json passé à l'argument

Non utilisé cette fois, mais utilisé lors du passage d'arguments comme event ["key1"]

event.json


{
  "key3": "value3",
  "key2": "value2",
  "key1": "value1"
}

Paramètres Lambda JSON

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$"
  ]
}

Dépendances

Insérez uniquement du sélénium avec pip. Enregistrez phantomjs en tant que binaire.

requirements.txt


selenium

Commande d'exécution locale

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

commande de déploiement

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

[Python] Scraping dans AWS Lambda
Ecrire une fonction AWS Lambda en Python
Grattage au sélénium en Python
Grattage avec chromedriver en python
Grattage avec du sélénium en Python
Grattage avec Tor en Python
Web scraping à l'aide d'AWS lambda
[Scraping] Scraping Python
[Python] Retry processing (Exponential Backoff) mémo dans AWS Lambda
Récapitulatif si vous utilisez AWS Lambda (Python)
Scraping avec Selenium en Python (Basic)
Exécutez Python selon la planification sur AWS Lambda
Notifier HipChat avec AWS Lambda (Python)
Python en optimisation
CURL en Python
Mémo de raclage Python
Scraping Python get_ranker_categories
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
Utiliser l'impression dans l'expression lambda Python2
Grattage avec Python
Méta-analyse en Python
Unittest en Python
Grattage avec Python
Obtention d'informations d'identification AWS temporaires en PHP, Python
Époque en Python
Discord en Python
Python racle eBay
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Bonnes pratiques pour la journalisation au format JSON sur AWS Lambda / Python
Programmation avec Python
Plink en Python
[Couches Python / AWS Lambda] Je souhaite réutiliser uniquement le module dans AWS Lambda Layers
Constante en Python
Grattage Python get_title
Scraping de sites Web à l'aide de JavaScript en Python
FizzBuzz en Python
J'ai comparé Node.js et Python lors de la création d'une miniature à l'aide d'AWS Lambda
Sqlite en Python
Python: grattage partie 1
Étape AIC en Python
[Python] Exécutez Headless Chrome sur AWS Lambda
LINE-Bot [0] en Python
Connectez-vous à s3 avec AWS Lambda Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3