1. 程式人生 > >Scrapy中使用ItemLoder(二):簡易化的提高與理解

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=。

使用處理器可以對欄位進行一些預處理,根據業務需求,可以呼叫自己寫的函式方法,也可以用scrapy自帶的處理器方法。 主要理解scrapy自帶的處理器方法即可. 常用的自帶處理器方法有: Compose對每個欄位列表進行處理,處理完返回給pipelines; MapCompose對每個欄位列表中的每個元素進行處理,類似於map高階函式的作用,處理完返回給pipelines; Join() 用於將指定的元素進行拼接,預設是以空格來拼接,可以指定拼接符號,Join(","); TakeFirst() 作用是返回可迭代物件的第一個非空元素,常用於output_processor=TakeFirst()輸出處理器; Identity()作用是對欄位不做任何處理,原樣返回,一般沒卵用; Stop_on_none=True 表示遇到空元素是繼續還是中斷,一般沒什麼用O(∩_∩)O哈哈~。

自帶處理器的方法需要呼叫: 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中的預處理侷限性太大了。