爬蟲知識8:數據存儲的需求實現,Item、Pipeline介紹
scrapy提取的信息可以保存在文件(csv、txt、json)中,或者資料庫中。而scrapy中的Pipeline則是專門用來保存數據的模塊。
以下以爬取豆瓣TOP250電影為例,分別介紹4種不同的數據保存和展示方式。且在案例3和案例4分別介紹了item和pipelines的知識
案例1:不保存到文件,只在屏幕列印出來。直接用print語句即可。
案例2:保存到文件,但不使用items返回數據,初級保存
案例3:保存到文件,使用items返回數據。但無法對保存的數據進行修改。
案例4:保存到文件,同時使用item和pipeline,可以實現對數據處理後再保存。
案例1、不保存到文件,只在屏幕列印出來。直接用print語句即可。
則如下爬蟲程序可滿足:
運行runspider.py文件,即可得到所有的電影名稱和網址。
案例2:保存到文件,不使用items返回數據,也不對文件做任何處理。也即僅在spider中實現初級保存。
以下爬蟲程序即可滿足:新增語句在畫對勾的地方。主要是打開和寫入文件語句。
案例3:保存到文件,使用items返回數據。但無法對保存的數據進行修改。
運行方式:返回數據後直接在命令行寫保存的文件
3-1關於items介紹
爬蟲的目的是為了從非結構性的數據源提供結構性數據,蜘蛛中的parse,解析出來url、title、time、content等數據,但是如何將這些數據包裝成結構化的數據呢?scrapy提供了item類來滿足這樣的需求。Item對象是一種簡單的容器,榮來保存爬取到的數據,提供了類似於字典的API以及用於聲明可用欄位的簡單語法。
關於item的一些知識:
item:保存提取的數據,類似於字典的形式。
item的結構定義:使用簡單的class定義語法以及Field對象來生命。
Field可以指向任意類型的欄位;
Item賦值:item["title"]="xxxx",其中的title可以為任意的名字
Spider中使用yield 處理item對象:需要再parse中導入
支持的存儲格式為csv、json、xml
如果在命令行直接輸入,語句分別為:
Json格式:scrapy crawl 爬蟲名稱 -t json -o 文件名稱.json,如果需要轉碼則可寫成:scrapy crawl 爬蟲名稱 -t json -o 文件名稱.json-s FEED_EXPORT_ENCODING="utf-8"
csv格式:scrapy crawl 爬蟲名稱 -t csv -o 文件名稱.csv
TXT格式:scrapy crawl 爬蟲名稱 -t txt -o 文件名稱.txt
存儲的問題:
FEED_URL:存儲路徑
FEED_FORMAT:存儲格式
FEED_EXPORT_ENCODING:存儲編碼
FEED_EXPORT_FIELDS:存儲欄位
3-2 程序的實現
這個程序需要對3個py文件做修改:爬蟲程序.py、items.py、運行爬蟲的程序.py
1)自己寫的爬蟲程序spider_ex1.py如下:
2) items.py的程序如下:
3)運行爬蟲的程序,新建一個runspider.py文件,程序如下。使用這個程序就可以直接在pycharm中運行程序了,不需要切換到命令欄再運行爬蟲了。
如果要保存其他格式,則參考語法改成txt、或者json對應的語句。
如果是json,需要轉碼,可使用以下語句
運行runspider.py文件,即可得到想要結果。
案例4::保存到文件,同時使用item和pipeline,可以實現數據處理後再保存。
4-1 關於pipeline介紹
當Item在Spider中被收集之後,它將會被傳遞到Item Pipeline,這些Item Pipeline組件按定義的順序處理Item。主要任務是清洗、驗證和存儲數據。每個Item Pipeline都是實現了簡單方法的Python類,因此我們也可以編寫自己的Item Pipeline。以下是item pipeline的一些典型應用:
清理HTML數據
驗證解析到的數據(檢查Item是否包含必要的欄位)
檢查是否是重複數據(如果重複就刪除)
將解析到的數據存儲到資料庫或文件
可以在Pipeline.py類的以下方法中自定義功能:
丟棄item的方法:
如果不丟棄,則使用語句「return item」,如果需要丟棄,則先導入模塊「from scrapy.exceptions import DropItem」,再使用語句「raise DropItem()」
如果想將pipeline單獨應用於一個蜘蛛,可通過此語句
if spider.name=="test"
Pipeline設置:
在settings.py文件中,找到字典「ITEM_PIPELINES」,激活如下:
可以添加多個PIPELINES,誰的序號小先執行誰。
4-2爬蟲的程序實現
這個程序執行對應的5個py文件:爬蟲程序.py、items.py、settings.py、pipelines.py、運行爬蟲的程序.py
1)爬蟲程序.py,和案例3相同,只需要有item即可
2)items.py的程序如下,和案例3一樣,需要用items都要這樣設置
3)pipelines.py程序,因為要實現同時保存到text文件和json文件中,要寫兩個pipeline文件。當然也可以寫更多的。
第一個直接在pipline中寫路徑
第二個pipeline使用settings.py中自定義的參數獲取路徑
4)settings.py,需要把ITEM_PIPELINES激活,對應的寫上兩個pipelines。序號小的優先執行。
自定義的路徑參數:
5)運行爬蟲的程序,新建一個runspider.py文件,程序如下。使用這個程序就可以直接在pycharm中運行程序了,不需要切換到命令欄再運行爬蟲了。
運行runspider.py文件,即可得到想要結果。
TAG:樂想屋 |