专栏/【20天搞定Python爬虫】第七天:菜鸟用Python操作MongoDB,看这一篇就够了

【20天搞定Python爬虫】第七天:菜鸟用Python操作MongoDB,看这一篇就够了

2021年05月12日 09:55--浏览 · --点赞 · --评论
粉丝:21.2万文章:116

【千锋教育干货暴击】


如果你想更好的学习python乃至转行,弯道超车,快人一步!本课程零基础即可加入学习,抓住大数据、机器学习、人工智能时代的红利,开启你的第一行代码吧!

↓    ↓    ↓

千锋Python全套视频教程(700集)

千锋教育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中的字典)

  1. db.集合名.remove({条件})

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

以user为例:

  1. 更新数据:db.集合名.update({原属性}, {修改属性}, {multi:true})(默认multi值为false,只更新一条;如果true,表示更新匹配到整个文档)

如果原属性存在,但修改属性里没写,这个属性在修改后就不存在了;相反,如果原属性不存在,但修改属性里有,修改后增加相应的属性

仍然以user为例:

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

比如:

在Python中操作MongoDB

在Python中操作MongoDB首先需要安装pymongo模块。

  1. 安装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专栏,事不宜迟,一起进步吧!


投诉或建议