存储爬虫数据–Mongodb
通常,从网页爬取到的数据需要进行分析,处理或格式化,然后进行持久化存储,以备后续使用.数据存储主要有两种方式:文件存储和数据库存储
一.使用PyMongo库存储到数据库
PyMongo
是用于MongoDB的开发工具,是python操作MongoDB数据库的推荐方式.PyMongo
中主要提供了如下类与MongoDB数据库进行交互:
- MongoClient类:用于与MongoDB服务器建立连接
- DataBase类:表示MongoDB中的数据库
- Collection类:表示MongoDB中的集合
- Cursor类:表示查询方法返回的结果,用于对多行数据进行遍历
PyMongo
库的基本使用流程如下:
- 创建一个
MongoClient
类的对象,与MongoDB服务器建立连接 - 通过
MongoClient
对象访问数据库(DataBase对象) - 使用上个步骤的数据库创建一个集合(Collection对象)
- 调用集合中提供的方法在集合中插入,删除,修改和查询文档
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.插入文档
往集合中插入文档的方法主要有如下两个:
- insert_one()方法:插入一条文档对象
- 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.查询文档
用于查找文档的方法主要有如下几个:
- find_one()方法:查找一条文档对象
- find_many()方法:查找多条文档对象
- 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.更新文档
用于更新文档的方法主要有如下几个:
- update_one()方法:更新一条文档对象
- update_many()方法:更新多条文档对象
collection.update_one({"name":"zhangsan"},{"$set":{"age":25}})
<pymongo.results.UpdateResult at 0x29eef950bc8>
7.删除文档
用于删除文档的方法包括如下几个:
- delete_one()方法:删除一条文档对象
- 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)
表示电影名称的标签
Image(filename="./data/9_2.png",width=500)
获取电影的评分
Image(filename="./data/9_3.png",width=500)
电影的详情连接
Image(filename="./data/9_4.png",width=500)
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)