編集: 公式ドキュメントは古くなっているようで、フィールドのデフォルト値はもう機能しません ( https://github.com/scrapy/scrapy/issues/560を参照)。別のオプションは、パイプラインを使用してデフォルト値を項目に割り当てることです。
def parse_item(self, item, spider):
if "prod_specs" not in item: item['prod_specs'] = []
return item
またはpsycopg2挿入中:
def parse_item(self, item, spider):
cur.execute("insert into mytable(prod_specs) values(%s)",
item.get('prod_specs',[]))
return
ItemLoader をアイテムとして使用しようとしています。アイテムとアイテムローダーをセットアップする方法は次のとおりです。
アイテム.py
from scrapy.item import Field, Item
from scrapy.contrib.loader.processor import MapCompose
class Product(Item):
prod_specs = Field(
default=[],
input_processor=MapCompose(unicode_to_str, strip_tabs_new_lines)
)
スパイダー/myspider.py
from scrapy.contrib.loader import ItemLoader
from myproject.items import Product
def parse(self, response):
l = MyLoader(item=Product(), response=response)
l.add_xpath('prod_specs', '//div[@class="prod_specs"]')
return l.load_item()
多くの異なるアイテムを使用する場合は、ItemLoader をサブクラス化し、デフォルト プロセッサを定義する必要があります。
あなたの質問に答えるにはそれで十分ですか?Postgres パイプラインを書きたいとおっしゃいました。私が最も簡単だと思ったのは、SQLAlchemy を使用することです。この方法では、単一のパイプラインで、必要な数のデータベースに多くのオブジェクトを書き込むことができます。