MongoDB
-
什么是MongoDB
MongoDB是一个高性能,开源,无模式的文档型数据库
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成 -
MongoDB相关的安装
这里仅列出Windows系统的安装方法。- 推荐博客:https://zhuanlan.zhihu.com/p/29986675,博客中给出了详细的MongoDB数据库、可视化工具RoboMongo和MongoDB的PyCharm插件——Mongo Plugin的安装步骤和方法,可按照步骤安装并测试连接
- Python用于操作MongoDB的第三方库pymongo安装:
pip install pymongo
-
MongoDB在Python中的基本使用
这里通过一个简单的例子展示使用pymongo连接MongoDB数据库,并插入数据
#! /usr/bin/env python
# -*- coding:utf-8 -*-
from pymongo import MongoClient
client = MongoClient()
db = client.test #连接test数据库,没有则自动创建
my_set = db.set #使用set集合,没有则自动创建
my_set.insert({'name':'Vinie','age':24})#插入一条数据
插入的数据可在MongoDB的test数据库的set集合中找到
实战
爬取拉勾网有关“爬虫”的职位信息,并把爬取的数据存储在MongoDB数据库中
步骤:
- 首先前往拉勾网“爬虫”职位相关页面
- 确定网页的加载方式是JavaScript加载
- 通过谷歌浏览器开发者工具分析和寻找网页的真实请求,确定真实数据在position.Ajax开头的链接里,请求方式是POST
- 使用requests的post方法获取数据,发现并没有返回想要的数据,说明需要加上headers
- 加上headers的’Cookie’,’User-Agent’,’Referer’等信息,成功返回数据
- 再把返回的对应数据存储到MongoDB
代码实现:
- 爬取单页数据
#! /usr/bin/env python
# -*- coding:utf-8 -*-
from pymongo import MongoClient
import requests
client = MongoClient()
db = client.lagou #创建一个lagou数据库
my_set = db.job #创建job集合
url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false&isSchoolJob=0'
payload = {
'first':'true',
'pn':'1',
'kd':'爬虫',
}
headers = {
'Cookie':'',
'User-Agent':'',
'Referer':'',
} #填入对应的headers信息
response = requests.post(url, data = payload, headers = headers) #使用POST方法请求数据,加上payload和headers信息
my_set.insert(response.json()['content']['positionResult']['result']) #把对应的数据保存到MOngoDB
- 爬取多页数据.
定义一个函数爬取多页的数据;使用fake-Agent包随机选取User-Agent
关于fake-Agent的详细介绍,可以参考其官方文档:https://pypi.org/project/fake-useragent/
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import requests
from pymongo import MongoClient
import time
from fake_useragent import UserAgent
client = MongoClient()
db = client.lagou
lagou = db.PHP #创建PHP集合
headers = {
'Cookie':'',
'Referer':'',
} #对应的headers信息
def get_job_info(page, kd): #加入一个职位参数kd
for i in range(page):
url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false&isSchoolJob=0'
payload = {
'first': 'true',
'pn': i,
'kd': kd,
}
ua = UserAgent()
headers['User-Agent'] = ua.random #使用fake-Agent随机生成User-Agent,添加到headers
response = requests.post(url, data=payload, headers=headers)
if response.status_code == 200:
job_json = response.json()['content']['positionResult']['result']
lagou.insert(job_json)
else:
print('Something Wrong!')
print('正在爬取' + str(i+1) + '页的数据...')
time.sleep(3)
if __name__ == '__main__':
get_job_info(3, 'PHP') #爬取前3页的PHP职位信息