📌 为什么要将爬虫数据存入 MySQL?

在实际项目中,爬取的数据需要:

  • 持久化保存(避免丢失)
  • 可查询、可统计
  • 与后续分析/展示系统结合

使用数据库(如 MySQL)可实现:
✅ 高效读写
✅ 数据结构清晰
✅ 支持数据清洗与分析


🧰 一、环境准备

1. 安装依赖库

pip install pymysql

2. 准备 MySQL 数据库

假设你已安装并启动 MySQL 服务,以下是示例建库建表语句:

CREATE DATABASE IF NOT EXISTS spider_data DEFAULT CHARSET utf8mb4;

USE spider_data;

CREATE TABLE articles (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255),
    author VARCHAR(100),
    content TEXT,
    publish_date DATETIME
);

🕸️ 二、爬取目标网页数据

下面以抓取某博客网站文章数据为例:

import requests
from bs4 import BeautifulSoup

def crawl_article(url):
    headers = {"User-Agent": "Mozilla/5.0"}
    res = requests.get(url, headers=headers)
    soup = BeautifulSoup(res.text, "html.parser")
    
    title = soup.find("h1").text.strip()
    author = soup.find("span", class_="author").text.strip()
    content = soup.find("div", class_="content").text.strip()
    date = soup.find("time")["datetime"]  # e.g., "2025-07-06T10:00:00"
    
    return {
        "title": title,
        "author": author,
        "content": content,
        "publish_date": date
    }

# 示例
data = crawl_article("https://example.com/blog/123")

🗃️ 三、将数据写入 MySQL

方式一:直接插入单条数据

import pymysql

def save_to_mysql(data):
    conn = pymysql.connect(
        host="localhost",
        user="root",
        password="your_password",
        database="spider_data",
        charset="utf8mb4"
    )
    cursor = conn.cursor()
    
    sql = """
    INSERT INTO articles (title, author, content, publish_date)
    VALUES (%s, %s, %s, %s)
    """
    cursor.execute(sql, (
        data["title"],
        data["author"],
        data["content"],
        data["publish_date"]
    ))

    conn.commit()
    cursor.close()
    conn.close()

方式二:批量插入(推荐)

当你抓取多条记录时,使用 executemany() 性能更好:

def save_many_to_mysql(data_list):
    conn = pymysql.connect(host="localhost", user="root", password="your_password",
                           database="spider_data", charset="utf8mb4")
    cursor = conn.cursor()
    
    sql = """
    INSERT INTO articles (title, author, content, publish_date)
    VALUES (%s, %s, %s, %s)
    """
    values = [
        (item["title"], item["author"], item["content"], item["publish_date"])
        for item in data_list
    ]
    
    cursor.executemany(sql, values)
    conn.commit()
    cursor.close()
    conn.close()

🧱 四、推荐封装方式:创建数据库管理类

为了让项目更可维护,建议封装为数据库操作类:

class MySQLClient:
    def __init__(self):
        self.conn = pymysql.connect(
            host="localhost",
            user="root",
            password="your_password",
            database="spider_data",
            charset="utf8mb4"
        )
        self.cursor = self.conn.cursor()

    def insert_article(self, data):
        sql = """
        INSERT INTO articles (title, author, content, publish_date)
        VALUES (%s, %s, %s, %s)
        """
        self.cursor.execute(sql, (
            data["title"],
            data["author"],
            data["content"],
            data["publish_date"]
        ))
        self.conn.commit()

    def close(self):
        self.cursor.close()
        self.conn.close()

✅ 五、常见问题与优化建议

问题说明解决方案
中文乱码编码未设置 utf8mb4建库和连接都使用 utf8mb4
数据重复多次插入相同数据设置唯一索引或加逻辑判断
性能慢大量单条插入使用批量插入 executemany()
数据不完整网页数据缺失做好 try-except 捕获和字段判断

💡 实战小贴士

  • 使用 SQLAlchemy ORM 可进一步解耦数据操作(推荐大型项目)
  • 将爬虫数据写入 Redis/MongoDB 作缓冲,然后批量导入 MySQL(提升效率)
  • 结合 Pandas 实现数据预处理后导入数据库更灵活

🧪 示例整合代码(完整流程)

if __name__ == "__main__":
    urls = [
        "https://example.com/blog/1",
        "https://example.com/blog/2",
        # ...
    ]
    
    mysql_client = MySQLClient()
    
    for url in urls:
        try:
            data = crawl_article(url)
            mysql_client.insert_article(data)
            print(f"已写入:{data['title']}")
        except Exception as e:
            print(f"抓取或写入失败:{url} - {e}")
    
    mysql_client.close()

✅ 总结

本篇文章你学会了:

✅ 如何连接并操作 MySQL
✅ 如何将单条和多条数据写入数据库
✅ 如何使用 requests + BeautifulSoup + pymysql 构建完整数据抓取流程
✅ 如何封装高可维护的数据库操作逻辑

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐