Python爬虫--数据存储 (7)

linux:将当前命令的输出结果作为下一个命令的输入
mongodb:具有同样作用,文档处理完毕,通过管道进行下一次处理

$group # 将集合的文档分组,可用于统计结果 /* _id表示分组的依据,使用某个字段的格式为\'$字段\'db.stu.aggregate([{$group:{_id:\'$gender\', conter:{$sum:1}}}]) */ $match # 用于过滤数据,只输出符条件的文档 $project # 修改输入文档的结构,如重命名,增加,删除字段,创建计算结果 $sort # 将输入文档排序后输出 $limit # 限制聚合管道返回的文档数 $skip # 路过指定数量的文档,并返回余下的文档 $limit和$skip # 先写skip,再写limit $unwind # 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值 Python与MongoDB交互

安装pymongo模块

pip install pymongo

创建连接

# Python与MongoDB交互--创建连接 import pymongo myclient = pymongo.MongoClient(\'mongodb://localhost:27017/\') mydb = myclient[\'mydb\'] print(mydb) myclient.close()

说明:
MongoDB的服务器必须启动才可以连接成功
创建数据库需要使用MongoClient对象,并且指定连接的URL地址和要创建的数据库名
localhost是要连接的主机,也可以用ip地址访问,27017是主机端口号,mydb是要选择的数据库

增删改查

# MongoDB-增删改查 import pymongo def is_having(mydb): dblist = myclient.list_database_names() if \'mydb\' in dblist: print(\'数据库已存在!\') else: print(\'数据库不存在!\') return mydb def insert(mydb): stu = mydb[\'stu\'] _id = stu.insert({ \'name\': \'扫地僧\', \'hometown\':\'少林寺\', \'age\': 66, \'gender\': True }) print(_id) def select(mydb): stu = mydb[\'stu\'] ret = stu.find() for i in ret: print(i) def update(mydb): stu = mydb[\'stu\'] x = stu.update_many({\'age\': {\'$gt\': 20}}, {\'$inc\': {\'age\': 1}}) print(x.modified_count, \'文档已修改\') def delete(mydb): stu = mydb[\'stu\'] x = stu.delete_many({\'age\': {\'$gt\': 20}}) print(x.deleted_count, \'个文档已删除\') myclient.close() if __name__ == \'__main__\': myclient = pymongo.MongoClient(\'mongodb://localhost:27017/\') mydb = myclient[\'mydb\'] is_having(mydb) insert(mydb) select(mydb) update(mydb) delete(mydb) myclient.close()

说明:
在MongoDB中,数据库只有在内容插入后才会创建。也就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。
MongoClient对象的list_database_names()获取所有数据

爬豆瓣电影,保存到MongoDB

# 爬豆瓣电影-保存到MongoDB import requests import random import time import threading import json import csv import pymongo from lxml import etree from queue import Queue class DouBanSpider: \'\'\'爬虫类\'\'\' def __init__(self): self.headers = {\'User-Agent\': \'Mozilla/5.0\'} self.baseURL = \'https://movie.douban.com/top250\' # MongoDB客户端对象 self.client = pymongo.MongoClient(\'mongodb://localhost:27017/\')[\'mydb\'][\'douban\'] def loadPage(self, url): \'\'\'向url发送请求,获取响应内容\'\'\' # 随机休眠0-2秒,避免爬虫过快,会导致爬虫封禁 time.sleep(random.random() * 2) return requests.get(url, headers=self.headers).content def parsePage(self, url): \'\'\'根据起始url提取所有的url\'\'\' # 获取url对应的响应内容 content = self.loadPage(url) html = etree.HTML(content) # 所有电影节点 node_list = html.xpath(\'//div[@class="info"]\') # 遍历 for node in node_list: # 使用字典存储数据 item = {} # 每部电影的标题 item[\'title\'] = node.xpath(\'.//span[@class="title"]/text()\')[0] # 每部电影的评分 item[\'score\'] = node.xpath(\'.//span[@class="rating_num"]/text()\')[0] self.client.insert(item) print(item) # 只有在第一页时才获取所有url组成的列表,其他页就不获取 if url == self.baseURL: return [self.baseURL + link for link in html.xpath(\'//div[@class="paginator"]/a/@href\')] def startWork(self): \'\'\'开始\'\'\' print(\'begin....\') # 第一个页面的请求,需要返回所有页面链接,并提取第一页的电影信息 link_list = self.parsePage(self.baseURL) thread_list = [] # 循环发送每个页面的请求,并获取所有电影信息 for link in link_list: # 循环创建了9个线程,每个线程都执行一个任务 thread = threading.Thread(target=self.parsePage, args=[link]) thread.start() thread_list.append(thread) # 父线程等待所有子线程结束,自己再结束 for thread in thread_list: thread.join() print(\'end...\') if __name__ == \'__main__\': # 创建爬虫对象 spider = DouBanSpider() # 开始爬虫 spider.startWork()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzpjgd.html