【Scrapy】quotes.toscrape.comのスパイダーを作ろう3/3

 

 

大きな流れ

フィールド(箱)を用意する→スクレイプ(抽出&送る)を用意する→整形する。

 

アーキテクト

Scrapy:クローラーを実装・運用するために欲しい機能がいろいろ用意されている
Items:抽出したいデータ構造のモデル
Spider:対象サイトへのリクエストとレスポンスのパーサー
Pipeline:抽出したデータに対する加工・保存 (など)

 

items.py とpipelines.pyを使う場合書き方がかなり変わる。スクレイプ部分でitemloderを使って抽出した値を各フィールドに格納してitem.pyに送り込まないといけない。

f:id:yukking3:20201103012740p:plain

 

add_value() の呼び出しで抽出されたデータがItemに格納されます。 

 

サンプル 
from scrapy.loader import ItemLoader
from myproject.items import Product

def parse(self, response):
    l = ItemLoader(item=Product(), response=response)
    l.add_xpath('name', '//div[@class="product_name"]')
    l.add_xpath('name', '//div[@class="product_title"]')
    l.add_xpath('price', '//p[@id="price"]')
    l.add_css('stock', 'p#stock]')
    l.add_value('last_updated', 'today') # you can also use literal values
    return l.load_item()

 Itemローダーを使用するには、まずそれをインスタンス化する必要があります。

次に Selectors を使用してItemローダーに値を収集します。

最後に適切な関数を使用してそれらの値を「結合」する。

 

今回の場合だと、

  1. //div[@class="product_name"]
  2. //div[@class="product_title"]

add_xpath() メソッドを使用して、XPathで2箇所からデータを抽出しています。

name フィールドが抽出され、price フィールドと stock フィールドも抽出される。

最後に、すべてのデータが収集されると、 ItemLoader.load_item() メソッドが呼び出され抽出されたデータがItemに格納されます。

 

 本題

f:id:yukking3:20201103013506p:plain

まずインスタンス化されている。(l = itemloader...)

h1_tagの値を抽出する。tagsの値を抽出する。

次にadd_vlueを使ってh1_tagに抽出した値を入れている。

最後にItemLoader.load_item() メソッドが呼び出され抽出されたデータがItemに格納されます。

 

items.py

f:id:yukking3:20201103014830p:plain

フィールドを準備するだけ。

pipelines.py

f:id:yukking3:20201103014913p:plain

Upper文字で出力するように加工する。

サンプル:価格の検証と価格のないアイテムのドロップ

class PricePipeline(object):

    vat_factor = 1.15

    def process_item(self, item, spider):
        if item.get('price'):
            if item.get('price_excludes_vat'):
                item['price'] = item['price'] * self.vat_factor
            return item
        else:
            raise DropItem("Missing price in %s" % item)