Scraping Cloud × FireStore serviceAccout.json をデプロイする

ツイート
2021年07月26日
2021年07月27日

Scrapy Cloud はあらかじめ、デプロイできるenvとファイルが決まっています。 しかしながら、今回はFireStoreをpipelines.pyで使用する必要があり、それを回避する方法を見つけました。

credentials.Certificate()は、dictでも渡すことができますが、GOOGLE_APPLICATION_CREDENTIALSの環境変数でエラーが発生してしまうので、pathを渡す必要があります。設定できる環境変数はSettings — Scrapy 2.5.0 documentationに記載されています。

ステップ1 デプロイ時にserviceAccount.jsonの生成

crawler/__init__.py
import os path = "{}/serviceAccount.json".format(os.getcwd()) credentials_content = ''' ESCAPED_SERVICE_ACCOUT_JSON ''' with open(path, "w") as text_file: text_file.write(credentials_content) os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = path

ステップ2 serviceAccount.json のエスケープ&ペースト

py
credentials_content = ''' ESCAPED_SERVICE_ACCOUT_JSON '''

ESCAPED_SERVICE_ACCOUT_JSON

https://www.freeformatter.com/json-escape.html

でエスケープしたserviceAccount.jsonの中身をそのまま貼り付けます。

ステップ3 path の import

crawler/models.py
import firebase_admin from firebase_admin import credentials, firestore from crawler import path cred = credentials.Certificate(path) firebase_admin.initialize_app(cred) db = firestore.Client()

Scrapy Cloudは、models.pyもデプロイできます。ここで、FireStoreのモデルを定義し、pipelines.pyに渡しています。A Minimalist End-to-End Scrapy Tutorial (Part III)を参考にしました。

Scrapy Cloud にデプロイ

sh
poetry add shub shub login # API key: xxxxxx shub deploy xxxxxx

最後に

結構無理やりデプロイしたので、良い方法とは言えないかもしれないです。実際に.envに定義できないので、使い勝手には欠けます。

やはり、公式にサポートされているS3に出力し、あとでデータクレンジングやDBへの保存を行うのが良いでしょう。

参考