【爬虫】把抓到数据存起来——爬虫绝配mongodb

视频地址

抓取数据的方法,前面的课程该讲的都已经讲了,爬取下来数据只是第一步,第二步就是要先存起来。我们最容易想到的就是存文件里喽,python写文件之前的课程也已经讲过了。存到文件里当然是可以的,但是你是否想过,每次使用都要把整个文件打开,然后读取,实在是有点不geek啊。 
所以我们通常会选择存进数据库,方便写入和读取数据,并且对于大部分情况而言,python数据结构中的dict足够我们去结构化抓取的数据,那么能把两者发挥到极致的神器就是——mongodb!

mongodb

  1. 分布式
  2. 松散数据结构(json)
  3. 查询语言强大

文档

你可以看做是一个dict,dict里面还可以嵌套dict,例如:

  1. {"name": "alan", score_list: {"chinese": 90, "english": 80}}

集合

一组文档,就是一堆dict。

数据库

多个集合组成数据库

这么理解:你可以把mongodb看做一个图书馆,图书馆中每本书就是文档,一个书架上的书是个集合,每个图书室的书架加起来就是个数据库。

安装

官方安装方法 
学我教程的同学应该都知道,我不会给出具体步骤,鼓励大家按照官方文档去摸索,屏蔽伸手党。

该如何把抓取到的数据存入mongodb

  1. 把抓到的数据写成你想要的dict形式
  2. insert到指定的书架上
  3. 没了。。。

增删查改例子 python2版本

需要安装pymongo

  1. pip install pymongo

mongo_api.py

  1. # -*- coding: utf-8 -*-
  2. # Define your item pipelines here
  3. #
  4. # Don't forget to add your pipeline to the ITEM_PIPELINES setting
  5. # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
  6. import pymongo
  7. import sys
  8. import unittest
  9. reload(sys)
  10. sys.setdefaultencoding('utf-8')
  11. class MongoAPI(object):
  12. def __init__(self, db_ip, db_port, db_name, table_name):
  13. self.db_ip = db_ip
  14. self.db_port = db_port
  15. self.db_name = db_name
  16. self.table_name = table_name
  17. self.conn = pymongo.MongoClient(host=self.db_ip, port=self.db_port)
  18. self.db = self.conn[self.db_name]
  19. self.table = self.db[self.table_name]
  20. def get_one(self, query):
  21. return self.table.find_one(query, projection={"_id": False})
  22. def get_all(self, query):
  23. return self.table.find(query)
  24. def add(self, kv_dict):
  25. return self.table.insert(kv_dict)
  26. def delete(self, query):
  27. return self.table.delete_many(query)
  28. def check_exist(self, query):
  29. ret = self.get(query)
  30. return len(ret) > 0
  31. # 如果没有 会新建
  32. def update(self, query, kv_dict):
  33. ret = self.table.update_many(
  34. query,
  35. {
  36. "$set": kv_dict,
  37. }
  38. )
  39. if not ret.matched_count or ret.matched_count == 0:
  40. self.add(kv_dict)
  41. elif ret.matched_count and ret.matched_count > 1:
  42. self.delete(query)
  43. self.add(kv_dict)
  44. class DBAPITest(unittest.TestCase):
  45. def setUp(self):
  46. self.db_api = MongoAPI("127.0.0.1", # 图书馆大楼地址
  47. 27017, # 图书馆门牌号
  48. "test", # 一号图书室
  49. "test_table") # 第一排书架
  50. def test(self):
  51. db_api = self.db_api
  52. db_api.add({"url": "test_url", "k": "v"})
  53. self.assertEqual(db_api.get_one({"url": "test_url"})["k"], "v")
  54. db_api.update({"url": "test_url"}, {"url_update": "url_update"})
  55. ob = db_api.get_one({"url": "test_url"})
  56. self.assertEqual(ob["url_update"], "url_update")
  57. db_api.delete({"url": "test_url"})
  58. self.assertEqual(db_api.get_one({"url": "test_url"}), None)
  59. if __name__ == '__main__':
  60. unittest.main()

【爬虫】把抓到数据存起来——爬虫绝配mongodb的更多相关文章

  1. windows环境下nutch2.x 在eclipse中实现抓取数据存进mysql详细步骤

    nutch2.x 在eclipse中实现抓取数据存进mysql步骤 最近在研究nutch,花了几天时间,也遇到很多问题,最终结果还是成功了,在此记录,并给其他有兴趣的人提供参考,共同进步. 对nutc ...

  2. NET 5 爬虫框架/抓取数据

    爬虫大家或多或少的都应该接触过的,爬虫有风险,抓数需谨慎.  爬虫有的是抓请求,有的是抓网页再解析 本着研究学习的目的,记录一下在 .NET Core 下抓取数据的实际案例.爬虫代码一般具有时效性,当 ...

  3. python抓取数据 常见反爬虫 情况

    1.报文头信息: User-Agent Accept-Language  防盗链 上referer 随机生成不同的User-Agent构造报头 2.加抓取等待时间 每抓取一页都让它随机休息几秒,加入此 ...

  4. Python爬虫处理抓取数据中文乱码问题

    乱码原因:因为你的文件声明为utf-8,并且也应该是用utf-8的编码保存的源文件.但是windows的本地默认编码是cp936,也就是gbk编码,所以在控制台直接打印utf-8的字符串当然是乱码了. ...

  5. 使用python抓取数据之菜鸟爬虫1

    ''' Created on 2018-5-27 @author: yaoshuangqi ''' #本代码获取百度乐彩网站上的信息,只获取最近100期的双色球 import urllib.reque ...

  6. Python3爬虫(十) 数据存储之非关系型数据库MongoDB

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.非关系型数据库NoSQL全程是Not Only SQL,非关系型数据库.NoSQL是基于键值对的,不需要经过S ...

  7. 【转】Python爬虫:抓取新浪新闻数据

    案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...

  8. Python爬虫:抓取新浪新闻数据

    案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...

  9. 爬虫学习笔记(1)-- 利用Python从网页抓取数据

    最近想从一个网站上下载资源,懒得一个个的点击下载了,想写一个爬虫把程序全部下载下来,在这里做一个简单的记录 Python的基础语法在这里就不多做叙述了,黑马程序员上有一个基础的视频教学,可以跟着学习一 ...

随机推荐

  1. python-tkinter使用方法——转载(二)

    转载URL:https://www.cnblogs.com/yudanqu/p/9467803.html Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包 ...

  2. 【C++札记】赋值兼容

    赋值兼容的规则时在需要使用基类对象的任何地方都可以使用公有派生类对象来替代.公有继承派生类可获得基类中除构造函数,析构函数外的所有成员,能用基类解决的问题,派生类也能解决.更直白点说,如果一个类是从一 ...

  3. Python规范:代码规范要注意

    主要有以下两种代码规范 <8 号 Python 增强规范>(Python Enhacement Proposal #8),以下简称 PEP8: <Google Python 风格规范 ...

  4. 二次剩余定理及Cipolla算法入门到自闭

    二次剩余定义: 在维基百科中,是这样说的:如果q等于一个数的平方模 n,则q为模 n 意义下的二次剩余.例如:x2≡n(mod p).否则,则q为模n意义下的二次非剩余. Cipolla算法:一个解决 ...

  5. Luogu4827 Crash的文明世界 组合、树形DP

    传送门 又是喜闻乐见的\(k\)次幂求和题目 那么\(S(x) = \sum\limits_{i=1}^n dist(i,x)^k = \sum\limits_{i=1}^n \sum\limits_ ...

  6. 概率及期望DP小结

    资源分享 26 个比较概率大小的问题 数论小白都能看懂的数学期望讲解 概念 \(PS\):不需要知道太多概念,能拿来用就行了. 定义 样本(\(\omega\)):一次随机试验产生的一个结果. 样本空 ...

  7. 创建包含CRUD操作的Web API接口-第一部

    在这里,我们将创建一个新的Web API项目,它将使用实体框架实现Get,POST.PUT和DELETE方法来实现CRUD操作. 首先,在Visual Studio 2013 for Web expr ...

  8. Java8 基础数据类型包装类-Long

     https://blog.csdn.net/u012562117/article/details/79023440 基础 //final修饰不可更改,每次赋值都是新建类(其中-128~127是通过L ...

  9. 使用 SetParent 跨进程设置父子窗口时的一些问题(小心卡死)

    原文:使用 SetParent 跨进程设置父子窗口时的一些问题(小心卡死) 在微软的官方文档中,说 SetParent 可以在进程内设置,也可以跨进程设置.当使用跨进程设置窗口的父子关系时,你需要注意 ...

  10. (七) Docker 部署 MySql8.0 一主一从 高可用集群

    参考并感谢 官方文档 https://hub.docker.com/_/mysql y0ngb1n https://www.jianshu.com/p/0439206e1f28 vito0319 ht ...