フィード・エクスポート

スクレーパーを実装するときに最も頻繁に必要な機能の1つは、スクレイピングデータを適切に保存できることです。これは、他のシステムで使用されるスクレイピングデータ(一般に「エクスポートフィード」)を含む「エクスポートファイル」を生成することを意味します。

Scrapyはこの機能をすぐに使えるフィード・エクスポートで提供します。これにより、複数のシリアル化形式とストレージバックエンドを使用して、スクレイプされたアイテムを含むフィードを生成できます。

シリアル化形式

スクレイピングされたデータをシリアル化するために、フィードのエクスポートは アイテム・エクスポーター を使用します。 これらの形式はすぐに使用できます:

しかし、あなたは、 FEED_EXPORTERS 設定を通してサポートされているフォーマットを拡張することもできます。

JSON

  • FEEDS 設定の format キーの値: json

  • 使用されるエクスポーター: JsonItemExporter

  • JSONを大きなフィードで使用している場合は、 注意 :ref: この警告<json-with-large-data> を参照してください。

JSON lines

CSV

  • FEEDS 設定の format キーの値: csv

  • 使用されるエクスポーター: CsvItemExporter

  • エクスポートする列とその順序を指定するには、 FEED_EXPORT_FIELDS を使用します。 他のフィードエクスポーターもこのオプションを使用できますが、他の多くのエクスポート形式とは異なり、CSVは固定ヘッダーを使用するため、CSVでは重要です。

XML

Pickle

Marshal

ストレージ

フィード・エクスポートを使用する場合は、1つまたは複数の URIs を使用してフィードを保存する場所を定義します( FEEDS 設定を使用)。 フィードのエクスポートは、URIスキームで定義された複数のストレージ・バックエンド・タイプをサポートします。

すぐに使用できるストレージバックエンドは次のとおりです:

必要な外部ライブラリが利用できない場合、一部のストレージバックエンドは利用できません。 たとえば、S3バックエンドは botocore ライブラリがインストールされている場合にのみ使用できます。

ストレージURIパラメーター

ストレージURIには、フィードの作成時に置換されるパラメーターを含めることもできます。これらのパラメーターは次のとおりです:

  • %(time)s - フィードの作成時にタイムスタンプに置き換えられます

  • %(name)s - スパイダー名に置き換えられます

他の名前付きパラメーターは、同じ名前のスパイダー属性に置き換えられます。 たとえば、フィードが作成された瞬間に %(site_id)sspider.site_id 属性に置き換えられます。

以下に例を示します:

  • スパイダーごとに1つのディレクトリを使用してFTPに保存します:

    • ftp://user:password@ftp.example.com/scraping/feeds/%(name)s/%(time)s.json

  • スパイダーごとに1つのディレクトリを使用してS3に保存します:

    • s3://mybucket/scraping/feeds/%(name)s/%(time)s.json

ストレージ・バックエンド

ローカル・ファイルシステム

フィードはローカルファイルシステムに保存されます。

  • URIスキーム: file

  • URI例: file:///tmp/export.csv

  • 必要な外部ライブラリ: なし

ローカルファイルシステムストレージ(のみ)の場合、 /tmp/export.csv のように絶対パスを指定する場合、スキームを省略できます。 ただし、これはUnixシステムでのみ機能します。

FTP

フィードはFTPサーバーに保存されます。

  • URIスキーム: ftp

  • URI例: ftp://user:pass@ftp.example.com/path/to/export.csv

  • 必要な外部ライブラリ: なし

FTPは、2つの異なる接続モードをサポートしています。アクティブまたはパッシブ(active or passive)です。Scrapyはデフォルトでパッシブ接続モードを使用します。 代わりにアクティブな接続モードを使用するには、 FEED_STORAGE_FTP_ACTIVE 設定を True に設定します。

このストレージ・バックエンドは 遅延ファイル配送 を使います。

S3

フィードは Amazon S3 に保存されます。

  • URIスキーム: s3

  • URI例:

    • s3://mybucket/path/to/export.csv

    • s3://aws_key:aws_secret@mybucket/path/to/export.csv

  • 必要な外部ライブラリ: botocore >= 1.4.87

AWS認証情報は、URIでユーザー/パスワードとして渡すことができます。または、以下の設定を介して渡すことができます:

あなたは、この設定を使用して、エクスポートされたフィードのカスタムACLを定義することもできます:

このストレージ・バックエンドは 遅延ファイル配送 を使います。

Googleクラウド・ストレージ(GCS)

バージョン 2.3 で追加.

フィードは Google Cloud Storage に保存されます。

  • URIスキーム: gs

  • URI例:

    • gs://mybucket/path/to/export.csv

  • 必要な外部ライブラリ: google-cloud-storage

認証の詳細については Google Cloud documentation を参照してください。

Project IDAccess Control List (ACL) は、以下の設定で設定できます:

このストレージ・バックエンドは 遅延ファイル配送 を使います。

標準出力

フィードは、Scrapyプロセスの標準出力に書き込まれます。

  • URIスキーム: stdout

  • URI例: stdout:

  • 必要な外部ライブラリ: なし

遅延ファイル配送(Delayed file delivery)

先に記したように、説明したストレージ・バックエンドの一部は遅延ファイル配信(delayed file delivery)を使用します。

これらのストレージ・バックエンドは、アイテムがスクレイプされるため、フィードURIにアイテムをアップロードしません。 代わりに、Scrapyはアイテムを一時的なローカル・ファイルに書き込み、すべてのファイルの内容が書き込まれた後(つまり、クロールの最後)にのみ、そのファイルがフィードURIにアップロードされます。

これらのストレージ・バックエンドのいずれかを使用するときにアイテムの配信を早く開始したい場合は、 FEED_EXPORT_BATCH_ITEM_COUNT を使用して、ファイルごとに指定された最大アイテム数で出力アイテムを複数のファイルに分割します。そうすれば、ファイルが最大アイテム数に達するとすぐに、そのファイルがフィードURIに配信され、クロールが終了する前にアイテムの配信を開始できるようになります。

設定

これらは、フィードのエクスポートの構成(configuration)に使用される設定です:

FEEDS

バージョン 2.1 で追加.

デフォルト: {}

すべてのキーがフィードURI(または pathlib.Path オブジェクト)であり、各値が特定のフィードの構成パラメータを含むネストされた辞書である辞書。

この設定は、フィード・エクスポート機能を有効にするために必要です。

サポートされているURIスキームについては、 ストレージ・バックエンド を参照してください。

例えば:

{
    'items.json': {
        'format': 'json',
        'encoding': 'utf8',
        'store_empty': False,
        'fields': None,
        'indent': 4,
        'item_export_kwargs': {
           'export_empty_fields': True,
        },
    },
    '/home/user/documents/items.xml': {
        'format': 'xml',
        'fields': ['name', 'price'],
        'encoding': 'latin1',
        'indent': 8,
    },
    pathlib.Path('items.csv'): {
        'format': 'csv',
        'fields': ['price', 'name'],
    },
}

以下は、受け入れられたキーと、そのキーが特定のフィード定義に提供されていない場合にフォールバック値として使用される設定のリストです:

FEED_EXPORT_ENCODING

デフォルト: None

フィードに使用されるエンコード。

設定されていないか None (デフォルト)に設定されている場合、歴史的な理由で、安全な数値エンコーディング( \uXXXX シーケンス)を使用するJSON出力を除く、すべてでUTF-8を使用します。

JSONにもUTF-8が必要な場合は utf-8 を使用します。

FEED_EXPORT_FIELDS

デフォルト: None

エクスポートするフィールドのリスト。オプション。 例: FEED_EXPORT_FIELDS = ["foo", "bar", "baz"]

FEED_EXPORT_FIELDSオプションを使用して、エクスポートするフィールドとその順序を定義します。

FEED_EXPORT_FIELDSが空またはNone (デフォルト)の場合、Scrapyは、あなたのスパイダーによって生成された item objects で定義されたフィールドを使用します。

エクスポーターがフィールドの固定セットを必要とする場合( CSV エクスポート形式の場合)、FEED_EXPORT_FIELDSが空またはNoneの場合、Scrapyはエクスポートされたデータからフィールド名を推測しようとします。今のところは、最初のアイテムのフィールド名を使用しています。

FEED_EXPORT_INDENT

デフォルト: 0

各レベルで出力をインデントするために使用されるスペースの量。 FEED_EXPORT_INDENT が負でない整数の場合、配列要素とオブジェクトメンバーはそのインデントレベルできれいに印刷されます。インデントレベル 0 (デフォルト)、または負の場合、各アイテムは新しい行に配置されます。 None は、最もコンパクトな表現を選択します。

現在、 JsonItemExporterXmlItemExporter のみ実装されています。つまり、 .json または .xml にエクスポートする場合です。

FEED_STORE_EMPTY

デフォルト: False

空のフィード(つまり、アイテムのないフィード)をエクスポートするかどうか。

FEED_STORAGES

デフォルト: {}

プロジェクトでサポートされている追加のフィードストレージバックエンドを含む辞書。 キーはURIスキームであり、値はストレージクラスへのパスです。

FEED_STORAGE_FTP_ACTIVE

デフォルト: False

フィードをFTPサーバーにエクスポートするときにアクティブ接続モードを使用するか( True )、代わりにパッシブ接続モードを使用するか( False 、デフォルト)。

FTP接続モードについては、アクティブFTPとパッシブFTPの違いは何ですか?(What is the difference between active and passive FTP?)を参照してください。

FEED_STORAGE_S3_ACL

デフォルト: '' (空文字列)

プロジェクトによってAmazon S3にエクスポートされたフィードのカスタムACLを含む文字列。

利用可能な値の完全なリストについては、Amazon S3ドキュメントの Canned ACL 節にアクセスしてください。

FEED_STORAGES_BASE

デフォルト:

{
    '': 'scrapy.extensions.feedexport.FileFeedStorage',
    'file': 'scrapy.extensions.feedexport.FileFeedStorage',
    'stdout': 'scrapy.extensions.feedexport.StdoutFeedStorage',
    's3': 'scrapy.extensions.feedexport.S3FeedStorage',
    'ftp': 'scrapy.extensions.feedexport.FTPFeedStorage',
}

Scrapyがサポートする組み込みのフィードストレージバックエンドを含む辞書。 FEED_STORAGES でURIスキームに None を割り当てることで、これらのバックエンドを無効にできます。 たとえば、組み込みのFTPストレージバックエンドを無効にするには、以下を(置換なしで) `` settings.py`` に配置します:

FEED_STORAGES = {
    'ftp': None,
}

FEED_EXPORTERS

デフォルト: {}

プロジェクトでサポートされている追加のエクスポーターを含む辞書。 キーはシリアル化形式で、値は アイテム・エクスポーター クラスへのパスです。

FEED_EXPORTERS_BASE

デフォルト:

{
    'json': 'scrapy.exporters.JsonItemExporter',
    'jsonlines': 'scrapy.exporters.JsonLinesItemExporter',
    'jl': 'scrapy.exporters.JsonLinesItemExporter',
    'csv': 'scrapy.exporters.CsvItemExporter',
    'xml': 'scrapy.exporters.XmlItemExporter',
    'marshal': 'scrapy.exporters.MarshalItemExporter',
    'pickle': 'scrapy.exporters.PickleItemExporter',
}

Scrapyでサポートされている組み込みのフィードエクスポーターを含む辞書。 FEED_EXPORTERS のシリアル化形式に None を割り当てることで、これらのエクスポーターを無効にできます。 たとえば、組み込みのCSVエクスポーターを無効にするには、以下を(置換なしで)、 settings.py に配置します:

FEED_EXPORTERS = {
    'csv': None,
}

FEED_EXPORT_BATCH_ITEM_COUNT

バージョン 2.3.0 で追加.

デフォルト: 0

0 より大きい整数が割り当てられている場合、Scrapyは複数の出力ファイルを生成し、各出力ファイルに最大指定した数のアイテムを保存します。

複数の出力ファイルを生成する場合は、フィードURIで以下のプレース・ホルダーの少なくとも1つを使用して、さまざまな出力ファイル名をどのように生成するかを示す必要があります。

  • %(batch_time)s - フィードの作成時にタイムスタンプに置き換えられます(例: 2020-03-28T14-45-08.237134 )

  • %(batch_id)d - そのバッチの1から始まるシーケンス番号に置き換えられます。

    数値形式を変更するには printfスタイルの文字列書式 を使います。例えばバッチIDをゼロ詰めの5桁の数値にするには %(batch_id)05d とします(3 なら 00003 となり、 123 なら 00123 となる)。

たとえば、設定に以下が含まれている場合:

FEED_EXPORT_BATCH_ITEM_COUNT = 100

そして、あなたの crawl (クロール)コマンドラインは:

scrapy crawl spidername -o "dirname/%(batch_id)d-filename%(batch_time)s.json"

上記のコマンドラインは、以下のようなディレクトリ・ツリーを生成できます:

->projectname
-->dirname
--->1-filename2020-03-28T14-45-08.237134.json
--->2-filename2020-03-28T14-45-09.148903.json
--->3-filename2020-03-28T14-45-10.046092.json

ここで、最初と2番目のファイルに正確に100個のアイテムが含まれている場合。最後のファイルには100個またはそれ以下の数のアイテムが含まれています。

FEED_URI_PARAMS

デフォルト: None

フィードURIに printfスタイル文字列書式 のパラメーターを設定する関数のインポート・パスを持つ文字列。

関数の識別は以下のようにしなければなりません:

scrapy.extensions.feedexport.uri_params(params, spider)

printfスタイル文字列書式 をフィードURIに適用したkey-valueペアの辞書(dict)を返す。

パラメータ
  • params (dict) --

    デフォルトのkey-valueペア達

    具体的には:

    • batch_id: ファイルバッチのID。 FEED_EXPORT_BATCH_ITEM_COUNT 参照。

      FEED_EXPORT_BATCH_ITEM_COUNT0 の場合 batch_id は常に 1

      バージョン 2.3.0 で追加.

    • batch_time: UTCの日付と時間。ISO書式ですが :- で置き換えられています。

      FEED_EXPORT_BATCH_ITEM_COUNT 参照。

      バージョン 2.3.0 で追加.

    • time: batch_time のマイクロ秒単位を 0 にセットしたもの。

  • spider (scrapy.spiders.Spider) -- フィード・アイテムのソース・スパイダー

例えば、ソース・スパイダーの name を フィードURIに含めるには:

  1. あなたのプロジェクトの何処かで以下の関数を定義します:

    # myproject/utils.py
    def uri_params(params, spider):
        return {**params, 'spider_name': spider.name}
    
  2. あなたの設定でその関数を FEED_URI_PARAMS に指定します:

    # myproject/settings.py
    FEED_URI_PARAMS = 'myproject.utils.uri_params'
    
  3. あなたのフィードURIで %(spider_name)s を使います:

    scrapy crawl <spider_name> -o "%(spider_name)s.jl"