一、pipeline基礎知識
1、pipeline的定義和作用
pipeline是Scrapy的核心機制之一,它用於處理從spider中返回的數據。Scrapy在抓取網頁的時候,會將數據經過pipeline進行處理,pipeline可以負責清洗、驗證、存儲等多個任務,同時也可以通過pipeline對數據進行自定義操作。
2、pipeline的執行順序
Scrapy框架會按照設置的優先級順序來執行pipeline,一般情況下,數據會先經過一些數據清洗、過濾的pipeline,然後再進行持久化處理等操作。
3、pipeline的基本結構
class MyPipeline1(object):
def process_item(self, item, spider):
# 數據處理
return item
class MyPipeline2(object):
def process_item(self, item, spider):
# 數據處理
return item
pipeline一般都是以類的形式實現,每一個pipeline都至少實現一個process_item方法,該方法接收兩個參數item和spider,item是爬蟲爬取後的數據,spider是爬蟲對象。
二、數據清洗和過濾
1、數據清洗
Scrapy保持了較高的靈活性,可以輕鬆地實現數據清洗和轉換。比如將數據轉換為指定格式,去除不需要的內容等。
2、數據過濾
Scrapy可以在pipeline中自定義數據的過濾規則,可以過濾掉不需要的數據,這樣能大大提高後續pipeline的效率。
三、數據持久化處理
1、pipeline將數據存儲到本地文件
class MyPipeline(object):
def __init__(self):
self.file = open('items.jl', 'w')
def process_item(self, item, spider):
line = json.dumps(dict(item)) + "\n"
self.file.write(line)
return item
def close_spider(self, spider):
self.file.close()
將數據存儲到本地文件可以使用內置的json庫。
2、pipeline將數據存儲到數據庫
class MyPipeline(object):
def __init__(self):
self.db = pymysql.connect(**settings.MYSQL_CONFIG)
self.cursor = self.db.cursor()
def process_item(self, item, spider):
sql = "insert into mytable (title, url) values (%s, %s)"
self.cursor.execute(sql, (item["title"], item["url"]))
self.db.commit()
return item
def close_spider(self, spider):
self.cursor.close()
self.db.close()
將數據存儲到數據庫需要先連接數據庫,可以使用pymysql這個庫連接MySQL。
四、多個pipeline的設置
在Scrapy的settings.py文件中,每個pipeline都可以設置優先級,Scrapy會按照優先級從高到低的順序依次執行pipeline。同時pipeline可以在settings.py中進行配置,支持動態修改pipeline的設置。
ITEM_PIPELINES = {
'myproject.pipelines.MyPipeline1': 300, #優先級300
'myproject.pipelines.MyPipeline2': 400, #優先級400
}
五、pipeline的應用場景
1、爬取大型網站
對於大型網站,需要多個數據清洗、持久化處理pipeline對數據進行過濾、存儲等操作。
2、爬取分布式網站
對於分布式網站,pipeline可以用於分布式數據處理,將爬蟲爬取的數據進行合併、去重、分組等操作。
3、爬取高質量網站
對於高質量的網站,pipeline可以用於數據驗證和存儲,保證數據的一致性和可用性。
原創文章,作者:PALDO,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/333728.html