iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 28
1
AI & Data

爬蟲在手、資料我有 - 30 天 Scrapy 爬蟲實戰系列 第 28

【Day 27】在 Scrapy 中處理爬取結果 - Item Pipelines

scrapy.Spider 爬蟲抓到資料後,會將資料送往 Item Pipelines 進行一系列的處理。常見的使用情境是:

  • 清理 HTML 資料
  • 驗證資料
  • 檢查重複
  • 存到資料庫中

Pipelines 中每一個組件都是一個 Python 類別,不需要繼承其他類別,但必須實作這個方法:

另外還可以視需求另外實作其他方法:

建立 Pipeline 元件

跟 Item 相同,建立好專案後,專案目錄中會有一個 pipelines.py 檔案,其中有 Scrapy 根據專案名稱自動建立的 IthomeCrawlersPipeline 類別。

class IthomeCrawlersPipeline(object):
    def process_item(self, item, spider):
        return item

假設我們不想要保存瀏覽次數小於 20 的文章可以這樣做:(只是找個範例沒有別的意思)

from scrapy.exceptions import DropItem

class IthomeCrawlersPipeline(object):
    def process_item(self, item, spider):
        if item['view_count'] < 20:
            raise DropItem(f'[{item["title"]}] 瀏覽數小於 20')
        return item

設定 Pipeline 執行順序

建立 Pipeline 元件後還需要設定每個元件的執行順序。在專案目錄中的 settings.py 檔案中有一個 dict 型態的 ITEM_PIPELINE 變數,key 是元件的完整名稱,value 是 0~1000 的整數,數字小的會先執行。

把我們剛剛建立的元件加入後會長這樣:

ITEM_PIPELINES = {
    'ithome_crawlers.pipelines.IthomeCrawlersPipeline': 300,
}

執行爬蟲

最後執行 scrapy crawl ithome -o ithome.csv 指令來執行爬蟲,可以在啟動的 log 中看到元件已經被加入 Pipeline 中。

https://ithelp.ithome.com.tw/upload/images/20191012/20107875BS0PIGkVE0.png

執行過程中,有可能會看到這樣的 log,代表有文章被過濾掉了。

https://ithelp.ithome.com.tw/upload/images/20191012/201078756dFHoTvkQt.png

最後檢查輸出的 ithome.csv 檔案中沒有瀏覽數小於 20 的文章。

參考資料


上一篇
【Day 26】Scrapy 的結構化資料 - Item
下一篇
【Day 28】Item Pipelines 應用 - 儲存資料到 MongoDB
系列文
爬蟲在手、資料我有 - 30 天 Scrapy 爬蟲實戰33

尚未有邦友留言

立即登入留言