• 存储爬虫数据--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

  • 相关阅读:
    linux学习8 运维基本功-Linux获取命令使用帮助详解
    持续集成学习11 jenkins和gitlab集成自动触发
    持续集成学习10 Pipline初探
    持续集成学习9 jenkins执行脚本
    持续集成学习8 jenkins权限控制
    持续集成学习7 jenkins自动化代码构建
    持续集成学习6 jenkins自动化代码构建
    持续集成学习5 jenkins自动化测试与构建
    持续集成学习4 jenkins常见功能
    【Hadoop离线基础总结】MapReduce增强(下)
  • 原文地址:https://www.cnblogs.com/LQ6H/p/12940567.html
Copyright © 2020-2023  润新知