Scrapy Item Loaders
最近在搞通用爬蟲,這裡記錄一下Item Loaders。
概述
ofollow,noindex">Items 提供儲存抓取資料的容器 , 而 Item Loaders提供的是 填充 容器的機制
作用
使用
ItemLoader接受引數:

image.png
可以接受一個selector,也可以接受一整個response。
from scrapy.contrib.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 demo_item = l.load_item() return demo_item
以上程式碼,填充完的demo_item每一項的value都是一個list。
因為之前demo_item中的資料都是list,但是一般我們需要自己處理資料,所以可在item.py中,這樣操作:
from scrapy.contrib.loader.processor import Join, MapCompose, TakeFirst class NewsItem(Item): """ input_processor 當itme這個欄位的值傳遞進來時,在傳遞進來的值上做預處理 TakeFirst取列表第一個元素 MapCompose 連續呼叫兩個函式,或者傳遞任意多的函式 """ post_title = Field( input_processor=Join(), output_processor=TakeFirst() )
input_processor : 當itme這個欄位的值傳遞進來時,在傳遞進來的值上做預處理。
output_processor : 當itme這個欄位的值傳遞走時,在原值上做處理。
Scrapy 內建的一些 常用的處理器
- Identity :最簡單的處理器,它什麼都不做。它返回原始值不變。它不接收任何建構函式引數,也不接受Loader上下文。
- 從接收的值返回第一個非null /非空值,因此它通常用作單值欄位的輸出處理器。它不接收任何建構函式引數,也不接受Loader上下文
- Join :返回與建構函式中給定的分隔符連線的值,預設為。它不接受Loader上下文
- Compose :組合處理功能,該處理器的每個輸入值都被傳遞給第一個函式,並且該函式的結果被傳遞給第二個函式,依此類推,直到最後一個函式返回該處理器的輸出值。預設情況下,停止處理None值。可以通過傳遞關鍵字引數來更改此行為stop_on_none=False
- MapCompose :連續呼叫兩個或多個函式,可以呼叫自定義的函式
重寫ItemLoader
我們也可以重寫ItemLoader,
class NewsLoader(ItemLoader): default_output_processor = TakeFirst name_in = MapCompose(unicode.title) name_out = Join() price_in = MapCompose(unicode.strip) . . .
輸入處理器使用_in字尾宣告,而輸出處理器使用_out字尾宣告
還可以使用 ItemLoader.default_input_processor
和 ItemLoader.default_output_processor
屬性宣告預設的輸入/輸出處理器 。
重寫ItemLoader的意義在於:
當我們在itme.py中定義了很多欄位時,需要對每個欄位做同樣的處理,這時候如果每個欄位都寫處理邏輯就會很麻煩,不如直接在初始化ItemLoader時就寫好處理邏輯,但是對於各別欄位又不需要初始化時定義的邏輯,可以在item.py中過載,即可。
輸入和輸出處理器的優先順序如下:
- Item Loader特定於欄位的屬性:
field_in
和field_out
(最優先) - 欄位元資料(
input_processor
和output_processor
鍵) - Item Loader預設值:
ItemLoader.default_input_processor()
和ItemLoader.default_output_processor()
(最少優先順序)
如果文件對您有幫助,請點個贊,關注作者,持續更新更多騷操作指南~~
如有問題請評論留言。