Google Cloud Functionsでスクレイピングを自動化
###ざっくり背景
もともとFXの自動取引で使用していたお名前VPSにPythonをインストールして、Windowsのタスクスケジューラでスクレイピングを自動化していましたが、
月々1,300円払ってスクレイピングするのも馬鹿らしくなったので、Google Cloud Functionsで動かすことにしました。
色々つまずきながらも、ほぼすべてのプログラムをGoogle Cloud Functionsに移管でき、ついに最後のプログラム。
最後のものが一番の難関でした・・・Selenium使っとる
###なぜSeleniumは面倒なのか
Javascriptで生成された動的なページの場合、BeautifulSoupではソースコードをうまく取得することができないため、部分的にSeleniumを使っていました。
で、SeleniumでスクレイピングするためにはWebDriverなるものを動かさないといけない。
そのためにはWebDriverをCloud Functionsにデプロイしなければいけない。
デプロイしても権限?の問題でなぜか動かせない。
- 「Google Cloud Functions Selenium」
- 「Google Cloud Functions webdriver」
- 「GCF chromedriver」
とかとか、とにかく検索しまくって海外サイトも調べ漁っても答えが見つかりませんでした。
で、色々考えていたらPhantomJSのことを思い出しました。
PhantomJSCloud使えば一発だった
###サンプルコード
要はデプロイして手元で動かさずに、クラウドサービスに動かしてもらえばええやんって話。
payload = {'url':'https://google.com/','renderType':'HTML','outputAsJson':'true'}
payload = json.dumps(payload)
payload = urllib.parse.quote(payload, safe = '')
phantomjs_key = 'API-KEY'
url = 'https://phantomjscloud.com/api/browser/v2/' + phantomjs_key + '/?request=' + payload
pj_res = requests.get(url)
pj_res = pj_res.json()
html = pj_res["content"]["data"]
soup = BeautifulSoup(html, 'html.parser')
PhantomJSCloudは無料プランだと1日500リクエストまで使えるので、基本はBeautifulSoupでスクレイピングして、JSで作られた動的なページだけPhantomJSCloudに任せればOK。
###おまけ
Google Cloud Functions × Seleniumに関して5時間くらい調べても動かすことができなかったのですが、PhantomJSCloudという方法に気づいてからは一瞬でした。
同じ悩みを抱えている人はPhantomJSCloud使いましょう。