Scrapy连接Firebase Firestore存储爬取结果的相关问题咨询
Scrapy对接Firebase Firestore问题解答
1. settings.py额外配置项说明
你需要在settings.py中补充Firebase相关可配置参数,避免硬编码到业务逻辑中,后续修改参数、切换环境会更方便,推荐添加以下配置:
# Firebase服务账号密钥文件路径 FIREBASE_SERVICE_ACCOUNT = "./service_key.json" # Firebase数据库URL FIREBASE_DATABASE_URL = "https://abcdefghijklmno.firebaseio.com" # 存储爬取数据的集合名称 FIREBASE_COLLECTION = "output_data"
原有ITEM_PIPELINES配置保留即可。
2. pipelines.py代码优化
你现有的代码存在几个可修正的问题:
- 重复导入冲突:同时导入了
firebase_admin.firestore和google.cloud.firestore,会产生命名冲突,直接使用firebase_admin内置的firestore即可 - 客户端初始化效率低:每次处理item都新建firestore客户端,会大幅拖慢爬取速度,建议将客户端初始化放到类初始化阶段全局复用
- 硬编码参数维护成本高:密钥路径、数据库URL、集合名称都写死在代码中,修改时需要改动业务逻辑代码
- 缺少重复初始化校验:如果项目其他地方也初始化过firebase app,会抛出实例已存在的报错
修正后的代码如下:
import firebase_admin from firebase_admin import credentials, firestore from scrapy.exceptions import NotConfigured class FirebasePipeline: @classmethod def from_crawler(cls, crawler): # 从settings中读取配置 service_account = crawler.settings.get("FIREBASE_SERVICE_ACCOUNT") database_url = crawler.settings.get("FIREBASE_DATABASE_URL") collection_name = crawler.settings.get("FIREBASE_COLLECTION") if not all([service_account, database_url, collection_name]): raise NotConfigured("Firebase相关配置缺失,请检查settings.py") return cls(service_account, database_url, collection_name) def __init__(self, service_account, database_url, collection_name): self.collection_name = collection_name # 避免重复初始化firebase app if not firebase_admin._apps: cred = credentials.Certificate(service_account) firebase_admin.initialize_app(cred, { 'databaseURL': database_url }) # 初始化firestore客户端,全局复用 self.db = firestore.client() def process_item(self, item, spider): collection_ref = self.db.collection(self.collection_name) collection_ref.add(item.to_dict()) return item
内容的提问来源于stack exchange,提问作者Asim Raja
相关产品推荐
相关产品推荐

