??有了上次爬蟲(chóng)的基礎(chǔ)歼狼,本次教程主要把爬到的數(shù)據(jù)存入MongoDB數(shù)據(jù)庫(kù)中蔬胯。
??MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品忘衍,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的铺纽。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散柬帕,是類似json的bson格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型狡门。Mongo最大的特點(diǎn)是他支持的查詢語(yǔ)言非常強(qiáng)大陷寝,其語(yǔ)法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z(yǔ)言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部分功能其馏,而且還支持對(duì)數(shù)據(jù)建立索引凤跑。
1.運(yùn)行環(huán)境與安裝
1.運(yùn)行環(huán)境
??操作系統(tǒng):win7
??數(shù)據(jù)庫(kù):MongoDB
??python庫(kù):BeautifulSoup,requests,pymongo
??IDE:jupyter notebook
2.運(yùn)行環(huán)境安裝
1.MongoDB安裝
- 如果你用的是windows xp,那么MongoDB從2.2開(kāi)始就已經(jīng)不支持了叛复,你可以試著安裝MongoDB 2.2版本仔引。
- 如果你用的是windows server 2008 R2 或 win7,需要先安裝一個(gè)補(bǔ)吨鲁丁:https://support.microsoft.com/zh-cn/help/2731284/-33-dos-error-code-when-memory-memory-mapped-files-are-cleaned-by-using-the-flushviewoffile-function-in-windows-7-or-in-windows-server-2008-r2
以上機(jī)型問(wèn)題搞定后肤寝,下面是所有windows用戶的安裝教程。
- 下載與你的操作系統(tǒng)對(duì)應(yīng)的安裝包抖僵,打開(kāi)安裝包,按照引導(dǎo)一路下一步進(jìn)行缘揪,默認(rèn)安裝到C盤(pán)耍群。下載地址:https://www.mongodb.com/download-center#community
- 手動(dòng)設(shè)置MongoDB環(huán)境
??我們要設(shè)置一個(gè)目錄來(lái)保存數(shù)據(jù),推薦默認(rèn)路徑C:\data\db找筝。在命令行輸入如下指令:
md C:\data\db
??表示在C盤(pán)創(chuàng)建了一個(gè)目錄data\db蹈垢,存入數(shù)據(jù)庫(kù)中的數(shù)據(jù)都會(huì)保存在這里。
- 啟動(dòng)MongoDB
??在命令行輸入:
C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe
??你的路徑也許和我的不同袖裕,以你自己的為準(zhǔn)曹抬。看到圖1中的紅字表示啟動(dòng)成功急鳄。
- 連接MongoDB
??不要關(guān)閉剛才的命令行窗口谤民,打開(kāi)一個(gè)新命令行窗口堰酿,輸入如下指令:
“C:\Program Files\MongoDB\Server\3.4\bin\mongo.exe”
??因?yàn)槟夸浿邪崭瘢孕枰由想p引號(hào)张足〈ゴ矗看到圖2左下角的“>”,表示連接成功(雖然有警告为牍,但是不影響正常使用)哼绑。
- MongoDB基本操作
??現(xiàn)在已經(jīng)成功連接MongoDB,我們可以創(chuàng)建并查看里面的數(shù)據(jù)庫(kù)碉咆。輸入如下指令創(chuàng)建一個(gè)數(shù)據(jù)庫(kù):
use test
??表示創(chuàng)建并使用了一個(gè)名為test的數(shù)據(jù)庫(kù)抖韩,用下面的指令向test數(shù)據(jù)庫(kù)中添加一個(gè)集合:
db.createCollection("mCollection")
??創(chuàng)建了一個(gè)名為mCollection的集合∫咄可用下面指令來(lái)查看MongoDB中的數(shù)據(jù)庫(kù):
show dbs
??顯示如圖3茂浮,其中test就是剛才我們創(chuàng)建的數(shù)據(jù)庫(kù),其他的都是我之前創(chuàng)建的块攒。
??用下面的指令來(lái)查看test數(shù)據(jù)庫(kù)中的集合:
use test
show collections
??圖4顯示了我們剛才創(chuàng)建的mCollection集合励稳。
??更多關(guān)于MongoDB的基本操作,請(qǐng)移步http://www.yiibai.com/mongodb/mongodb_quick_guide.html
- 為windows系統(tǒng)配置MongoDB囱井,讓其隨windows一起啟動(dòng)(可選)
??如果不做這一步驹尼,每次啟動(dòng)windows時(shí),像上面那樣手動(dòng)啟動(dòng)MongoDB即可庞呕。
??剛才打開(kāi)了兩個(gè)命令行窗口新翎,現(xiàn)在都可以關(guān)閉了。打開(kāi)一個(gè)新命令行窗口住练,輸入:
mkdir C:\data\log
??關(guān)閉這個(gè)命令行地啰,然后在硬盤(pán)的某個(gè)地方創(chuàng)建一個(gè)名為mongod.cfg的文件,在其中輸入:
systemLog:
4個(gè)空格destination:1個(gè)空格file
4個(gè)空格path:1個(gè)空格c:\data\log\mongod.log
storage:
4個(gè)空格dbPath:1個(gè)空格c:\data\db
??即
systemLog:
destination: file
path: c:\data\log\mongod.log
storage:
dbPath: c:\data\db
??以管理員的權(quán)限重新打開(kāi)一個(gè)命令行讲逛,輸入如下命令:
"C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe" --config "C:\mongodb\mongod.cfg" --install
??等待結(jié)束亏吝;如果一直卡著不動(dòng),過(guò)一會(huì)兒關(guān)閉就是(路徑以你自己的為準(zhǔn))盏混。命令行中輸入如下命令蔚鸥,啟動(dòng)MongoDB服務(wù):
net start MongoDB
2.pymongo安裝
pymongo是一個(gè)python庫(kù),用于操作MongoDB中的數(shù)據(jù)庫(kù)许赃。
打開(kāi)一個(gè)命令行止喷,輸入如下命令:
D:\Anaconda3\Scripts\pip install pymongo
??如圖5所示,表示用Anaconda3自帶的pip工具安裝pymongo庫(kù)混聊。若顯示如圖6弹谁,說(shuō)明安裝成功。
2.把商品數(shù)據(jù)存入數(shù)據(jù)庫(kù)
1.連接MongoDB
開(kāi)始編程:
from bs4 import BeautifulSoup
import requests
import pymongo #引入pymongo庫(kù)
#連接MongoDB
client = pymongo.MongoClient('localhost',27017)
#創(chuàng)建一個(gè)名為ganJi的數(shù)據(jù)庫(kù)
ganJi = client['ganJi']
#在ganJi數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為item_info的集合
item_info = ganJi ['item_info']
??在上面的代碼中,client['ganJi']中的ganJi是MongoDB中數(shù)據(jù)庫(kù)的名字预愤,ganJi = client['ganJi']中賦值號(hào)左邊的ganJi是本python代碼中要操作ganJi數(shù)據(jù)庫(kù)的對(duì)象名字沟于。盡量使賦值號(hào)左右兩邊取相同的名字,避免出錯(cuò)鳖粟。
2.爬取商品信息并存入數(shù)據(jù)庫(kù)
for each_link in link_list:
wb_data = requests.get(each_link)
soup = BeautifulSoup(wb_data.text,'lxml')
title = soup.select('h1.title-name')[0].get_text()
price = soup.select('i.f22.fc-orange.f-type')[0].get_text()
date = soup.select('i.pr-5')[0].get_text()
areas = soup.select('ul.det-infor > li > a')
area = ''
for i in areas:
area += i.get_text()+'-'
area = area[:-1]
data = {
'標(biāo)題':title,
'日期':date.strip().split('\xa0')[0],
'價(jià)格':price,
'地點(diǎn)':area
}
print (data)
item_info.insert_one(data) #把一條data字典存入數(shù)據(jù)庫(kù)
??在上面的代碼中社裆,用到了上次教程中的link_list。對(duì)于每個(gè)鏈接對(duì)應(yīng)的商品向图,爬取其信息泳秀,并通過(guò)insert_one方法存入ganJi數(shù)據(jù)庫(kù)中的item_info集合中。
3.查看數(shù)據(jù)庫(kù)中的數(shù)據(jù)
可通過(guò)find方法來(lái)查看item_info集合中的商品數(shù)據(jù):
for i in item_info.find():
print(i)
結(jié)果顯示為:
{'_id': ObjectId('5904b9e28e7b770dc44c2a0e'), '標(biāo)題': '北京移動(dòng)的卡,05年15元包月流量隨便用,全國(guó)的,永久有效, - 2800元', '日期': '04-29 13:51', '價(jià)格': '2800', '地點(diǎn)': '近期價(jià)格走勢(shì)- 北京-通州'}
{'_id': ObjectId('5904b9e28e7b770dc44c2a0f'), '標(biāo)題': '官網(wǎng)搶購(gòu)小米6忍痛轉(zhuǎn)讓 - 2799元', '日期': '04-29 14:19', '價(jià)格': '2799', '地點(diǎn)': ' 北京-海淀-中關(guān)村'}
{'_id': ObjectId('5904b9e38e7b770dc44c2a10'), '標(biāo)題': '歐沃4s手機(jī) - 400元', '日期': '04-29 12:46', '價(jià)格': '400', '地點(diǎn)': ' 北京-北京周邊'}
{'_id': ObjectId('5904b9e38e7b770dc44c2a11'), '標(biāo)題': '全新未拆封小米6 亮黑色 - 2999元', '日期': '04-28 22:49', '價(jià)格': '2999', '地點(diǎn)': ' 北京-豐臺(tái)'}
{'_id': ObjectId('5904b9e38e7b770dc44c2a12'), '標(biāo)題': 'iphone4s轉(zhuǎn)讓,非華為小米酷派天語(yǔ)中興 - 240元', '日期': '04-27 17:44', '價(jià)格': '240', '地點(diǎn)': '近期價(jià)格走勢(shì)- 北京-海淀-北太平莊'}
{'_id': ObjectId('5904b9e48e7b770dc44c2a13'), '標(biāo)題': '電信無(wú)線座機(jī) 電信無(wú)線座機(jī)電話 - 350元', '日期': '04-27 17:03', '價(jià)格': '350', '地點(diǎn)': '近期價(jià)格走勢(shì)- 北京-豐臺(tái)-麗澤橋'}
??注意到榄攀,除了我們想要的信息外嗜傅,每條數(shù)據(jù)自動(dòng)增加了一個(gè)叫做“_id”的字段,它用來(lái)編號(hào)集合中的數(shù)據(jù)檩赢,每條數(shù)據(jù)都有一個(gè)唯一的ID吕嘀。
4.從數(shù)據(jù)庫(kù)中導(dǎo)出數(shù)據(jù)
??現(xiàn)在MongoDB中已經(jīng)存儲(chǔ)了爬取的商品信息,現(xiàn)在我們要把這些信息導(dǎo)出為csv文件和json文件贞瞒。導(dǎo)出文件的一般格式為:
mongoexport -h 127.0.0.1 -d dataBaseName -c collectionName -o yourPath
- 若要導(dǎo)出為csv文件偶房,在命令行中輸入下面的指令:
mongoexport -h 127.0.0.1 -d ganJi -c item_info -o E:\testCsv.csv
- 若要導(dǎo)出為json文件,在命令行中輸入下面的指令:
mongoexport -h 127.0.0.1 -d ganJi -c item_info -o E:\testJson.json
若顯示圖7所示內(nèi)容军浆,表示導(dǎo)出成功棕洋。
這樣,csv文件就可用excel查看了乒融,json文件就可用Notepad++查看了掰盘。
5.把數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)
??我們就把剛才導(dǎo)出的兩個(gè)文件testCsv.csv和testJson.json再導(dǎo)入到數(shù)據(jù)庫(kù)。導(dǎo)入文件的一般格式為:
mongoimport -h 127.0.0.1 -d database_name -c collection_name yourPath
- 若要導(dǎo)入csv文件赞季,在命令行中輸入下面的指令:
mongoimport -h 127.0.0.1 -d new_db -c testCsv E:\testCsv.csv
- 若要導(dǎo)入json文件愧捕,在命令行中輸入下面的指令:
mongoimport -h 127.0.0.1 -d new_db -c testJson E:\testJson.json
若顯示圖8所示內(nèi)容,表示導(dǎo)入成功申钩。