フィード・エクスポート¶
スクレーパーを実装するときに最も頻繁に必要な機能の1つは、スクレイピングデータを適切に保存できることです。これは、他のシステムで使用されるスクレイピングデータ(一般に「エクスポートフィード」)を含む「エクスポートファイル」を生成することを意味します。
Scrapyはこの機能をすぐに使えるフィード・エクスポートで提供します。これにより、複数のシリアル化形式とストレージバックエンドを使用して、スクレイプされたアイテムを含むフィードを生成できます。
シリアル化形式¶
スクレイピングされたデータをシリアル化するために、フィードのエクスポートは アイテム・エクスポーター を使用します。 これらの形式はすぐに使用できます:
しかし、あなたは、 FEED_EXPORTERS 設定を通してサポートされているフォーマットを拡張することもできます。
JSON¶
FEEDS設定のformatキーの値:json使用されるエクスポーター:
JsonItemExporterJSONを大きなフィードで使用している場合は、 注意 :ref: この警告<json-with-large-data> を参照してください。
JSON lines¶
FEEDS設定のformatキーの値:jsonlines使用されるエクスポーター:
JsonLinesItemExporter
CSV¶
FEEDS設定のformatキーの値:csv使用されるエクスポーター:
CsvItemExporterエクスポートする列とその順序を指定するには、
FEED_EXPORT_FIELDSを使用します。 他のフィードエクスポーターもこのオプションを使用できますが、他の多くのエクスポート形式とは異なり、CSVは固定ヘッダーを使用するため、CSVでは重要です。
XML¶
FEEDS設定のformatキーの値:xml使用されるエクスポーター:
XmlItemExporter
Pickle¶
FEEDS設定のformatキーの:pickle使用されるエクスポーター:
PickleItemExporter
Marshal¶
FEEDS設定のformatキーの値:marshal使用されるエクスポーター:
MarshalItemExporter
ストレージ¶
フィード・エクスポートを使用する場合は、1つまたは複数の URIs を使用してフィードを保存する場所を定義します( FEEDS 設定を使用)。 フィードのエクスポートは、URIスキームで定義された複数のストレージ・バックエンド・タイプをサポートします。
すぐに使用できるストレージバックエンドは次のとおりです:
Googleクラウド・ストレージ(GCS) ( google-cloud-storage が必要です )
必要な外部ライブラリが利用できない場合、一部のストレージバックエンドは利用できません。 たとえば、S3バックエンドは botocore ライブラリがインストールされている場合にのみ使用できます。
ストレージURIパラメーター¶
ストレージURIには、フィードの作成時に置換されるパラメーターを含めることもできます。これらのパラメーターは次のとおりです:
%(time)s- フィードの作成時にタイムスタンプに置き換えられます%(name)s- スパイダー名に置き換えられます
他の名前付きパラメーターは、同じ名前のスパイダー属性に置き換えられます。 たとえば、フィードが作成された瞬間に %(site_id)s は spider.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スキーム:
fileURI例:
file:///tmp/export.csv必要な外部ライブラリ: なし
ローカルファイルシステムストレージ(のみ)の場合、 /tmp/export.csv のように絶対パスを指定する場合、スキームを省略できます。 ただし、これはUnixシステムでのみ機能します。
FTP¶
フィードはFTPサーバーに保存されます。
URIスキーム:
ftpURI例:
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スキーム:
s3URI例:
s3://mybucket/path/to/export.csvs3://aws_key:aws_secret@mybucket/path/to/export.csv
必要な外部ライブラリ: botocore >= 1.4.87
AWS認証情報は、URIでユーザー/パスワードとして渡すことができます。または、以下の設定を介して渡すことができます:
あなたは、この設定を使用して、エクスポートされたフィードのカスタムACLを定義することもできます:
このストレージ・バックエンドは 遅延ファイル配送 を使います。
Googleクラウド・ストレージ(GCS)¶
バージョン 2.3 で追加.
フィードは Google Cloud Storage に保存されます。
URIスキーム:
gsURI例:
gs://mybucket/path/to/export.csv
必要な外部ライブラリ: google-cloud-storage
認証の詳細については Google Cloud documentation を参照してください。
Project ID と Access Control List (ACL) は、以下の設定で設定できます:
このストレージ・バックエンドは 遅延ファイル配送 を使います。
遅延ファイル配送(Delayed file delivery)¶
先に記したように、説明したストレージ・バックエンドの一部は遅延ファイル配信(delayed file delivery)を使用します。
これらのストレージ・バックエンドは、アイテムがスクレイプされるため、フィードURIにアイテムをアップロードしません。 代わりに、Scrapyはアイテムを一時的なローカル・ファイルに書き込み、すべてのファイルの内容が書き込まれた後(つまり、クロールの最後)にのみ、そのファイルがフィードURIにアップロードされます。
これらのストレージ・バックエンドのいずれかを使用するときにアイテムの配信を早く開始したい場合は、 FEED_EXPORT_BATCH_ITEM_COUNT を使用して、ファイルごとに指定された最大アイテム数で出力アイテムを複数のファイルに分割します。そうすれば、ファイルが最大アイテム数に達するとすぐに、そのファイルがフィードURIに配信され、クロールが終了する前にアイテムの配信を開始できるようになります。
設定¶
これらは、フィードのエクスポートの構成(configuration)に使用される設定です:
FEEDS(必須)
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'],
},
}
以下は、受け入れられたキーと、そのキーが特定のフィード定義に提供されていない場合にフォールバック値として使用される設定のリストです:
format: シリアライズ・フォーマットこの設定は必須なのでフォールバック値はありません。
batch_item_count:FEED_EXPORT_BATCH_ITEM_COUNTにフォールバック。バージョン 2.3.0 で追加.
encoding:FEED_EXPORT_ENCODINGにフォールバックします。fields:FEED_EXPORT_FIELDSにフォールバックします。indent:FEED_EXPORT_INDENTにフォールバックします。item_export_kwargs: アイテム・エクスポーター・クラス に対応するキーワード引数を持つ辞書(dict)。バージョン 2.4.0 で追加.
overwrite: ファイルがすでに存在する場合、上書きするか(True)、あるいはコンテンツに追加するか(False)。デフォルト値は ストレージ・バックエンド に依存します:
ローカル・ファイルシステム:
FalseFTP:
True注釈
幾つかのFTPサーバはファイルへの追加(
APPEFTP コマンド)をサポートしていません。S3:
True(追加はサポートされていない)(appending is not supported)標準出力:
False(上書きはサポートされていません)
バージョン 2.4.0 で追加.
store_empty:FEED_STORE_EMPTYにフォールバックします。uri_params:FEED_URI_PARAMSにフォールバックします。
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 は、最もコンパクトな表現を選択します。
現在、 JsonItemExporter と XmlItemExporter のみ実装されています。つまり、 .json または .xml にエクスポートする場合です。
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_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_COUNTが0の場合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に含めるには:
あなたのプロジェクトの何処かで以下の関数を定義します:
# myproject/utils.py def uri_params(params, spider): return {**params, 'spider_name': spider.name}
あなたの設定でその関数を
FEED_URI_PARAMSに指定します:# myproject/settings.py FEED_URI_PARAMS = 'myproject.utils.uri_params'
あなたのフィードURIで
%(spider_name)sを使います:scrapy crawl <spider_name> -o "%(spider_name)s.jl"