zoukankan      html  css  js  c++  java
  • 【爬虫】把抓到数据存起来——爬虫绝配mongodb

    【爬虫】把抓到数据存起来——爬虫绝配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()
  • 相关阅读:
    单精度和双精度
    @Transactional注解用法
    JPA No EntityManager with actual transaction available for current thread
    上传文件Request Entity Too Large解决办法
    PG数据库查看当前会话和结束会话
    Chrome浏览器记不住密码也不提示保存密码win10
    ARM平台VMP保护开发入门
    关于我
    HDU7072:Boring data structure problem——题解
    HDU7067:Just another board game——题解
  • 原文地址:https://www.cnblogs.com/pscc/p/9065138.html
Copyright © 2011-2022 走看看