JSONL(JSON Line)で出力する方法

FEEDを使って設定する

settings.pyに以下の設定を追記するのみ。

1
2
3
4
5
6
# FEED
FEED_EXPORTERS = {
'jsonlines': 'scrapy.exporters.JsonLinesItemExporter',
}
FEED_FORMAT = 'jsonlines'
FEED_URI = "ファイル名.jsonl"

クローラー実行中にファイル名を参照する

クローラー中で前回の実行結果を参照したい場合self.settings['FEED_URI']でファイル名を取得できる

1
2
3
4
5
6
7
import json

...略...

with open(self.settings['FEED_URI'], "r") as f:
for readline in f.readlines():
item = json.loads(readline)

設定パラメーターが古い

期待通りの動作をするが、以下の警告が表示される

1
WARNING: /usr/local/lib/python3.8/site-packages/scrapy/extensions/feedexport.py:210: ScrapyDeprecationWarning: The `FEED_URI` and `FEED_FORMAT` settings have been deprecated in favor of the `FEEDS` setting. Please see the `FEEDS` setting docs for more details

FEED_URIFEED_FORMATはすでにDeprecatedのようだ。

新しい設定としてFEEDSで、dict型で設定を行う(FEEDS)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FEEDS = {
'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'],
},
}

JSONL形式の設定を新しいFEEDSパラメーターで定義すると

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# FEED
FEED_EXPORTERS = {
'jsonlines': 'scrapy.exporters.JsonLinesItemExporter',
}

FEEDS = {
'ファイル名.jsonl': {
'format': 'jsonlines',
'encoding': 'utf8',
'store_empty': False,
'fields': None,
'indent': 4,
'item_export_kwargs': {
'export_empty_fields': True,
},
},
}