5

カスタム ミドルウェアとカスタム パイプラインを使用してエントリをチェックし、Postgres DB に保存する Scrapy プロジェクトがあります。ミドルウェアは次のようになります。

class ExistingLinkCheckMiddleware(オブジェクト):

    def __init__(自己):

        ... データベースへの接続を開く

    def process_request (自己、要求、スパイダー):

        ... DB での各リクエスト チェックの前に
        ページが以前にスクレイピングされていないこと

パイプラインは似ています。

クラス MachinelearningPipeline(オブジェクト):

    def __init__(自己):

        ... データベースへの接続を開く

    def process_item(自分、アイテム、スパイダー):

        ... 項目をデータベースに保存します

問題なく動作しますが、スパイダーが終了したときにこれらのデータベース接続をきれいに閉じる方法が見つからず、イライラします。

誰もそれを行う方法を知っていますか?

4

1 に答える 1

6

それを行う最善の方法は、scrapy のシグナルSpider_closedを使用することだと思います。

from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher

class ExistingLinkCheckMiddleware(object):

    def __init__(self):
        # open connection to database

        dispatcher.connect(self.spider_closed, signals.spider_closed)

    def spider_closed(self, spider, reason):
        # close db connection

    def process_request(self, request, spider):
        # before each request check in the DB
        # that the page hasn't been scraped before

以下も参照してください。

それが役立つことを願っています。

于 2013-05-23T10:30:17.680 に答える