私はscrapyとsqlalchemyを使用しています。私のスパイダーのでは、私はテーブルから選択することだし、とのリクエストを作成する:あなたは、私は、各scrapy要求とSQLAlchemyの行オブジェクトを渡している見ることができるようにScalarでSqlalchemyを使用してテーブル行を更新する
def start_requests(self):
db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db"
source_table= self.table
engine = create_engine(db_path)
Base = declarative_base()
# metadata = Base.metadata
# Look up the existing tables from database
Base.metadata.reflect(engine)
# Create class that maps via ORM to the database table
table = type(source_table, (Base,), {'__tablename__': source_table})
Session = sessionmaker(bind=engine)
session = Session()
i = 0
for row in session.query(table).filter(table.url.contains('http')).limit(3):
i += 1
print(row.url)
yield Request(url=row.url, headers= headers, callback=self.get_PDF,meta={'session': session,'row': row, 'cookiejar': i },dont_filter = True)
。各行オブジェクトには、空白のフィールドが含まれています。空白のフィールドは、スクラップレスポンスから更新します
def get_PDF(self, response):
row = response.meta['row']
row.field1 = response.field1 # simplified pseudocode
ここで、その変更がdbに格納されるように行オブジェクトを更新したいと思います。 セッションオブジェクトを渡していたら、私はsession.commit()を実行できます。 row_objectでこれを行う最善の方法は何ですか?セッションオブジェクトを渡す必要がありますか?
編集:それはあるとして、
def get_PDF(self, response):
row = response.meta['row']
session = response.meta['session']
row =process_output(o, row)
session.add(row)
session.commit()
セッションオブジェクトをスパイダー内に作成することができます(たとえば 'start_requests'など)。これをパイプラインで使用することもできます。 – eLRuLL
@ user61629私の更新された回答を確認してください – eLRuLL
上記の私の編集をご覧ください。これはうまくいきますが、私はセッションオブジェクトの複数のコピーを作成することに懸念があるので、私はパイプラインの使用についてあなたのポイントを見ています。この場合、私は2段階のプロセスを持っています。私の最初のスパイダーは情報の90%をいくつかの空白のフィールドで項目を埋めるようにします。次に、2番目のスパイダーを使用して、最後の2つのフィールドを埋めるために、より集中的な操作を行います。私は最初のスパイダーのためにItemsとパイプラインを使用しますが、パイプラインを2回目に送信する行をアイテムに変換するのではなく、sqlalchemyを直接使用するコードが少なくて済むように思えました。 – user61629