はじめに
- AWS Lambda上のheadless chromeをPythonで動かす
- AWS Lambda(Python3)でSelenium + Chrome Headless + でwebスクレイピングする
ほとんど上記サイトのコピペ記事ですが、最低限動くものをまとめておきたかったので。。ほぼ作業ログです。
背景
- 単なるスクレイピングをする場合、javascript で描画される html の取得ができない。要するに動的なサイトのスクレイピングができない。
- そこで、headless なブラウザを動かすことにより、動的なサイトでもスクレイピングできるようにする。
- Phantomjs を使うものをよくみかけるが、開発がストップし、selenium も deplicated と警告を出しているので、今回は Chrome headless を使う。
手順
python インストール
詳細は省略。2.x でも 3.x でもいけると思います。
フォルダ準備
$ mkdir headless_scraping
$ cd headless_scraping
selenium のインストール
作成したフォルダに、selenium をインストールします。
mac や windows で実行すると、その OS 向けの selenium がダウンロードされるようなので、Cloud9 で以下のコマンドを実行してください。(AWS Linux 向けの selenium が欲しい)
$ pip install selenium -t .
あとは、作成されるフォルダごとダウンロードしましょう。
- selenium
- selenium-3.13.0.dist-info
serverless-chromiumのダウンロード
bin ディレクトリを作ってそこにダウンロードします。
最新版はPythonで動かない(2018年4月27日現在 [参照])ため、v.0.0-37を入れます。
$ mkdir -p bin/
$ curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
$ unzip headless-chromium.zip -d bin/
$ rm headless-chromium.zip
Chrome driver のダウンロード
$ curl -SL https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip > chromedriver.zip
$ unzip chromedriver.zip -d bin/
$ rm chromedriver.zip
lambda_function.py 作成
from selenium import webdriver
def lambda_handler(event, contxt):
options = webdriver.ChromeOptions()
options.binary_location = "./bin/headless-chromium"
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--single-process")
driver = webdriver.Chrome(
executable_path="./bin/chromedriver",
chrome_options=options
)
driver.get("https://www.google.co.jp")
return driver.title
zip化
上記全て完了すると、構成は以下のようになります。
headless_scraping
│
├── bin
│ ├── chromedriver
│ └── headless-chromium
├── lambda_function.py
├── selenium
└── selenium-3.13.0.dist-info
headless_scraping
ディレクトリで、Lambda にアップロードするファイルを zip化します。
$ zip -r upload.zip *
upload.zip というファイルができると思うので、あとはLambdaにアップロードします。
※ 10MB は超えてますが、アップロードはできます。
あとはテスト走らせてグリーンになること確認できればおっけーです。お疲れ様でした!