一、Item類概述
在爬蟲框架Scrapy中,Item是用來保存爬取數據的容器。每個Item對象是一個字典(key-value形式),可以保存從網頁中獲取的信息。在爬蟲代碼中,可以定義Item的類,在處理爬蟲程序的過程中使用這個類來序列化爬取的響應並傳遞給Pipeline。
二、創建Item類
在Scrapy中,可以定義Item的類,它可以包含一個或多個欄位(field),每個欄位都代表從網頁中抓取的一部分數據,欄位可以是字元串、數字、列表、字典等數據類型。
import scrapy
class MyItem(scrapy.Item):
# 定義Item的欄位
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field()
上述代碼創建一個名為”MyItem”的Item類,該類有三個欄位:title、link、desc,分別代表標題、鏈接和描述。Field類定義的屬性是可以不需要的,默認情況下Scrapy會將它們初始化為空。注意,欄位名必須保持獨一無二。
三、使用Item類
在爬蟲scrapy.Spider代碼中,可以使用Item類來接收從網頁中抓取的數據。可以通過定義parse()方法並使用ItemLoader實例化Item類來實現這一功能。
import scrapy
from scrapy.loader import ItemLoader
from myproject.items import MyItem
class MySpider(scrapy.Spider):
name = "example.com"
allowed_domains = ["example.com"]
start_urls = [
"http://www.example.com/1.html",
"http://www.example.com/2.html",
"http://www.example.com/3.html",
]
def parse(self, response):
# 實例化ItemLoader
loader = ItemLoader(item=MyItem(), response=response)
# 提取數據並添加到ItemLoader
loader.add_xpath('title', '//h1/text()')
loader.add_xpath('link', '//div[@class="link"]/a/@href')
loader.add_xpath('desc', '//div[@class="desc"]/text()')
# 返回Item類實例
return loader.load_item()
上述代碼實例化了一個ItemLoader對象,並將response傳遞給它。然後,使用add_xpath()方法來提取數據並將其添加到ItemLoader對象中。在parse()方法的最後,使用loader.load_item()來返回Item類實例,Scrapy會將該實例傳遞給Pipeline處理。
四、數據處理
在Pipeline中,可以對Item實例進行進一步處理。例如,可以處理重複數據、清洗數據等。下面是一個自定義Pipeline的示例:
class MyPipeline(object):
def process_item(self, item, spider):
if item['title']:
item['title'] = item['title'][0].upper()
if item['desc']:
item['desc'] = item['desc'][0].strip()
return item
上述代碼校驗了”title”是否存在,並將其轉換為大寫格式。它還清洗了”desc”欄位的內容——刪除了開頭和結尾的空格字元。
五、總結
在Scrapy中,Item是非常重要的組件。它們用來保存從網頁中抓取的數據,並作為主要的數據傳輸通道,將數據傳遞給Pipeline進行處理。了解如何創建和使用Item類可以幫助你在爬蟲代碼中更有效地處理數據。
原創文章,作者:ZKRR,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/136838.html