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.cn、https://m.weibo.cn
image.png补充资料
1、MongoDB
- 学习更多关于MongoDB语法的知识:MongoDB 3.4 中文文档
- 可以在Github的PyMongo中学习到更多pymongo包的用法
2、POST请求
- 阅读更加复杂的 POST 请求,学习关于requests的POST请求方法的用法
3、fake-useragent包
- 前往fake-useragent 0.1.7官方文档,学习更多fake-useragent的用法
网友评论