数据抓取与存储:将网络爬虫数据保存到数据库的详细指南

embedded/2024/11/23 18:45:31/

在当今信息爆炸的时代,网络爬虫已经成为获取和处理数据的重要工具。将爬取的数据保存到数据库中,不仅可以有效地组织和存储数据,还可以为后续的数据分析和处理提供便利。本文将详细介绍如何将爬取的数据保存到数据库中,包括关系型数据库和非关系型数据库的保存方法,并通过Python代码示例展示具体的实现步骤。

1. 选择合适的数据库

首先,根据数据的结构和使用需求选择合适的数据库。关系型数据库(如MySQL、PostgreSQL)适合结构化数据,非关系型数据库(如MongoDB)适合半结构化或非结构化数据。

2. 设计数据库模型

在保存数据之前,需要设计合适的数据库模型。这包括确定数据表的结构、字段类型和索引等。

示例代码(MySQL):

CREATE TABLE articles (id INT AUTO_INCREMENT PRIMARY KEY,title VARCHAR(255) NOT NULL,content TEXT,url VARCHAR(255) UNIQUE,published_date DATETIME
);

这个表用于存储文章的标题、内容、URL和发布日期。

3. 使用Python连接数据库

使用Python的数据库驱动程序连接到数据库。对于MySQL,可以使用mysql-connector-pythonpymysql

安装MySQL驱动

pip install mysql-connector-python

示例代码

import mysql.connectorconfig = {'user': 'your_username','password': 'your_password','host': 'localhost','database': 'your_database','raise_on_warnings': True
}cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()
4. 插入数据到数据库

将爬取的数据插入到数据库中。可以使用参数化查询来防止SQL注入攻击。

示例代码

insert_query = "INSERT INTO articles (title, content, url, published_date) VALUES (%s, %s, %s, %s)"
data = ("Article Title", "Article content", "http://example.com/article", "2021-07-26 14:30:00")cursor.execute(insert_query, data)
cnx.commit()
5. 处理大量数据

当处理大量数据时,应该批量插入数据以提高效率。

示例代码

articles_data = [("Title1", "Content1", "http://example.com/1", "2021-07-26 14:30:00"),("Title2", "Content2", "http://example.com/2", "2021-07-26 15:00:00"),# 更多文章数据...
]cursor.executemany(insert_query, articles_data)
cnx.commit()
6. 更新和删除数据

除了插入数据,有时还需要更新或删除数据库中的数据。

示例代码

update_query = "UPDATE articles SET content = %s WHERE id = %s"
cursor.execute(update_query, ("Updated content", 1))
cnx.commit()delete_query = "DELETE FROM articles WHERE id = %s"
cursor.execute(delete_query, (1,))
cnx.commit()
7. 使用ORM工具

为了简化数据库操作,可以使用ORM(对象关系映射)工具,如SQLAlchemy。

安装SQLAlchemy

pip install SQLAlchemy

示例代码

from sqlalchemy import create_engine, Column, Integer, String, Text, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import datetimeBase = declarative_base()class Article(Base):__tablename__ = 'articles'id = Column(Integer, primary_key=True)title = Column(String(255), nullable=False)content = Column(Text)url = Column(String(255), unique=True)published_date = Column(DateTime)engine = create_engine('mysql+mysqlconnector://your_username:your_password@localhost/your_database')
Session = sessionmaker(bind=engine)
session = Session()# 添加新文章
new_article = Article(title="New Article", content="Content", url="http://example.com/new", published_date=datetime.datetime.now())
session.add(new_article)
session.commit()# 查询文章
article = session.query(Article).filter_by(id=1).first()
print(article.title)
8. 错误处理和日志记录

在与数据库交互时,应该妥善处理可能出现的错误,并记录必要的日志。

示例代码

try:cursor.execute(insert_query, data)cnx.commit()
except mysql.connector.Error as err:print("Something went wrong: {}".format(err))cnx.rollback()
finally:cursor.close()cnx.close()
9. 非关系型数据库存储

对于非结构化数据,可以选择非关系型数据库,如MongoDB。

安装MongoDB驱动

pip install pymongo

示例代码

from pymongo import MongoClientclient = MongoClient('localhost', 27017)
db = client['your_database']
collection = db['articles']# 插入文档
article = {"title": "Article Title", "content": "Article content", "url": "http://example.com/article", "published_date": "2021-07-26 14:30:00"}
collection.insert_one(article)# 查询文档
result = collection.find_one({"title": "Article Title"})
print(result['content'])
10. 综合示例

下面是一个综合示例,展示了如何从网页爬取数据并保存到MySQL数据库中。

示例代码

import requests
from bs4 import BeautifulSoup
import mysql.connector# 爬取网页数据
url = 'http://example.com/articles'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')# 解析文章数据
articles = []
for article_tag in soup.find_all('article'):title = article_tag.find('h2').textcontent = article_tag.find('p').texturl = article_tag.find('a')['href']published_date = article_tag.find('time')['datetime']articles.append((title, content, url, published_date))# 连接数据库并保存数据
config = {'user': 'your_username','password': 'your_password','host': 'localhost','database': 'your_database','raise_on_warnings': True
}cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()insert_query = "INSERT INTO articles (title, content, url, published_date) VALUES (%s, %s, %s, %s)"
cursor.executemany(insert_query, articles)
cnx.commit()cursor.close()
cnx.close()

这个脚本从网页爬取文章数据,并将其保存到MySQL数据库中。

结论

将爬取的数据保存到数据库中是网络爬虫开发中的一个重要环节。通过使用Python连接数据库,并执行插入、更新和删除操作,我们可以有效地存储和管理数据。本文详细介绍了如何使用Python将数据保存到关系型数据库和非关系型数据库,并提供了丰富的代码示例,帮助读者深入理解数据存储的过程。随着你对网络爬虫技术的深入,合理保存数据将使你的数据收集工作更加高效和有序。


http://www.ppmy.cn/embedded/139914.html

相关文章

c++ 20 语法规范, vs2019 类 exception 的定义,在 vcruntime_exception .h

这个源头文件,在 STL 模板库里的其他模板的定义中,会引用到,因此,记录与注释一下。源代码很短,直接展开来,同时也附上资源 .h 文件: // // vcruntime_exception.h // // Copyright (c) Mi…

PyCharm的类型警告: Expected type ‘SupportsWrite[bytes]‘, got ‘BinaryIO‘ instead

记录时使用的PyCharm版本: PyCharm 2024.3 (Professional Edition) Build #PY-243.21565.199, built on November 13, 2024 问题描述 当在PyCharm里使用pickle保存文件, 比如以下代码这样: with open(meta_save_path, wb) as f:pickle.dump(meta, f)会发现PyCharm对此发出类型…

为什么芯麦的 GC4931P 可以替代A4931/Allegro 的深度对比介绍

在电机驱动芯片领域,芯麦 GC4931P 和 A4931 都是备受关注的产品。它们在多种应用场景中发挥着关键作用,今天我们就来详细对比一下这两款芯片。 一、性能参数对比 (一)电流输出能力 A4931 具有一定的电流输出能力,但芯…

JVM(五、垃圾回收器)

经典的垃圾回收器大概有7种,这些收集器的目标、特性、原理、使用场景都有所区别,有的适用于年轻代,有的适用于老年代,图中展示的就是这7中垃圾回收器,如果两个垃圾回收器有连线,则表明可以配合使用。这个关…

27、js中声明变量

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title></title> </head> <body> </body> <script> // js中声明变量用var // 变量名…

迅为RK3588开发板Android系统开发笔记允许usb调试

首先开发板烧写 Android12 系统&#xff0c;连接屏幕&#xff0c;烧写线&#xff0c;串口线&#xff0c;电源线。连接完毕后&#xff0c;接 着我们打开 usb 调试。步骤如下&#xff1a; 1.在屏幕上打开设置 app,如下图所示&#xff1a; 2 滑到最底部&#xff0c;点击“关于平…

8086汇编语言教程(入门到实践)

这里写目录标题 1.基础概念1.1. 什么是汇编语言&#xff1f;1.2. 8086微处理器简介 2.快速入门3.寄存器3.1. 8086的寄存器分类3.2. 寄存器的典型使用示例 4. 简单语法4.1. 赋值、输入输出4.2. 算数运算符4.3. 比较运算符4.4. 转移运算符4.5.逻辑命令 5. 案例5.1. 输出从 A 到 …

Linux离线安装Docker命令,简单镜像操作

解压安装包 首先&#xff0c;使用 tar 命令解压 docker-27.3.1.tgz 安装包&#xff1a; tar -zxvf docker-27.3.1.tgz 将二进制文件移动到可执行路径上的目录 接着&#xff0c;将解压出来的 Docker 二进制文件复制到系统的可执行路径&#xff08;通常是 /usr/bin/&#xff09…