【千锋教育干货暴击】
如果你想更好的学习python乃至转行,弯道超车,快人一步!本课程零基础即可加入学习,抓住大数据、机器学习、人工智能时代的红利,开启你的第一行代码吧!
↓ ↓ ↓
千锋教育Python教程全套_python零基础入门到精通(学完可达到Python工程师水平)

爬虫中也会使用MongoDB数据库吗?答案是肯定的。
MongoDB在爬虫中主要的使用场景是什么?答:1. 可以存储数据 2.分布式爬虫中通过MongoDB创建集群。
MongoDB数据库是通过什么与Python程序建立联系的?答:通过pymongo。
MongoDB数据库也是要单独安装的是吗?答:Yes!
简介
MongoDB的基础使用可以介绍一下吗?这个嘛......自然也是OK👌的啦😄
MongoDB是一个基于分布式文档存储的NoSQL(Not Only SQL,泛指非关系型数据库)数据库,也是一个面向文档(document-oriented)的数据库。
MongoDB旨在解决海量数据的访问效率问题,在爬虫开发中使用MongoDB来存储大规模的数据是不错的选择。
MongoDB支持的数据结构非常松散,是类似JSON的BSON(是一种类JSON的一种二进制形式的存储格式,简称Binary JSON)格式,因此可以存储比较复杂的数据类型。
MongoDB的一些概念与MySQL等关系型数据库大不相同。MongoDB中基本的概念是文档、集合和数据库。
来看下表:

关系如图:

安装
可以去官方下载,链接:https://www.mongodb.com/try/download/community

下载文件后,以 windows为例,选择双击开始安装,建议选择custom安装(自定义方式),可以指定路径进行一些配置。设定好路径之后
点击next,新版的MongoDB会自动在安装目录下创建log和data文件夹,这相比较早期版本有了改善 ,但我们仍然需要在data文件夹下创建db文件夹 我的在C:\MongoDB\data\db(记住一定要再建个db文件夹)
重重之重(下图箭头位置要取消安装,你要是选中了,那就是安装了一天也完成不了,compass是客户端可视化界面如果需要后期可以再去单独下载)

最后安装成功会弹出一个警告框,选中 Ignore 就好,至此,MongoDB客户端已经安装完毕。
打开命令行窗口windows+R,输入cmd开启命令行。切换到MongoDB的安装目录:C:\MongoDB\bin目录下,然后执行命令:

这命令是开启服务,它会一直运行,只要你使用Mongodb,这个窗口就不能关。然后仍然是在bin目录下,执行mongo命令。
如果命令行没有特殊错误提示,打开浏览器输入:127.0.0.1:27017

至此安装完成!当然就可以在执行mongo的命令行页面写一些操作命令了。
基础语法
数据库操作

集合操作:集合即我们操作的表

注意:集合的命名规则如下:(1)集合名不能是空串。(2)不能含有空字符\0。(3)不能以“system.”开头,这是系统集合保留的前缀。(4)集合名不能含保留字符$。
当然也可以不用手动创建集合,只需要声明集合并插入数据就会创建成功(以下示例均已user集合为例)。
db.user.insert({"name":"Lucy"});
系统发现 user 是一个陌生的集合名字,所以就自动创建了。可以使用show collections
进行查看是否有user存在。
数据操作:即向集合中添加数据
增
db.集合名.insert(document)
document是构建的一个json文件(可以类比python中的字典)

删
db.集合名.remove({条件})
db.集合名.remove({条件}, {justOne:true})
以上都不能对创建集合时设置了capped:true的集合删除;对于capped:true的集合,只能删除文档
以user为例:

改
更新数据:
db.集合名.update({原属性}, {修改属性}, {multi:true})
(默认multi值为false,只更新一条;如果true,表示更新匹配到的整个文档)
如果原属性存在,但修改属性里没写,这个属性在修改后就不存在了;相反,如果原属性不存在,但修改属性里有,修改后增加相应的属性
仍然以user为例:

查
使用find()进行查询。其中会使用到条件语句和操作符。具体如下

比如:

在Python中操作MongoDB
在Python中操作MongoDB首先需要安装pymongo模块。
安装pymongo 使用pip命令安装pymongo,具体如下所示:

pymongo安装成功后,使用时直接import即可。
2.建立连接
pymongo模块使用MongoClient对象来描述一个数据库客户端,创建对象所需的参数主要是host和port。常见的3种形式如下所示:

第一种方式默认连接的是主机的IP和端口,第二种方式是显式地连接指定IP和端口,第三种是使用URL格式进行连接。
3.获取数据库
一个MongoDB可以有多个独立的数据库。使用pymongo时,可以通过访问MongoClient属性的方式来访问数据库,具体如下所示:

4.获取集合
一个collection即一组存在于MongoDB中的文档,获取collection的方法与获取数据库方法一致,具体如下所示:

值得注意的是,MongoDB中的collection和数据库都是惰性创建的。即前面介绍的命令实际并没有对MongoDB Server进行任何操作,直到第一个文档插入后,collection和数据库才会被创建,这也是在不插入文档之前使用“show dbs”命令查看不到之前创建的数据库的原因。
5.插入文档
MongoDB中的数据以JSON类文件的形式保存。在pymongo中使用字典来代表文档,使用insert()方法插入文档,具体如下所示:

文档被插入后,如果文档中没有_id键值,系统会自动为文档添加。_id是一个特殊键值,该值在整个collection中是唯一的。使用insert()方法会返回这个文档的_id值。
当然使用insert也可以进行批量添加文档;

6.查询文档
MongoDB中查询一个文档时可使用find_one()函数,该函数会返回一个符合查询条件的文件,在没有匹配出结果时返回None.使用在find_one()查找,返回文件中已经存在_id键值,该键值是由数据库自动添加。find_one()还支持对特定元素进行匹配查询,比如筛选出name为Tom的文档,具体如下所示:

若需要查询多个文档,可以使用find()方法。find()方法返回一个Cursor实例,通过该实例可获取每个符合查询条件的文档。具体如下所示:

7.修改文档
MongoDB中使用update()和save()方法来更新文档,具体如下所示:

8.删除文档
MongoDB中使用remove()方法删除文档,具体如下所示:

MongoDB在爬虫中的应用
直接上代码:
import pymongo
import csv
import random
import ssl
import time
from urllib import request
from bs4 import BeautifulSoup
def getComment(url):
# 火狐 谷歌 Safari 的头部
header1 = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36",
"Host": "movie.douban.com"
}
# ie浏览器的请求头
header2 = {
"User-Agent": "Mozilla / 5.0(Windows NT 10.0;WOW64;Trident / 7.0;rv: 11.0) like Gecko",
"Host": "movie.douban.com"
}
headlist = [header1, header2]
# 定义随机下标
index = random.randint(0, 1)
# 确定访问的请求头
# index 是一个随机数
realHeader = headlist[index]
req = request.Request(url, headers=realHeader)
# 处理https协议的,http,https(更加安全协议)可以解决ssl报错问题
context = ssl._create_unverified_context()
# 获取 网页的 文本对象
html = request.urlopen(req, context=context)
# 获取网页源码
contents = html.read().decode("utf-8")
return contents
def read_data(contents):
soup = BeautifulSoup(contents, 'lxml')
# 找到了大的容器,里面包含很多item项
comments_div = soup.select_one('#comments') # id 返回Tag类型
# print(comments_div)
# 获取大的容器中的每个小项,返回一个结果集列表
comment_list = comments_div.select('.comment-item') # 返回ResultSet
# print(comment_list)
comment_dict_list = []
# 遍历每个item项,
for comment in comment_list:
# find 与 find_all
# attribute:属性
comment_div = comment.find('div', attrs={'class': 'comment'})
# print(comment_div)
comment_info = comment_div.find('span', attrs={'class': 'comment-info'})
# 评价的用户名
username = comment_info.find('a').text
# 获取星级
star = comment_info.find_all('span')[1].get('title')
# 评论内容
comment_text = comment_div.find('span', attrs={'class': 'short'}).text
# 字典存放
comment_dict = {'username': username, 'star': star, 'comment': comment_text}
# 将字典存到列表中
comment_dict_list.append(comment_dict)
# [{},{},{},{},{}]
# 返回字典
return comment_dict_list
def get_collection():
client=MongoClient('mongodb://localhost:27017/')
db=client['douban']
collection=db.movies
return collection
# 将其保存到csv文件中
def save_comment_csv(comment_dict_list,collection):
for comment_dict in comment_dict_list:
collection.insert(comment_dict)
if __name__ == '__main__':
collection = get_collection()
for i in range(20):
start = str(i * 20) # 20 40 60 80 100
url = 'https://movie.douban.com/subject/34841067/comments?start=' + start + '&limit=20&sort=new_score&status=P'
# 将 新的url以参数的形式赋值给getComment()
contents = getComment(url)
# 解析爬取到的数据
comment_dict_list = read_data(contents)
# 保存到一个csv文件中
save_comment_csv(comment_dict_list,collection)
print('保存成功第' + str(i + 1) + '页内容')
# 延时
time.sleep(5)

需要资料也可以关注微信公众号:Python专栏,事不宜迟,一起进步吧!
