美文网首页Python 爬虫我爱编程
【Python爬虫】数据入库之MongoDB

【Python爬虫】数据入库之MongoDB

作者: 倔强的潇洒小姐 | 来源:发表于2018-05-11 16:30 被阅读271次

    1、什么是MongoDB

    MongoDB是一个高性能,开源,无模式的文档型数据库,将数据存储为一个文档,数据结构由键值对(key->value)组成

    2、 MongoDB相关的安装

    Windows的安装方法:
    1、详见知乎专栏MongoDB及可视化工具的安装,可按照步骤安装并测试连接
    2、安装MongoDB的第三方库pymongo

     pip install pymongo
    

    Mac OS的安装方法:
    1、参考Mac OSX 平台安装 MongoDB安装,可视化工具RoboMongo安装方法与Windows平台大致相同。
    2、 MongoDB的PyCharm插件——Mongo Plugin安装: Preferences——Plugins——Mongo Plugin,安装完成后重启PyCharm可发现右侧有Mongo Explorer
    3、安装MongoDB的第三方库pymongo
    4、测试连接

     首先需要使用以下方法在终端启动MongoDB
     cd /usr/local/mongodb/bin
     sudo ./mongod
     然后在PyCharm右侧的Mongo Explorer连接localhost:27017即可
    

    3、MongoDB在Python中的基本使用

    通过一个简单的例子展示使用pymongo连接MongoDB数据库,创建数据库、创建表并插入数据

    # -*- coding: utf-8 -*-
    # __author__ = 'Carina'
    
    
    from pymongo import MongoClient
    
    
    client = MongoClient()
    # 连接test数据库,没有则自动创建
    db = client.test
    # 使用zyp集合,没有则自动创建
    my_set = db.zyp
    
    my_set.insert({"name":"carina","age":18,"job":"software test"})
    

    插入的数据可在MongoDB的test数据库的zyp集合中找到

    效果图.png

    实战环节

    爬取拉勾网有关“爬虫”的职位信息,并把爬取的数据存储在MongoDB数据库中

    1、访问拉勾网“爬虫”职位相关页面
    2、确定网页的加载方式:此处是JavaScript加载
    3、通过谷歌浏览器开发者工具(或者抓包工具)分析和寻找网页的真实请求,确定真实数据在positionAjax开头的链接里,请求方式是POST
    4、使用requests的post方法获取数据,发现并没有返回想要的数据,说明需要加上headers
    5、加上headers的“Cookie”,“User-Agent”,“Referer”等信息,成功返回数据(需要添加什么,可以比对常规头信息,然后一个个试)
    6、再把返回的对应数据存储到MongoDB

    爬取单页数据
    image.png

    代码:

    # -*- coding: utf-8 -*-
    # __author__ = 'Carina'
    
    import requests
    from pymongo import MongoClient
    
    
    client = MongoClient()
    # 连接test数据库,没   有则自动创建
    db = client.lagou
    # 使用set集合,没有则自动创建表
    my_set = db.job
    
    #my_set.insert({"name":"carina","age":18,"job":"software test"})
    
    url = 'https://www.lagou.com/jobs/positionAjax.json?city=%E6%9D%AD%E5%B7%9E&needAddtionalResult=false'
    
    payload = {
        "first": "true",
        "pn": "1",
        "kd": "爬虫",
    }
    
    # 填入对应的headers信息
    headers = {
        "Cookie": "",
        "User-Agent": "",
        "Referer": "",
    }
    
    response = requests.post(url, data=payload, headers=headers)
    
    #print(response.text)
    # 把对应的数据保存到MongoDB
    my_set.insert(response.json()['content']['positionResult']['result'])       
    
    效果.png
    爬取多页数据

    1、定义一个函数爬取多页的数据
    2、使用fake-Agent包随机选取User-Agent(伪装请求头中的User Agent值)

    代码:

    # -*- coding: utf-8 -*-
    # __author__ = 'Carina'
    
    import requests
    from pymongo import MongoClient
    import time
    from fake_useragent import UserAgent
    
    
    client = MongoClient()
    # 连接test数据库,没有则自动创建
    db = client.lagou
    # 使用set集合,没有则自动创建表
    my_set = db.job
    
    headers = {
        "Cookie": "",
        "Referer": "",
    }
    
    def get_job_info(page, kd):
        for i in range(page):
            url = 'https://www.lagou.com/jobs/positionAjax.json?city=%E6%9D%AD%E5%B7%9E&needAddtionalResult=false'
            payload = {
               "first": "true",
               "pn": i,
               "kd": kd,
            }
            ua = UserAgent()
            #使用fake-Agent随机生成User-Agent,添加到headers
            headers["User-Agent"] = ua.random
            response = requests.post(url, data=payload, headers=headers)
    
            if response.status_code == 200:
                job_json = response.json()['content']['positionResult']['result']
                my_set.insert(job_json)
            else:
                print("something wrong!")
    
            print("正在爬取" + str(i+1) + "页的数据...")
            time.sleep(3)
    
    
    if __name__ == "__main__":
        get_job_info(3, "产品经理")   # 爬取3页的产品经理数据
    

    PS:对于一些Ajax加载的请求不太好分析的(爬虫难爬时),比如访问新浪微博,这时可以使用移动端地址进行访问,因为移动端的字段反爬会做的比较少,https://weibo.cnhttps://m.weibo.cn

    image.png

    补充资料

    1、MongoDB

    2、POST请求

    3、fake-useragent包

    相关文章

      网友评论

        本文标题:【Python爬虫】数据入库之MongoDB

        本文链接:https://www.haomeiwen.com/subject/cfvecftx.html