存储爬虫数据--Mongodb

存储爬虫数据–Mongodb

通常,从网页爬取到的数据需要进行分析,处理或格式化,然后进行持久化存储,以备后续使用.数据存储主要有两种方式:文件存储数据库存储

一.使用PyMongo库存储到数据库

PyMongo是用于MongoDB的开发工具,是python操作MongoDB数据库的推荐方式.PyMongo中主要提供了如下类与MongoDB数据库进行交互:

  • MongoClient类:用于与MongoDB服务器建立连接
  • DataBase类:表示MongoDB中的数据库
  • Collection类:表示MongoDB中的集合
  • Cursor类:表示查询方法返回的结果,用于对多行数据进行遍历

PyMongo库的基本使用流程如下:

  1. 创建一个MongoClient类的对象,与MongoDB服务器建立连接
  2. 通过MongoClient对象访问数据库(DataBase对象)
  3. 使用上个步骤的数据库创建一个集合(Collection对象)
  4. 调用集合中提供的方法在集合中插入,删除,修改和查询文档

1.创建连接

class pymongo.mongo_client.MongoClient(host="localhost",port=27017,document_class=dict,tz_aware=False,connect=True,**kwargs)

参数说明:

  • host参数:表示主机名或IP地址
  • port参数:表示连接的端口号
  • document_class参数:客户端查询返回的文档默认使用此类
  • tz_aware参数:如果为True,则此MongoClient作为文档中的值返回的datetime实例,将会别时区所识别
  • connect参数:若为True(默认),则立即开始在后台连接到MongoDB,否则连接到第一个操作
from pymongo.mongo_client import MongoClient

client=MongoClient("localhost",27017)

# client=MongoClient("mongodb://localhost:27017")

2.访问数据库

db=client.test

3.创建集合

# 数据库中若没有,则创建test集合
collection=db.test

4.插入文档

往集合中插入文档的方法主要有如下两个:

  1. insert_one()方法:插入一条文档对象
  2. insert_many()方法:插入列表形式的多条文档对象
# 插入一条文档
try:
    result=collection.insert_one({"name":"zhagngsan","age":20})
    print(result)
    
except Exception as error:
    print(error)
<pymongo.results.InsertOneResult object at 0x0000029EEF7D9788>
# 插入多条文档
result=collection.insert_many([
    {"name":"lisi","age":21},
    {"name":"wangwu","age":22},
    {"name":"liliu","age":23}
])

print(result)
<pymongo.results.InsertManyResult object at 0x0000029EEF858608>

5.查询文档

用于查找文档的方法主要有如下几个:

  1. find_one()方法:查找一条文档对象
  2. find_many()方法:查找多条文档对象
  3. find()方法:查找所有文档对象
result=collection.find({"age":23})
print(result)

for doc in result:
    print(doc)
<pymongo.cursor.Cursor object at 0x0000029EEF74C860>
{'_id': ObjectId('5cdea4477662f4e49e1874c5'), 'name': 'liliu', 'age': 23}

6.更新文档

用于更新文档的方法主要有如下几个:

  1. update_one()方法:更新一条文档对象
  2. update_many()方法:更新多条文档对象
collection.update_one({"name":"zhangsan"},{"$set":{"age":25}})
<pymongo.results.UpdateResult at 0x29eef950bc8>

7.删除文档

用于删除文档的方法包括如下几个:

  1. delete_one()方法:删除一条文档对象
  2. delete_many()方法:删除所有记录
collection.delete_one({"name":"liliu"})
<pymongo.results.DeleteResult at 0x29eef950c08>

二.存储网站电影

1.分析待爬取网页

通过地址**https://movie.douban.com/top250**,查看网页源代码

from IPython.display import Image
Image(filename="./data/9_1.png",width=500)

output_29_0.png

表示电影名称的标签

Image(filename="./data/9_2.png",width=500)

output_31_0.png

获取电影的评分

Image(filename="./data/9_3.png",width=500)

output_33_0.png

电影的详情连接

Image(filename="./data/9_4.png",width=500)

output_35_0.png

2.urllib爬取全部页面

定义请求头和基本URL路径

import urllib.request

def movie():
    headers={
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"
    }
    
    base_url="https://movie.douban.com/top250?start="

定义一个可以遍历10次的循环,以拼接10页对应的URL地址

for i in range(0,10):
    full_url=base_url+str(i*25)

请求服务器,返回所有HTML网页

request=urllib.request.Request(full_url,headers=headers)
response=urllib.request.urlopen(request)
html=response.read()
print(html)

3.通过bs4选取数据

from bs4 import BeautifulSoup

# 选取符合要求的结点信息
soup=BeautifulSoup(html,"lxml")
div_list=soup.find_all("div",{"class":"info"})

for node in div_list:
    # 电影名称
    title=node.find("a").find("span").text
    # 电影评分
    score=node.find("div",class_="star").find("span",class_="rating_num").text+"分"
    # 详情链接
    link=node.find("a")["href"]
    
    data_dict={"电影":title,"评分":score,"链接":link}

4.MongoDB存储电影数据

from pymongo import MongoClient

client=MongoClient("localhost",27017)
db=client.test
collection=db.movie

# 逐条往集合插入文档
collection.insert_one(data_dict)

# 查找score=9.5的文档
cursor=collection.find({"评分":"9.5分"})

for doc in cursor:
    print(doc)

5.完整代码

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author LQ6H


import urllib.request
from pymongo.mongo_client import MongoClient
from bs4 import BeautifulSoup

def movie():
    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"

    headers={
        "User-Agent":user_agent
    }

    base_url="https://movie.douban.com/top250?start="

    for i in range(0,10):
        full_url=base_url+str(i*25)

        request=urllib.request.Request(full_url,headers=headers)
        response=urllib.request.urlopen(request)
        html=response.read()
        # print(html)

        # 选取符合要求的节点信息
        soup=BeautifulSoup(html,"lxml")
        div_list=soup.find_all("div",{"class":"info"})

        for node in div_list:
            # 电影名称
            title=node.find("a").find("span").text
            # 电影评分
            score=node.find("div",class_="star").find("span",class_="rating_num").text+"分"
            # 详情链接
            link=node.find("a")["href"]

            data_dict={"电影":title,"评分":score,"链接":link}

            client=MongoClient("localhost",27017)
            db=client.test
            collection=db.movie

            # 逐条往集合插入文档
            collection.insert_one(data_dict)

            # 查找score等于9.5的文档
            cursor=collection.find({"评分":"9.5分"})
            print(cursor)


if __name__=="__main__":
    movie()

结果显示

Image(filename="./data/9_5.png",width=500)

output_50_0.png

原文地址:https://www.cnblogs.com/LQ6H/p/12940567.html