寫(xiě)的內(nèi)容越來(lái)越多,因此做成一個(gè)系列,謝謝大家。我將定期更新相關(guān)內(nèi)容:
Scrapy實(shí)戰(zhàn):抓取本地論壇招聘內(nèi)容 (一)
Scrapy實(shí)戰(zhàn):抓取本地論壇招聘內(nèi)容 (二)
在上一篇里,我們已經(jīng)能成功的把我們想要的數(shù)據(jù)用scrapy抓取下來(lái)了,可是我們是存儲(chǔ)為json格式的,但是我們?nèi)绻胍娴綌?shù)據(jù)庫(kù)要怎么辦呢?
關(guān)于怎么抓取本地論壇招聘數(shù)據(jù)請(qǐng)看第一篇 Scrapy 抓取本地論壇招聘內(nèi)容 (一) 。
一、 安裝數(shù)據(jù)庫(kù)
對(duì)于網(wǎng)絡(luò)爬蟲(chóng)最方便的數(shù)據(jù)庫(kù)莫過(guò)于MongoDB了,因此我這里也選擇了MongoDB,不知道怎么安裝的了可以看我另外的文章 Ubuntu 16.04 安裝 Mongodb 。
二、 配置Settings
進(jìn)入之前的項(xiàng)目,打開(kāi)job/job/settings.py。添加以下內(nèi)容:
MONGODB_SERVER = "localhost"; #數(shù)據(jù)庫(kù)host,也可以寫(xiě)成127.0.0.1
MONGODB_PORT = 27017 #數(shù)據(jù)庫(kù)Port
MONGODB_DB = "job"; #數(shù)據(jù)庫(kù)名
MONGODB_COLLECTION = "cnnb"; #數(shù)據(jù)庫(kù)表名
ITEM_PIPELINES = {
'job.pipelines.JobPipeline': 300,
} # 這個(gè)配置才能使設(shè)置的piplines生效,可以在piplines設(shè)置好后再配置
三、 設(shè)置Piplines
打開(kāi)job.job/piplines.py。
# 引入pymongo庫(kù),可用操作mongodb
import pymongo
# 引入settings, 可以使用settings里的變量
from scrapy.conf import settings
class JobPipeline(object):
def __init__(self):
# 引用settings里的數(shù)據(jù)連接數(shù)據(jù)庫(kù)使用
host = settings["MONGODB_HOST"]
port = settings["MONGODB_PORT"]
dbname = settings["MONGODB_DB"]
collection = settings["MONGODB_COLLECTION"]
# 創(chuàng)建MONGODB數(shù)據(jù)庫(kù)鏈接
client = pymongo.MongoClient(host=host, port=port)
# 指定數(shù)據(jù)庫(kù)
mydb = client[dbname]
# 存放數(shù)據(jù)的數(shù)據(jù)庫(kù)表名
self.post = mydb[collection]
def process_item(self, item, spider):
valid = True
for data in item:
# 如果item里沒(méi)有返回?cái)?shù)據(jù)
if not data:
valid = False
raise DropItem("Missing {0}!".format(data))
# 如果有正常數(shù)據(jù)返回,插入數(shù)據(jù)庫(kù)
if valid:
self.post.insert(dict(item))
log.msg("Data added to MongoDB database!",
level=log.DEBUG, spider=spider)
return item
四、 運(yùn)行數(shù)據(jù)庫(kù)
scrapy crawl cnnb # 這里可以和上次不一樣了, 不用再使用-o cnnb.json導(dǎo)出json格式了
五、 查看MongoDB
程序到底有沒(méi)有成功,數(shù)據(jù)有沒(méi)有像我們希望的那樣存儲(chǔ)到了MongoDB里面呢,我們打開(kāi)終端驗(yàn)證一下:
$ mongo
MongoDB shell version: 3.2.4
connecting to: test
> show dbs #查看數(shù)據(jù)庫(kù)
job 0.001GB #可以看到 job已經(jīng)存在了
local 0.000GB
> use job #進(jìn)入job
switched to db job
> show tables #查看表
cnnb #cnnb也存在
> db.cnnb.find().pretty()
{
"_id" : ObjectId("5b129db7ce28262cd0d69785"),
"link" : "http://bbs.cnnb.com/forum.php?mod=viewthread&tid=7165496&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26typeid%3D103",
"title" : "急!急招[君通]聘智能化設(shè)計(jì)及計(jì)算機(jī)技術(shù)員5000-8000!",
...
} #可以看到數(shù)據(jù)清楚的出現(xiàn)了
至此,我們已經(jīng)成功的把數(shù)據(jù)存儲(chǔ)到了MongoDB. 實(shí)現(xiàn)了我們的目的。歡迎大家指正批評(píng),謝謝。下次我們將用抓取的數(shù)據(jù)做些有意思的分析!