一、Item封裝數據
對于有字段的數據,最好的數據結構維護方法為字典類型(dict),但是由于字典不便于攜帶元數據和傳遞給其他組件使用,故可以使用Item類封裝爬取到的數據。
這里涉及兩個類:Item基類和Field類
兩者的使用關系如下:首先創建一個自定義的Item類,命名為BestItem()該類繼承于Item類,然后使用Field()來對各字段進行創建對象,即cost=Field()
即總的使用格式為:
From scrapy import Item,FieldClass BestItem():Cost=Field()Information=Field()
然后將創建好的BestItem導入創建爬蟲類的文件中進行使用,并對其進行專門的解析和提取。類和類之間可以互相進行繼承,實現功能字段的拓展:class VeryBestItem(BestItem)
二、Item Pipeline處理數據
一個Item Pipeline只負責一種功能的數據處理,但是可以使用多個,實現對多個功能的處理。類似流水線處理一樣。如果在某一個Item Pipeline處理時拋出異常,那么這個數據將不再傳遞給后面的Item Pipeline進行處理,也不會導出到文件中,而是直接被拋棄。
Item Pipeline處理的場景為:清洗數據、驗證數據的有效性、數據去重、將數據寫入特定的文件或數據庫、數據增強、數據聚合、數據脫敏/加密、數據單位換算、依賴外部API補充數據和錯誤恢復和機器學習模型等。
對該方法的使用很簡單:只需要專注于實現某一功能,而不需要在意是否需要繼承特定基類。
其在實際應用中必須實現的方法:
①open_spider(self,spider)用于在開始處理數據之前完成某些初始化的工作,比如連接數據庫②close_spider(self,spider)用于在處理完所有數據之后完成某些清理工作,比如關閉數據庫連接。
③from_crawler(cls,crawler)用于根據crawler.settings讀取配置創建Item Pipeline對象。
④process_item(self ,item,spider)用于對數據進行處理。
如何想使用Item Pipeline這個組件(可選),需要在配置文件settings.py中進行配置。其配置為:ITEM_PIPELINES={“每一個Item Pipeline類的導入路徑,值為0~1000的數字,該數字的大小決定了Item Pipeline處理數據的先后次序,數字小的在前”}
重點:將爬取的數據可以直接存入數據庫MongoDB,使用Item Pipeline就可以完成這個任務。在使用MongoDB時,需要導入import pymongo
整體實現流程:
From scrapy.item import Item Import pymongo Class MongoDBpipeline(object):db_url=”mongodb://localhost:8888/” //數據庫的url地址db_name=”data_db”//數據庫名Def open_spider(self,spider)://連接數據庫Self.client=pymongo.MongoClient(self.db_url)Self.db=self.client[self.db_name]Def close_spider(self,spider)://關閉數據庫連接Self.client.close()Def process_item(self,item,spider)://進行數據處理Collection=self.db[spider.name]Post=dict(item) if isinstance(item,Item) else itemCollection.insert_one(post)//insert_one傳入的必須為一個字典對象,不能是Item對象,故在此之前對其進行類型判斷Return item ------------------------------------------------------------------ 更改配置文件settings.py:ITEM_PIPELINES={“MongoDBPipeline的路徑”:300 } MongoDB_url=”mongodb://localhost:8888/” Mongo_DB_name=”data_db” -------------------------------------------------------------- 更改另外一個配置文件crawler.settings: Def from_crawler(cls,crawler):Cls.db_url=crawler.settings.get(“MongoDB_url”,”mongodb://localhost:8888/”)Cls.db_name=crawler.settings.get(“Mongo_DB_name”,”data_db”)Return cls()