【爬虫】把抓到数据存起来——爬虫绝配mongodb
【爬虫】把抓到数据存起来——爬虫绝配mongodb
抓取数据的方法,前面的课程该讲的都已经讲了,爬取下来数据只是第一步,第二步就是要先存起来。我们最容易想到的就是存文件里喽,python写文件之前的课程也已经讲过了。存到文件里当然是可以的,但是你是否想过,每次使用都要把整个文件打开,然后读取,实在是有点不geek啊。
所以我们通常会选择存进数据库,方便写入和读取数据,并且对于大部分情况而言,python数据结构中的dict足够我们去结构化抓取的数据,那么能把两者发挥到极致的神器就是——mongodb!
mongodb
- 分布式
- 松散数据结构(json)
- 查询语言强大
文档
你可以看做是一个dict,dict里面还可以嵌套dict,例如:
{"name": "alan", score_list: {"chinese": 90, "english": 80}}
集合
一组文档,就是一堆dict。
数据库
多个集合组成数据库
这么理解:你可以把mongodb看做一个图书馆,图书馆中每本书就是文档,一个书架上的书是个集合,每个图书室的书架加起来就是个数据库。
安装
官方安装方法
学我教程的同学应该都知道,我不会给出具体步骤,鼓励大家按照官方文档去摸索,屏蔽伸手党。
该如何把抓取到的数据存入mongodb
- 把抓到的数据写成你想要的dict形式
- insert到指定的书架上
- 没了。。。
增删查改例子 python2版本
需要安装pymongo
pip install pymongo
# -*- coding: utf-8 -*-# Define your item pipelines here## Don't forget to add your pipeline to the ITEM_PIPELINES setting# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.htmlimport pymongoimport sysimport unittestreload(sys)sys.setdefaultencoding('utf-8')class MongoAPI(object):def __init__(self, db_ip, db_port, db_name, table_name):self.db_ip = db_ipself.db_port = db_portself.db_name = db_nameself.table_name = table_nameself.conn = pymongo.MongoClient(host=self.db_ip, port=self.db_port)self.db = self.conn[self.db_name]self.table = self.db[self.table_name]def get_one(self, query):return self.table.find_one(query, projection={"_id": False})def get_all(self, query):return self.table.find(query)def add(self, kv_dict):return self.table.insert(kv_dict)def delete(self, query):return self.table.delete_many(query)def check_exist(self, query):ret = self.get(query)return len(ret) > 0# 如果没有 会新建def update(self, query, kv_dict):ret = self.table.update_many(query,{"$set": kv_dict,})if not ret.matched_count or ret.matched_count == 0:self.add(kv_dict)elif ret.matched_count and ret.matched_count > 1:self.delete(query)self.add(kv_dict)class DBAPITest(unittest.TestCase):def setUp(self):self.db_api = MongoAPI("127.0.0.1", # 图书馆大楼地址27017, # 图书馆门牌号"test", # 一号图书室"test_table") # 第一排书架def test(self):db_api = self.db_apidb_api.add({"url": "test_url", "k": "v"})self.assertEqual(db_api.get_one({"url": "test_url"})["k"], "v")db_api.update({"url": "test_url"}, {"url_update": "url_update"})ob = db_api.get_one({"url": "test_url"})self.assertEqual(ob["url_update"], "url_update")db_api.delete({"url": "test_url"})self.assertEqual(db_api.get_one({"url": "test_url"}), None)if __name__ == '__main__':unittest.main()
【爬虫】把抓到数据存起来——爬虫绝配mongodb的更多相关文章
- windows环境下nutch2.x 在eclipse中实现抓取数据存进mysql详细步骤
nutch2.x 在eclipse中实现抓取数据存进mysql步骤 最近在研究nutch,花了几天时间,也遇到很多问题,最终结果还是成功了,在此记录,并给其他有兴趣的人提供参考,共同进步. 对nutc ...
- NET 5 爬虫框架/抓取数据
爬虫大家或多或少的都应该接触过的,爬虫有风险,抓数需谨慎. 爬虫有的是抓请求,有的是抓网页再解析 本着研究学习的目的,记录一下在 .NET Core 下抓取数据的实际案例.爬虫代码一般具有时效性,当 ...
- python抓取数据 常见反爬虫 情况
1.报文头信息: User-Agent Accept-Language 防盗链 上referer 随机生成不同的User-Agent构造报头 2.加抓取等待时间 每抓取一页都让它随机休息几秒,加入此 ...
- Python爬虫处理抓取数据中文乱码问题
乱码原因:因为你的文件声明为utf-8,并且也应该是用utf-8的编码保存的源文件.但是windows的本地默认编码是cp936,也就是gbk编码,所以在控制台直接打印utf-8的字符串当然是乱码了. ...
- 使用python抓取数据之菜鸟爬虫1
''' Created on 2018-5-27 @author: yaoshuangqi ''' #本代码获取百度乐彩网站上的信息,只获取最近100期的双色球 import urllib.reque ...
- Python3爬虫(十) 数据存储之非关系型数据库MongoDB
Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.非关系型数据库NoSQL全程是Not Only SQL,非关系型数据库.NoSQL是基于键值对的,不需要经过S ...
- 【转】Python爬虫:抓取新浪新闻数据
案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...
- Python爬虫:抓取新浪新闻数据
案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...
- 爬虫学习笔记(1)-- 利用Python从网页抓取数据
最近想从一个网站上下载资源,懒得一个个的点击下载了,想写一个爬虫把程序全部下载下来,在这里做一个简单的记录 Python的基础语法在这里就不多做叙述了,黑马程序员上有一个基础的视频教学,可以跟着学习一 ...
随机推荐
- linux初识1
linux 操作系统 概念性的理解 1.Linux内置解释器bash 相当于pyhon解释器 2.Linux的内部大多是使用python去书写 云计算 1.只需要 花钱,买腾讯,阿里云服务器 2.专人 ...
- 对JAVA工程师绝对有用的Java学习资源清单
学习Java和其他技术的资源其实非常多,但也不是都是好的有用的,我们要取其精华去其糟粕,选择那些最好的,最适合我们的,同时也要由浅入深,先易后难.基于这样的一个标准,我在这里为大家提供一份Java的学 ...
- CSS3 @font-face 规则
指定名为"myFirstFont"的字体,并指定在哪里可以找到它的URL: @font-face { font-family: myFirstFont; src: url('San ...
- jdbcUrl is required with driverClassName
https://blog.csdn.net/newbie_907486852/article/details/81391525 springboot2.0配置多数据源: spring.datasour ...
- Java NIO和IO的区别
下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异. 复制代码 代码如下: IO NIO面向流 面向缓冲阻塞IO 非阻塞IO无 选择器 面向流与面向缓冲 Java NIO ...
- 一张图弄懂js原型和原型链
前言 JavaScript的原型和原型链是面试的时候经常被问及到的问题,考察了我们对JavaScript的基础掌握情况,今天我们在这里用一张图来梳理下其中的知识点. 下面我来引入这张非常经典的图,我也 ...
- Linux REDHAT 7 关闭、禁用防火墙服务
1 查看防火墙状态 [root@lvxinghao ~]# systemctl status firewalld 2 查看开机是否启动防火墙服务[root@lvxinghao ~]# systemct ...
- NSLog的各种打印格式符和打印CGRect相关结构体
1.打印CG开头的数据类型,如CGRect,CGSize等方法 1.1 打印CGRect : NSLog(@"%@", NSStringFromCGRect(someCGRect) ...
- iOS应用状态保存和恢复
当应用被后台Kill掉的时候希望从后台返回的时候显示进入后台之前的内容 在Appdelegate中设置 - (BOOL)application:(UIApplication *)application ...
- Maven版本管理
一.Maven项目打包的两种方式 二.如何优雅地修改多模块maven项目中的版本号 三.一个项目使用另一个项目 一.Maven项目打包的两种方式: 1.依赖工具比如eclipse 2.使用命令行: ...