Scrapy Cloud はあらかじめ、デプロイできるenv
とファイルが決まっています。
しかしながら、今回はFireStoreをpipelines.py
で使用する必要があり、それを回避する方法を見つけました。
credentials.Certificate()
は、dictでも渡すことができますが、GOOGLE_APPLICATION_CREDENTIALS
の環境変数でエラーが発生してしまうので、pathを渡す必要があります。設定できる環境変数はSettings — Scrapy 2.5.0 documentationに記載されています。
crawler/__init__.pyimport 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
credentials_content = ''' ESCAPED_SERVICE_ACCOUT_JSON '''
のESCAPED_SERVICE_ACCOUT_JSON
に
でエスケープしたserviceAccount.json
の中身をそのまま貼り付けます。
crawler/models.pyimport 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)を参考にしました。
poetry add shub shub login # API key: xxxxxx shub deploy xxxxxx
結構無理やりデプロイしたので、良い方法とは言えないかもしれないです。実際に.envに定義できないので、使い勝手には欠けます。
やはり、公式にサポートされているS3に出力し、あとでデータクレンジングやDBへの保存を行うのが良いでしょう。