プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Python
  • 【Python】Scrapy Item、Item Loader、Item pipeline…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Python】Scrapy Item、Item Loader、Item pipelineの基本

06.09

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

Scrapy Itemとは?

  • Webサイトから取得したデータを格納する入れ物(オブジェクト)
  • あらかじめ定義したフィールドに対してデータを定義する。
  • データ構造を正確に保つことができる。(定義していないフィールドに値を入れようとするとエラーになる。)
  • Item pipelineを使ってデータクレンジング、チェック、DB保存などを行うことができます。
  • データの格納にはItem Loaderを用いて取得したデータの数値変換など便利機能を使えます。

Item Loaderのメリット

Spiderに直接取得データの変換処理を記述しても良いのですが、それだと複数Spiderを作る場合にコードの共有ができません。またspiderのコードの肥大化防止にも繋がるのでScrapyのコードの品質向上につながります。

Itemの定義

以下のファイルを編集します。

1
projects/プロジェクト名/プロジェクト名/items.py

記述

以下のような感じで定義します。

1
2
3
4
5
6
import scrapy
 
class BookItem(scrapy.Item):
    title = scrapy.Field()
    price = scrapy.Field()
    pass

Itemを使う。

1
2
3
4
5
6
7
8
from プロジェクト名.items import BookItem
 
class BooksSpider(CrawlSpider):
    def parse_item(self, response):
        loader = ItemLoader(Item=BookItem(), response = response)
        loader.add.xpath('title','titleを取得するXPath')
        loader.add.xpath('price','priceを取得するXPath')
        yield loader.load_item()

loader = ItemLoader(Item=BookItem(), response = response)

Itemにデータを格納するのにItemLoaderを使います。

yield loader.load_item()

Webサイトから取得したデータをItemに格納する構文です。yieldで格納結果を出力しています。

実行

1
scrapy crawl spider名 -o ファイル名.json

結果

以下のような出力結果が返ります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[
    {
        "title": [
            " プロを目指す人のためのTypeScript入門―安全なコードの書き方から高度な型の使い方まで"
        ],
        "author": [
            "鈴木 僚太【著】"
        ],
        "price": [
            "¥3,278"
        ],
        "publisher": [
            "技術評論社"
        ],
        "size": [
            "サイズ B5判/ページ数 411p/高さ 24cm"
        ],
        "isbn": [
            "商品コード 9784297127473"
        ]
    },

Item Loader

文字列から数値に変換などItemに格納する前後処理を記述するために使います。input processorやoutput processorの処理もitems.pyに記述します。

items.pyへの記述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from itemloaders.processors import TakeFirst,MapCompose,Join
 
def strip_yen(element):
    if element:
        return element.replace('¥','')
    return element
 
def convert_integer(element):
    if element:
        return int(element)
    return 0
 
class BookItem(scrapy.Item):
    title = scrapy.Field(
        input_processor = MapCompose(str.lstrip),
        output_processor = Join(' ')
    )
    price = scrapy.Field(
        input_processor = MapCompose(strip_yen,convert_integer),
        output_processor = TakeFirst()
    )
    pass

input processor

XPathやCSSで取得したデータをItemに読み込みする前に何かしたい際に指定します。

  • 先頭のスペース除去など
MapCompose(実行したい関数1、実行したい関数2)

何か入力値に対してItemに格納する前に関数を実行したい場合に使います。カンマ区切りで複数関数を指定できます。

output processor

アイテムの各フィールドに格納します。Itemでは結果はlistで格納されているのでlistからの取得方法を記述します。

  • listの間に空白を加えながら結合して出力するなど
Join('間に入れる文字')

Listを結合して出力します。

TakeFirst

Listから最初の要素を取得します。

Item pipeline

Itemのデータクレンジング、チェック、DB保存などを行うことができます。

pipelineで使えるメソッド

from_crawler(cls,crawler) クラスメソッド。pipelineがインスタンス化される際に実行される。
open_spider(self,spider) spiderの開始時に実行
process_item(self,item,spider) 全てのitem pipelineに対して実行
close_spider(self,spider)  spiderの終了時に実行

projects/プロジェクト/プロジェクト/pipelines.py

こちらのファイルにpipelineの処理は記述していきます。

以下は、itemに値が設定されているかチェックします。なかったらDropItemで例外出力します。

1
2
3
4
5
6
7
from scrapy.exceptions import DropItem
 
class CheckItemPipeline:
    def process_item(self, item, spider):
        if not item.get('itemのフィールド名'):
            return DropItem('Missing フィールド名')
        return item

設定ファイル(projects/プロジェクト/プロジェクト/settings.py)

1
2
3
4
5
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   "プロジェクト名.pipelines.CheckItemPipeline": 300,
}

用意したpipelineのclassを設定ファイルに登録します。数値が小さいほど先に実行されます。

こうすることで実行時(scrapy crawl スパイダー名)に自動的にチェックをしてくれるようになります。

スポンサーリンク
  • 2023 06.09
  • miyabisan2
  • コメントを書く
  • Python
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2023 05.30

    【Python】VSCodeで環境構築

  2. 2023 05.30

    【Python】スクレイピング結果をCSVに保存する。

  3. 2023 05.26

    【Python】主流のスクレピングライブラリ

  4. 2023 06.04

    【Python】Scrapyでspiderを作成する流れ

  5. 2023 06.11

    【Python】スプレットシート操作

  6. 2023 05.30

    【Python】Anacondaの使い方メモ

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Python】Scrapyのデバッグ方法

【NoSQL】MongoDBの基本

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • API
  • AWS
  • C++
  • CSS
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Git
  • GitLab
  • GraphQL
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • WebRTC
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー