start
上一节讲述了 csv 存储,它是一种常见的数据格式,这一节我们来学习数据库存储,MongoDB 数据库存储。
它是一种非关系型数据库,文档型数据库,数据类型和 python 的字典格式一样是键值形式存储的。
安装 MongoDB
官方地址:
https://www.mongodb.com/download-center
木下瞳的网盘分享:
链接:https://pan.baidu.com/s/1vZBiWluA72Jtic86uM9PUA
提取码:qpnd
要是遇见安装进度条不走,可以换一个版本。
安装 MongoDB 可视化工具 Robo3T
官网地址:
https://robomongo.org/download
木下瞳网盘分享:
链接:https://pan.baidu.com/s/12oORDeOdHnj1BguKdQGjew
提取码:ie81
开启数据库
下好后,MongoDB 数据库需要我们手动开启,找到你安装的 MongoDB 路径,有如下文件:
打开 bin 文件,创建一个新的文件夹用来存储数据,小编取得文件夹名叫 “Data”,点开这个文件夹是空的,我们复制其路径:
在 bin 目录下,按住 Shift + 右键,点击【在此处打开PowerShell窗口】:
在弹出的蓝色命令行窗口,输入 【./mongod --dbpath 刚刚复制得路径】:
这个窗口不要关闭,在 bin 目录下,再次打开一个命令行窗口,按住 Shift + 右键,点击【在此处打开PowerShell窗口】,输入【./mongo】:
这样我们就开启了本地的数据库。
Robo 3T 使用
打开刚刚下好的可视化工具,按照序号点击:
会看到有几个默认的东西,其他的是小编自己创建的:
好了现在我们准备开始用 python 连接数据库,并写爬虫插入输入到 MongoDB了。
python 连接数据库,插入数据
在 python 中操作 mongodb 语句,我们可以使用 pymongo 库,pip 安装即可。
我们使用上一节麦当劳的代码修改。
首先连接数据库,再创建一个数据仓库,在这个仓库中创建一个数据集合用来保存数据,总共 3 行代码:
client = pymongo.MongoClient('localhost',27017) #连接数据库
mydb = client['mydb'] #新建 mydb 数据库
mc = mydb['mc'] #新建 test 数据集合
localhost:代表本地连接
27017:本地端口
mydb,mc 是数据库,与数据集合,这个只是名称,不是固定的哈,运行这三方代码后,回到可视化工具如下:
然后添加插入数据库的代码,因为 MongoDB 是键值对的形式,所以使用字典的形式插入,insert_one 方法是只插入一条数据:
for d in data:
dic = {
'city' : d[0],
'shop' : d[1]
}
mc.insert_one(dic)
这样代码接改好了。
end
完整代码
import requests
import re
import time
import pymongo
from fake_useragent import UserAgent
client = pymongo.MongoClient('localhost',27017) #连接数据库
mydb = client['mydb'] #新建 mydb 数据库
mc = mydb['mc'] #新建 test 数据集合
def get_html(url):
'''
下载 html
:param url:
:return:
'''
ua = UserAgent()
headers = {'User-Agent': ua.random}
response = requests.get(url, headers=headers)
if response.status_code == 200:
response.encoding = 'utf-8'
return response.text
else:
return
def info(html):
'''
解析麦当劳响应,获取数据
:param response:
:return:
'''
pat1 = '<span>城市</span>(.*?)</td>'
cities = re.findall(pat1,html,re.S)
pat2 = '<span>门店名称</span>(.*?)</td>'
shop_names = re.findall(pat2,html,re.S)
infos = zip(cities,shop_names)
return list(infos)
def insert_mongodb(data):
'''
插入数据到数据库
:param data:
:return:
'''
for d in data:
dic = {
'city' : d[0],
'shop' : d[1]
}
mc.insert_one(dic)
if __name__ == '__main__':
'''
主接口
'''
mc_url = ['https://www.mcdonalds.com.cn/index/Quality/publicinfo/deliveryinfo?page={}'
.format(str(i)) for i in range(1,236)]
for url in mc_url:
html = get_html(url)
data = info(html)
insert_mongodb(data)
time.sleep(1)