"當然, 並不是所有資料都適合"在學習爬蟲的過程中, 遇到過不少坑.
今天這個坑可能以後你也會遇到, 隨著爬取資料量的增加, 以及爬取的**資料字段的變化, 以往在爬蟲入門時使用的方法侷限性可能會驟增.
怎麼個驟增法?
intro 引例
在爬蟲入門的時候, 我們爬取豆瓣電影top250這些資料量並不是很大的網頁時(僅計算文字資料量), 通常無需考慮資料儲存的效率問題, 使用mysql這些關係型資料庫, 或者用txt, csv等文字格式儲存, 都可以很快地儲存完畢, spider也可以跟著快速關閉. 因此我們感覺不到上述方式的弊端.
起初, 我爬的資料量在幾千條時, 我選擇用mysql作為資料儲存的資料庫,
爬取結束時, 儲存的時間花了幾秒, 我還沒有太在意.
爬取資料
但是當我爬取的資料量到了200m左右時, 問題非常明顯了. 此時用mysql儲存, 半小時都無法關閉spider! 如果新增了查重, 時間將會指數增長.
而使用csv儲存, 雖然關閉花不了特別多時間, 但是開啟關閉檔案所需的時間同樣不少! excel直接無法開啟, sublime和vs code則要花費十幾秒的時間來開啟.
資料開啟緩慢
圖 : 正在開啟csv的sublime text
在後續對csv中的資料進行基本的格式化後傳送到django視覺化時, 開啟網頁的處理時間接近1分30秒. 速度感人.
感人的速度讓我意識到要換一種方式來儲存和處理資料, 本文僅對資料儲存部分做過相應測試.
我將眼光瞄準了nosql中的mongodb.
what's nosql
關係型資料庫一直是計算機相關專業的必修課, 在過去的很長時間, 佔據了網際網路資料量的很大一部分. 但是隨著大資料時代到來, 關係型資料庫已然滿足不了某些大資料的處理要求.
資料量變化
image.png
nosql,指的是非關係型的資料庫。nosql也稱作not only sql的縮寫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱。
nosql用於超大規模資料的儲存。這些型別的資料儲存不需要固定的模式,無需多餘操作就可以橫向擴充套件。
what's mongodb
why mongodb
將目光放在mongodb這樣的文件型nosql身上, 是因為爬取的資料
how to
1. step 1 安裝mongodb安裝mongodb, 參考文件
安裝pymongo, 如果你使用pip安裝方式, 直接在終端中鍵入
pip install pymongo
安裝成功的檢測, 在python的shell中import pymongo
不報錯即可.
2. step 2 新增專案配置新增配置資訊
在scrapy專案的settings.py
中新增以下**
mongo_host = "127.0.0.1" #主機ip
mongo_port = 27017 #埠號
mongo_db = "spider" #庫名
mongo_coll = "jobinfo" #collection名
# mongo_user = ""
# mongo_psw = ""
**片中的埠號為預設埠號, 如果安裝後進行了修改, 以修改後為準, 庫名及collection名同上.
mongodb支援動態建立, 因此你並不需要提前建立資料庫和下屬的collection
3. step 3 啟用mongodb儲存pipeline在你scrapy專案的
pipelines.py
中新增以下的方法(注意函式要寫在某個pipeline類中, 並在settings.py
中啟用對應的pipeline, 如果你已經啟用, 直接新增即可):
# 在python中使用mongodb的所需的包
import pymongo
# 配置mongodb所需的包
from scrapy.conf import settings
def __init__(self):
# connect to db
self.client = pymongo.mongoclient(host=settings['mongo_host'], port=settings['mongo_port'])
# add if need account and password
# 當需要使用資料庫的使用者名稱和密碼, 取消以下的注釋, mongodb支援直接查詢, 無需登入
# self.client.admin.authenticate(host=settings['mongo_user'], settings['mongo_psw'])
# 設定資料庫客戶端型別
self.db = self.client[settings['mongo_db']]
# 取得資料庫控制代碼
self.coll = self.db[settings['mongo_coll']]
然後在同個檔案下處理item的函式末尾中新增以下**:
def process_item(self, item, spider):
# .....
postitem = dict(item)
self.coll.insert(postitem)
# 在終端中顯示你的爬取資料
return item
4. step 4 enjoy在終端中執行你的爬蟲, 待資料爬取完畢, spider迅速關閉, 而資料已經寫入資料庫!
在終端中鍵入
# 切換資料庫
use spider
# 查詢所有資料, pretty()函式用於格式化資料顯示
# jobinfo為collection名稱
db.jobinfo.find().pretty()
image.png
了解乙個A 資料庫的資料
查詢最大的資料表資料樣本 通過expdp,發現匯出的最大表,並進行相應查詢 檢視最大的表的資料案例 將table name替換為最大的表的表名 查詢前100行,了解資料樣本格式 查詢表的資料行數 select count 1 from all tables where owner 327 查詢最大表...
資料庫10儲存引擎(了解就行)
mysql預設使用的儲存引擎是innodb,預設的字符集是utf8.儲存引擎 只有在mysql中存在 mysql支援很多儲存引擎,每乙個儲存引擎都對應了乙個一種不同的儲存方式,需要選擇合適的儲存引擎。檢視當前儲存引擎 show engines g 常見的儲存引擎 myisam 格式檔案 frm 資料...
python 爬蟲 xpath 儲存到資料庫
參考 安裝 lxml 庫 import pymysql import requests from lxml import etree def get movies page url page 獲取url中的內容 response requests.get url html content respo...