Scrapy中使用ItemLoder(二):簡易化的提高與理解
查看了許多關於ItemLoder的使用教學貼,整理出一些簡單,易懂的使用方法,方便小白如我的童鞋們,能夠更好更快的使用到ItemLoder。
第一步ItemLoder的使用步驟。
# ItemLoder在spider.py中使用
# 匯入ItemLoder模組
from scrapy.loder import ItemLoder
# 例項化一個loder物件
loder = ItemLoder(item={},response=response)
ItemLoder中的兩個屬性item,response。item是一個容器物件,可以是字典,也可以是items.py中的item容器物件DemoItem();response屬性是包含資料的原始碼。
def demo_item(self, response):
# print("欄位篩選")
self.response = response
# 例項化一個Itemloader物件
demo_loader = ItemLoader(item=Demo2Item(), response=response)
for key, value in xpath_set.items():
demo_loader.add_xpath(key, value.get("xpath"), **{"re": value.get("re")})
ItemLoder有三種填充資料的方式:add_xpath根據xpath填充;add_css根據css選擇器填充;add_value自定義填充。
使用方法: loder.add_xpath(欄位名,對應的xpath規則) loder.add_css(欄位名,對應的css選擇器) loder.add_value(欄位名,自定義資料)
同時 也可以新增正則的處理方式**{“re”:正則匹配規則}
填充好資料後需要將資料採集到loder中,對應的方法是: loder.load_item()
注意,load_item() 採集到的資料都是list列表型別的。 根據需求,需要對採集到的資料進行處理。
第二步,採集資料的預處理
在items.py指定需要爬取的欄位,也可以對load_item採集到的item欄位進行預處理。 title = scrapy.Field() 欄位中有兩個處理器:輸入處理器input_processor=;輸出處理器output_processor=。
自帶處理器的方法需要呼叫: from scrapy.loader.processors import TakeFirst, MapCompose, Join, Identity 使用方法如下:
# 在items.py檔案中
def cleanout_text(value):
"""清洗文字資訊"""
value = "".join(value.split())
value = re.findall("(.*\S)", value)
return value
def cleanout_source(value):
"""清洗來源資訊"""
if value != "":
return value
else:
return "無來源"
class Demo2Item(scrapy.Item):
# define the fields for your item here like:
# 新聞標題
title = scrapy.Field(
input_processor=MapCompose(cleanout_text),
output_processor=TakeFirst())
# 新聞內容
content = scrapy.Field(
input_processor=MapCompose(cleanout_text, stop_on_none=True))
ItemLoder在特定的條件下比普通的response.xpath好用,由於ItemLoder需要的是固定的引數,返回的也是固定的資料型別,相對於response.xpath的extract_first()和extract()來說更靈活,方便程式碼的後期維護和檢查。 也算是一個性能優化的方式吧。
最後,再多多一句,對於資料的處理還是放在pipelines管道中處理比較好,畢竟items中的預處理侷限性太大了。