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()
  • 相关阅读:
    ubuntu安装jdk的两种方法
    LeetCode 606. Construct String from Binary Tree (建立一个二叉树的string)
    LeetCode 617. Merge Two Binary Tree (合并两个二叉树)
    LeetCode 476. Number Complement (数的补数)
    LeetCode 575. Distribute Candies (发糖果)
    LeetCode 461. Hamming Distance (汉明距离)
    LeetCode 405. Convert a Number to Hexadecimal (把一个数转化为16进制)
    LeetCode 594. Longest Harmonious Subsequence (最长的协调子序列)
    LeetCode 371. Sum of Two Integers (两数之和)
    LeetCode 342. Power of Four (4的次方)
  • 原文地址:https://www.cnblogs.com/pscc/p/9065138.html
Copyright © 2011-2022 走看看