20. Scrapy 框架 - Pipeline
當(dāng)Item 在Spider中被收集之后,就會(huì)被傳遞到Item Pipeline中進(jìn)行處理
每個(gè)item pipeline組件是實(shí)現(xiàn)了簡(jiǎn)單的方法的python類(lèi),負(fù)責(zé)接收到item并通過(guò)它執(zhí)行一些行為,同時(shí)也決定此Item是否繼續(xù)通過(guò)pipeline,或者被丟棄而不再進(jìn)行處理
item pipeline的主要作用:
清理html數(shù)據(jù)
去重并丟棄
講爬取的結(jié)果保存到數(shù)據(jù)庫(kù)中或文件中
2. 編寫(xiě)自己的item pipeline
2.1 必須實(shí)現(xiàn)的函數(shù)
process_item(self,item,spider)
每個(gè)item piple組件是一個(gè)獨(dú)立的pyhton類(lèi),必須實(shí)現(xiàn)以process_item(self,item,spider)方法
每個(gè)item pipeline組件都需要調(diào)用該方法,這個(gè)方法必須返回一個(gè)具有數(shù)據(jù)的dict,或者item對(duì)象,或者拋出DropItem異常,被丟棄的item將不會(huì)被之后的pipeline組件所處理
2.2 可以選擇實(shí)現(xiàn)
open_spider(self,spider) 表示當(dāng)spider被開(kāi)啟的時(shí)候調(diào)用這個(gè)方法
close_spider(self,spider) 當(dāng)spider關(guān)閉時(shí)候這個(gè)方法被調(diào)用
2.3 應(yīng)用到項(xiàng)目
import json
class MoviePipeline(object):
? ?def process_item(self, item, spider):
? ? ? ?json.dump(dict(item), open('diban.json', 'a', encoding='utf-8'), ensure_ascii=False)
? ? ? ?return item
? ? ? ?
注意:
寫(xiě)到pipeline后,要在settings中設(shè)置才可生效
ITEM_PIPELINES = {
? ?'spiderdemo1.pipelines.MoviePipeline': 300
}
2.4 將項(xiàng)目寫(xiě)入MongoDB
MongoDB地址和數(shù)據(jù)庫(kù)名稱(chēng)在Scrapy設(shè)置中指定; MongoDB集合以item類(lèi)命名
from pymongo import MongoClient
from middle.settings import HOST
from middle.settings import PORT
from middle.settings import DB_NAME
from middle.settings import SHEET_NAME
class MiddlePipeline(object):
? ?def __init__(self):
? ? ? ?client = MongoClient(host=HOST, port=PORT)
? ? ? ?my_db = client[DB_NAME]
? ? ? ?self.sheet = my_db[SHEET_NAME]
? ?def process_item(self, item, spider):
? ? ? ?self.sheet.insert(dict(item))
? ? ? ?return item