学了那么多的爬虫库,怎么能没有数据库这个东东呢?在开发过程中,数据是必不可少的,数据库也是应运而生了,数据和数据库这两个兄弟是缺一不可的


首先我们要使用,pymongo,必须要安装 mongodb 数据库,小编已经找到网址了,可以直接下载对应桌面的程序,安装即可


https://docs.mongodb.com/manual/installation/


爬虫(105)pymongo, 这一篇文章够了,值得收藏_java


这里需要强调一下就是我们安装完数据库之后需要把安装程序的目录,放到系统 path 目录,所以找到我们的安装的程序目录,这里我安装在 D 盘


爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_02


右键菜单,点击属性


爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_03


点击高级设置


爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_04

选择环境变量设置


爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_05


选中 path,点击编辑


爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_06

点击新建,将安装的 bin 目录复制在此就行了


爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_07


接下来就是测试是否安装成功了,win + r 输入 cmd, 回车,输入 mongo


爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_08


安装 pymongo



导入 pymongo


import pymongo

与 mongodb 建立链接


from pymongo import MongoClient
client = MongoClient()

# or
client = MongoClient('localhost', 27017)

# or
client = MongoClient('mongodb://localhost:27017/')

获取数据库


db = client.test_database# or

db = client['test-database']


爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_09


获取集合


collection = db.test_collection

# or

collection = db['test-collection']

爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_10


文件


import datetime

post = {"author": "Mike",
  "text": "My first blog post!",
 "tags": ["mongodb", "python", "pymongo"],
  "date": datetime.datetime.utcnow()}

插入文档


posts = db.posts
post_id = posts.insert_one(post).inserted_id
post_id


爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_11


获取单个文档 find_one()


在MongoDB中可以执行的最基本的查询类型是 find_one()此方法返回与查询匹配的单个文档(或者None如果不匹配)。当您知道只有一个匹配的文档或仅对第一个匹配感兴趣时,此功能很有用。在这里,我们用来 find_one()从posts集合中获取第一个文档:


import pprint
pprint.pprint(posts.find_one())

find_one()还支持查询结果文档必须匹配的特定元素。为了将结果限制在作者为“ Mike”的文档中,我们这样做:


pprint.pprint(posts.find_one({"author": "Mike"}))

通过ObjectId 查询


post_id
pprint.pprint(posts.find_one({"_id": post_id}))

请注意,ObjectId与它的字符串表示形式不同:


post_id_as_str = str(post_id)
posts.find_one({"_id": post_id_as_str}) # No result


Web应用程序中的常见任务是从请求URL获取ObjectId并找到匹配的文档。在这种情况下,有必要先将ObjectId从字符串转换为 find_one


from bson.objectid import ObjectId

# The web framework gets post_id from the URL and passes it as a string
def get(post_id):
   # Convert from string to ObjectId:
   document = client.db.collection.find_one({'_id': ObjectId(post_id)})

您可能已经注意到,从服务器中检索到的较早存储的常规Python字符串看起来有所不同(例如u'Mike'而不是'Mike')。有一个简短的解释。

MongoDB以BSON格式存储数据BSON字符串采用UTF-8编码,因此PyMongo必须确保其存储的任何字符串仅包含有效的UTF-8数据。常规字符串(<type'str'>)经过验证并保持不变。Unicode字符串(<type'unicode'>)首先被编码为UTF-8。我们的示例字符串在Python外壳中表示为u'Mike'而不是'Mike'的原因是PyMongo将每个BSON字符串解码为Python unicode字符串,而不是常规str。

您可以在此处阅读有关Python unicode字符串的更多信息


批量插入


为了使查询更加有趣,让我们插入更多文档。除了插入单个文档,我们还可以通过将列表作为第一个参数传递来执行批量插入操作insert_many()这会将每个文档插入列表,仅向服务器发送一个命令:


new_posts = [{"author": "Mike",
 "text": "Another post!",
 "tags": ["bulk", "insert"],
 "date": datetime.datetime(2009, 11, 12, 11, 14)},
 {"author": "Eliot",
   "title": "MongoDB is fun",
   "text": "and pretty easy too!",
   "date": datetime.datetime(2009, 11, 10, 10, 45)}]
result = posts.insert_many(new_posts)
result.inserted_ids

爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_12

查询多个文档


要获取多个文档作为查询结果,我们使用的 find() 方法。find()返回一个 Cursor实例,该实例使我们可以迭代所有匹配的文档。例如,我们可以遍历posts集合中的每个文档


for post in posts.find():
   pprint.pprint(post)

爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_13


就像我们对所做的一样find_one(),我们可以传递文档find() 以限制返回的结果。在这里,我们仅获得作者为“迈克”的那些文档:


for post in posts.find({"author": "Mike"}):
   pprint.pprint(post)

爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_14

计数


如果我们只想知道有多少文档与某个查询匹配,我们可以执行count_documents()操作而不是完整查询。我们可以对集合中的所有文档进行计数:


posts.count_documents({})

爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_15

或仅与特定查询匹配的那些文档:


posts.count_documents({"author": "Mike"})

爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_16

范围查询


MongoDB支持许多不同类型的高级查询例如,让我们执行一个查询,在查询中我们将结果限制为早于某个特定日期的帖子,还按作者对结果进行排序:


d = datetime.datetime(2009, 11, 12, 12)
for post in posts.find({"date": {"$lt": d}}).sort("author"):
   pprint.pprint(post)

爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_17

索引


添加索引可以帮助加速某些查询,还可以为查询和存储文档添加其他功能。在此示例中,我们将演示如何在键上创建唯一索引,该键将拒绝索引中已存在该键值的文档。

首先,我们需要创建索引:


result = db.profiles.create_index([('user_id', pymongo.ASCENDING)],unique=True)

sorted(list(db.profiles.index_information()))

爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_18


请注意,我们现在有两个索引:一个是_idMongoDB自动创建的索引,另一个是user_id刚刚创建的索引

现在让我们设置一些用户配置文件:


user_profiles = [
 {'user_id': 211, 'name': 'Luke'},
 {'user_id': 212, 'name': 'Ziltoid'}]
result = db.profiles.insert_many(user_profiles)

爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_19

该索引阻止我们插入user_id已经在集合中的文档


duplicate_profile = {'user_id': 212, 'name': 'Tommy'}
result = db.profiles.insert_one(new_profile)  # This is fine.
result = db.profiles.insert_one(duplicate_profile)
Traceback (most recent call last):
DuplicateKeyError: E11000 duplicate key error index: test_database.profiles.$user_id_1 dup key

爬虫(105)pymongo, 这一篇文章够了,值得收藏_java_20


点赞走起来,今天的文章就分享到这里吧,明天拿一些精彩的爬虫来实践时间