爬取数据存入SQLite:轻量级数据库实战指南

简介: 本文介绍如何用Python爬取豆瓣电影Top250并存储至SQLite数据库。对比多种数据存储方案,突出SQLite轻量、高效、零配置的优势。涵盖环境搭建、代码实现、数据查询与导出、性能优化及反爬应对策略,适合中小规模爬虫项目快速开发与数据管理。(238字)

​「编程类软件工具合集」
链接:https://pan.quark.cn/s/0b6102d9a66a

一、为什么选择SQLite存储爬虫数据?
当你在咖啡馆点单时,服务员不会用集装箱给你送咖啡——同理,处理中小规模爬虫数据时,SQLite这个"轻量级数据库"就是最合适的工具。它不需要单独的服务器进程,所有数据存储在单个文件中,却能提供完整的SQL功能支持。
探秘代理IP并发连接数限制的那点事 - 2025-11-10T155507.614.png

对比其他方案:

MySQL/PostgreSQL:需要安装服务端,配置用户权限,适合企业级应用
MongoDB:文档型数据库,查询效率不如关系型数据库
CSV/JSON文件:缺乏数据类型约束,查询效率低下
SQLite的优势在于:

零配置:下载即用,适合快速原型开发
跨平台:Windows/macOS/Linux全支持
事务支持:保证数据完整性
体积小巧:核心库仅300KB左右
二、环境搭建三步走

  1. 安装Python环境
    确保已安装Python 3.6+版本,通过命令行验证:

python --version

  1. 安装必要库
    使用pip安装爬虫和数据库相关库:

pip install requests beautifulsoup4 sqlite3 fake_useragent
requests:HTTP请求库
beautifulsoup4:HTML解析库
sqlite3:Python内置库,无需单独安装
fake_useragent:生成随机User-Agent

  1. 准备开发工具
    推荐使用VS Code或PyCharm,安装SQLite插件(如SQLite Explorer)方便可视化查看数据。

三、实战:爬取豆瓣电影Top250

  1. 分析目标网站
    打开豆瓣电影Top250页面

每页显示25部电影
URL格式:https://movie.douban.com/top250?start=0(0,25,50...)
每部电影包含:标题、评分、评价人数、引言

  1. 编写爬虫代码
    import requests
    from bs4 import BeautifulSoup
    import sqlite3
    from fake_useragent import UserAgent

def fetch_movie_page(url):
headers = {'User-Agent': UserAgent().random}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
return response.text
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None

def parse_movie_info(html):
soup = BeautifulSoup(html, 'html.parser')
movies = []

for item in soup.find_all('div', class_='item'):
    title = item.find('span', class_='title').text
    rating = item.find('span', class_='rating_num').text
    voters = item.find('div', class_='star').find_all('span')[-1].text[:-3]
    quote = item.find('span', class_='inq')
    quote = quote.text if quote else "无"

    movies.append((title, rating, voters, quote))

return movies

def save_to_sqlite(movies):
conn = sqlite3.connect('douban_top250.db')
cursor = conn.cursor()

# 创建表(如果不存在)
cursor.execute('''
CREATE TABLE IF NOT EXISTS movies (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title TEXT NOT NULL,
    rating REAL,
    voters INTEGER,
    quote TEXT
)
''')

# 插入数据
cursor.executemany('''
INSERT INTO movies (title, rating, voters, quote)
VALUES (?, ?, ?, ?)
''', movies)

conn.commit()
conn.close()
print("数据保存成功!")

def main():
base_url = "https://movie.douban.com/top250?start="
all_movies = []

for i in range(0, 250, 25):
    url = base_url + str(i)
    print(f"正在抓取第{i//25+1}页...")
    html = fetch_movie_page(url)
    if html:
        movies = parse_movie_info(html)
        all_movies.extend(movies)

save_to_sqlite(all_movies)

if name == "main":
main()

  1. 代码解析
    请求模块:
    使用fake_useragent生成随机User-Agent
    设置10秒超时防止长时间等待
    异常处理确保程序健壮性
    解析模块:
    通过CSS选择器定位数据
    处理可能缺失的引言字段
    返回结构化数据列表
    存储模块:
    自动创建数据库文件
    设计合理的数据表结构
    使用事务批量插入数据
    四、SQLite进阶技巧
  2. 数据查询示例
    def query_top_rated():
    conn = sqlite3.connect('douban_top250.db')
    cursor = conn.cursor()

    查询评分前10的电影

    cursor.execute('''
    SELECT title, rating, voters
    FROM movies
    ORDER BY rating DESC
    LIMIT 10
    ''')

    for row in cursor.fetchall():

     print(f"{row[0]:<30} 评分:{row[1]:<5} 评价人数:{row[2]:>8}")
    

    conn.close()

query_top_rated()

  1. 性能优化建议
    批量插入:使用executemany()替代循环插入
    索引优化:为常用查询字段创建索引
    CREATE INDEX idx_rating ON movies(rating);

连接池:高频访问时考虑使用连接池管理连接

  1. 数据导出方法
    将SQLite数据导出为CSV:

import pandas as pd

def export_to_csv():
conn = sqlite3.connect('douban_top250.db')
df = pd.read_sql_query("SELECT * FROM movies", conn)
df.to_csv('douban_movies.csv', index=False, encoding='utf_8_sig')
conn.close()
print("导出成功!")

export_to_csv()

五、常见问题Q&A
Q1:被网站封IP怎么办?
A:立即启用备用代理池,建议使用住宅代理(如站大爷IP代理),配合每请求更换IP策略。更稳妥的方式是:

设置请求间隔(如随机1-3秒)
使用代理IP轮换
降低并发请求数
模拟正常用户行为(滚动、点击等)
Q2:如何处理反爬机制?
A:常见反爬对策:

携带合法Cookies
设置Referer头
使用Selenium模拟浏览器
解析JavaScript渲染的页面
降低抓取频率
Q3:SQLite适合大规模数据吗?
A:SQLite官方建议单数据库不超过140TB,但实际建议:

小型项目(<10GB):完美选择 中型项目(10GB-100GB):可考虑,但需优化 大型项目(>100GB):建议迁移到MySQL/PostgreSQL
Q4:如何保证数据完整性?
A:使用事务机制:

try:
conn.execute("BEGIN TRANSACTION")

# 执行多个SQL操作
conn.commit()

except:
conn.rollback()

Q5:SQLite支持并发写入吗?
A:支持多进程读取,但写入是串行的。高并发场景建议:

使用WAL模式(Write-Ahead Logging)
PRAGMA journal_mode=WAL;

控制最大连接数
考虑升级数据库系统
六、总结与展望
通过这个实战项目,我们掌握了:

使用Python爬取结构化数据
将数据存储到SQLite数据库
基本的数据查询和导出操作
应对常见反爬策略
SQLite作为轻量级数据库,特别适合:

原型开发
移动应用开发
嵌入式系统
数据分析预处理
进阶方向建议:

学习SQL高级查询
尝试ORM框架(如SQLAlchemy)
研究数据库迁移策略
探索分布式爬虫架构
记住:爬虫开发要遵守robots.txt协议,合理设置抓取频率,尊重网站的数据产权。技术本身无善恶,关键在于如何使用。

目录
相关文章
|
5月前
|
SQL 运维 数据可视化
需求闭环追踪工具全方位解析:构建从需求到交付的完整追踪链路
在产品开发中,需求管理至关重要。本文探讨了需求闭环管理的核心问题与解决方案,涵盖需求追踪、变更同步、角色分工、反馈机制等内容,并提供实用工具与代码示例,助力团队实现高效协同与持续优化。
|
人工智能 API C++
【AI绘画大比拼】通义万相VS文心一格:探索十种风格下的绘画生成差异!
近日,通义大模型家族的新成员——通义万相已在人工智能大会上亮相。其中,通义万相的强大的“文生图”功能,不禁让我想到了去年八月由百度依托飞桨、文心大模型的技术创新推出的“AI作画”首款产品——文心一格。 那么,在类似的Prompt下,两款产品的表现将会如何呢?今天就让我们就十种风格下二者生成图像的表现力,来看看这两款产品的差异。
|
人工智能 JavaScript 程序员
Fitten Code:在VSCode插件市场备受欢迎的原因是什么?
随着AI技术的不断发展,AI在编写代码方面的能力也日益强大。充分利用AI的能力能够显著提高代码编写的效率和质量。今天我将向大家介绍一款备受瞩目的AI代码神器——Fitten Code,让我们一同揭开它神秘的面纱!
1016 3
|
存储 边缘计算 物联网
探索Edge Computing:边缘计算的崛起与实践
【10月更文挑战第3天】本文介绍了边缘计算的基本概念、工作原理、实施步骤以及面临的挑战。希望通过本文,读者能够了解边缘计算,并考虑在自己的项目中采用这种新的计算范式。
|
JavaScript Java Spring
springboot+vue 实现校园二手商城(毕业设计一)
这篇文章介绍了一个使用Spring Boot和Vue实现的校园二手商城系统的毕业设计,包括用户和商家的功能需求,如登录注册、订单管理、商品评价、联系客服等,以及项目依赖项的安装过程。
springboot+vue 实现校园二手商城(毕业设计一)
|
JSON 移动开发 监控
快递单号物流轨迹方案介绍——内附物流API对接指南
什么是物流轨迹,有什么用,今天来详细聊一聊
4571 2
快递单号物流轨迹方案介绍——内附物流API对接指南
|
网络协议 数据安全/隐私保护 网络架构

热门文章

最新文章