Python
スクレイピング
headless

【Python】Chrome headlessで動的サイトのスクレイピング on AWS Lambda

はじめに

ほとんど上記サイトのコピペ記事ですが、最低限動くものをまとめておきたかったので。。ほぼ作業ログです。

背景

  • 単なるスクレイピングをする場合、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

download.png

serverless-chromiumのダウンロード

bin ディレクトリを作ってそこにダウンロードします。

最新版はPythonで動かない(2018年4月27日現在 [参照])ため、v.0.0-37を入れます。

引用: https://qiita.com/nabehide/items/754eb7b7e9fff9a1047d

$ 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にアップロードします。

スクリーンショット 2018-07-11 10.54.43.png

※ 10MB は超えてますが、アップロードはできます。

あとはテスト走らせてグリーンになること確認できればおっけーです。お疲れ様でした!