【Scrapy】quotes.toscrape.comのスパイダーを作ろう3/3
大きな流れ
フィールド(箱)を用意する→スクレイプ(抽出&送る)を用意する→整形する。
アーキテクト
Scrapy:クローラーを実装・運用するために欲しい機能がいろいろ用意されている
Items:抽出したいデータ構造のモデル
Spider:対象サイトへのリクエストとレスポンスのパーサー
Pipeline:抽出したデータに対する加工・保存 (など)
items.py とpipelines.pyを使う場合書き方がかなり変わる。スクレイプ部分でitemloderを使って抽出した値を各フィールドに格納してitem.pyに送り込まないといけない。
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ローダーに値を収集します。
最後に適切な関数を使用してそれらの値を「結合」する。
今回の場合だと、
//div[@class="product_name"]
//div[@class="product_title"]
add_xpath() メソッドを使用して、XPathで2箇所からデータを抽出しています。
name フィールドが抽出され、price フィールドと stock フィールドも抽出される。
最後に、すべてのデータが収集されると、 ItemLoader.load_item() メソッドが呼び出され抽出されたデータがItemに格納されます。
本題
まずインスタンス化されている。(l = itemloader...)
h1_tagの値を抽出する。tagsの値を抽出する。
次にadd_vlueを使ってh1_tagに抽出した値を入れている。
最後にItemLoader.load_item()
メソッドが呼び出され抽出されたデータがItemに格納されます。
items.py
フィールドを準備するだけ。
pipelines.py
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)