Python爬虫与MongoDB的完美结合

🔸 Windows和Linux下MongoDB环境搭建

Windows下安装MongoDB
  1. 访问MongoDB官网,下载适用于Windows的MongoDB安装包。
  2. 双击安装包,选择"Complete"安装类型。
  3. 设置安装路径和数据存储路径,完成安装。

完成安装后,启动MongoDB服务:

bash 复制代码
"C:\Program Files\MongoDB\Server\4.4\bin\mongod.exe" --dbpath "C:\data\db"
Linux下安装MongoDB

在Linux系统下,通过包管理器安装MongoDB:

bash 复制代码
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org

启动MongoDB服务:

bash 复制代码
sudo systemctl start mongod
sudo systemctl enable mongod

🔸 MongoDB写入规范

在Python中使用pymongo库写入数据到MongoDB:

python 复制代码
import pymongo

# 连接到MongoDB
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]
collection = db["articles"]

# 插入单条数据
article = {
    "title": "文章标题",
    "author": "作者名",
    "content": "文章内容",
    "url": "http://example.com/article",
    "created_at": datetime.datetime.now()
}
collection.insert_one(article)

# 插入多条数据
articles = [
    {
        "title": "文章标题1",
        "author": "作者名1",
        "content": "文章内容1",
        "url": "http://example.com/article1",
        "created_at": datetime.datetime.now()
    },
    {
        "title": "文章标题2",
        "author": "作者名2",
        "content": "文章内容2",
        "url": "http://example.com/article2",
        "created_at": datetime.datetime.now()
    }
]
collection.insert_many(articles)

🔹 在这个示例中,我们使用insert_one方法插入单条数据,使用insert_many方法插入多条数据。


🔸 MongoDB对接爬虫实战

将以上知识结合起来,构建一个简单的爬虫,并将爬取到的数据存储到MongoDB中:

python 复制代码
import requests
from bs4 import BeautifulSoup
import pymongo
import datetime

# 爬取网页数据
url = 'http://example.com/articles'
response = requests.get(url)
html_content = response.content
soup = BeautifulSoup(html_content, 'html.parser')

# 连接到MongoDB
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]
collection = db["articles"]

# 解析并插入数据
articles = soup.find_all('div', class_='article')
for article in articles:
    title = article.find('h1').text
    author = article.find('span', class_='author').text
    content = article.find('p', class_='content').text
    url = article.find('a')['href']
    
    article_data = {
        "title": title,
        "author": author,
        "content": content,
        "url": url,
        "created_at": datetime.datetime.now()
    }
    
    collection.insert_one(article_data)

🔹 在这个示例中,我们爬取网页中的文章数据,并将其插入到MongoDB的articles集合中,实现了爬虫和数据库的完美对接。


🔸 MongoDB优化

为了提升MongoDB的性能,可以考虑以下优化措施:

  1. 索引优化 :为常用的查询字段添加索引,例如文章集合中的titleurl字段。

    python 复制代码
    collection.create_index([("title", pymongo.TEXT)])
    collection.create_index([("url", pymongo.ASCENDING)], unique=True)
  2. 批量插入:一次性插入多条记录,减少写入操作次数。

    python 复制代码
    articles = [
        {
            "title": "标题1",
            "author": "作者1",
            "content": "内容1",
            "url": "http://example.com/1",
            "created_at": datetime.datetime.now()
        },
        {
            "title": "标题2",
            "author": "作者2",
            "content": "内容2",
            "url": "http://example.com/2",
            "created_at": datetime.datetime.now()
        }
    ]
    collection.insert_many(articles)
  3. 查询优化:使用适当的查询语句,避免全集合扫描。

    python 复制代码
    articles = collection.find({"title": {"$regex": "^Python"}}).limit(10)
    for article in articles:
        print(article)

🔹 通过这些优化措施,可以显著提升MongoDB的性能和查询效率。


🔸 总结

🔹 通过本次学习,我们掌握了在Windows和Linux系统下安装MongoDB,设计适合爬虫存储数据的写入规范,并通过实际爬虫示例展示了如何将爬取到的数据存储到MongoDB中。此外,还进行了MongoDB性能优化,提高了数据存储和查询的效率。

相关推荐
小小爬虾几秒前
关于datetime获取时间的问题
python
从零开始学习人工智能3 分钟前
Doris 数据库深度解析:架构、原理与实战应用
数据库·架构
LiRuiJie40 分钟前
深入剖析MySQL锁机制,多事务并发场景锁竞争
数据库·mysql
我很好我还能学44 分钟前
【面试篇 9】c++生成可执行文件的四个步骤、悬挂指针、define和const区别、c++定义和声明、将引用作为返回值的好处、类的四个缺省函数
开发语言·c++
2501_915374351 小时前
Faiss向量数据库全面解析:从原理到实战
数据库·faiss
睡觉待开机1 小时前
0. MySQL在Centos 7环境安装
数据库·mysql·centos
2501_915374351 小时前
Faiss vs Milvus 深度对比:向量数据库技术选型指南
数据库·milvus·faiss
蓝婷儿1 小时前
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
开发语言·python·学习
渣渣盟1 小时前
基于Scala实现Flink的三种基本时间窗口操作
开发语言·flink·scala
chao_7892 小时前
链表题解——两两交换链表中的节点【LeetCode】
数据结构·python·leetcode·链表