当前位置: 首页 > news >正文

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

目录

一、为什么选择SQLite存储爬虫数据?

二、环境搭建三步走

1. 安装Python环境

2. 安装必要库

3. 准备开发工具

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

1. 分析目标网站

2. 编写爬虫代码

3. 代码解析

四、SQLite进阶技巧

1. 数据查询示例

2. 性能优化建议

3. 数据导出方法

五、常见问题Q&A

六、总结与展望


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

一、为什么选择SQLite存储爬虫数据?

当你在咖啡馆点单时,服务员不会用集装箱给你送咖啡——同理,处理中小规模爬虫数据时,SQLite这个"轻量级数据库"就是最合适的工具。它不需要单独的服务器进程,所有数据存储在单个文件中,却能提供完整的SQL功能支持。

对比其他方案:

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

SQLite的优势在于:

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

二、环境搭建三步走

1. 安装Python环境

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

python --version

2. 安装必要库

使用pip安装爬虫和数据库相关库:

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

3. 准备开发工具

推荐使用VS Code或PyCharm,安装SQLite插件(如SQLite Explorer)方便可视化查看数据。

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

1. 分析目标网站

打开豆瓣电影Top250页面 

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

2. 编写爬虫代码

import requests
from bs4 import BeautifulSoup
import sqlite3
from fake_useragent import UserAgentdef fetch_movie_page(url):headers = {'User-Agent': UserAgent().random}try:response = requests.get(url, headers=headers, timeout=10)response.raise_for_status()return response.textexcept requests.exceptions.RequestException as e:print(f"请求失败: {e}")return Nonedef 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').textrating = item.find('span', class_='rating_num').textvoters = 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 moviesdef 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()

3. 代码解析

  1. 请求模块
    • 使用fake_useragent生成随机User-Agent
    • 设置10秒超时防止长时间等待
    • 异常处理确保程序健壮性
  2. 解析模块
    • 通过CSS选择器定位数据
    • 处理可能缺失的引言字段
    • 返回结构化数据列表
  3. 存储模块
    • 自动创建数据库文件
    • 设计合理的数据表结构
    • 使用事务批量插入数据

四、SQLite进阶技巧

1. 数据查询示例

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()

2. 性能优化建议

  • 批量插入:使用executemany()替代循环插入
  • 索引优化:为常用查询字段创建索引
    CREATE INDEX idx_rating ON movies(rating);
  • 连接池:高频访问时考虑使用连接池管理连接

3. 数据导出方法

将SQLite数据导出为CSV:

import pandas as pddef 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. 设置请求间隔(如随机1-3秒)
  2. 使用代理IP轮换
  3. 降低并发请求数
  4. 模拟正常用户行为(滚动、点击等)

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;
  • 控制最大连接数
  • 考虑升级数据库系统

六、总结与展望

通过这个实战项目,我们掌握了:

  1. 使用Python爬取结构化数据
  2. 将数据存储到SQLite数据库
  3. 基本的数据查询和导出操作
  4. 应对常见反爬策略

SQLite作为轻量级数据库,特别适合:

  • 原型开发
  • 移动应用开发
  • 嵌入式系统
  • 数据分析预处理

进阶方向建议:

  • 学习SQL高级查询
  • 尝试ORM框架(如SQLAlchemy)
  • 研究数据库迁移策略
  • 探索分布式爬虫架构

记住:爬虫开发要遵守robots.txt协议,合理设置抓取频率,尊重网站的数据产权。技术本身无善恶,关键在于如何使用。

http://www.dtcms.com/a/594323.html

相关文章:

  • 找个会做网站的 一起做网站互联网开发技术
  • 如何利用R语言 进行生物多样性测定、生物量模型构建、生物完整性指数(IBI)筛选与生态环境状况综合指数(EI)计算
  • 前端开发做网站吗wordpress禁止加载头部
  • 建设网站的基础知识六年级做的网站的软件下载
  • SQL中的NULL陷阱:为何=永远查不到空值
  • 厦门市网站建设软件开发公司营销网站seo推广
  • JDBC模板技术
  • 万网网站后台登陆做网站哪个部分
  • 11月10日学习总结--numpy的基本操作
  • 快速搭建一个 GitHub 开源项目导航网站,提供便捷的信息抓取、智能摘要、分类管理功能
  • 网站数据表怎么做网络推广引流方式
  • 【Rocky基础】——用户管理
  • 免费下载建筑图纸的网站wordpress子分页
  • 数据结构简明教程(李春葆版)课后习题答案
  • 做app网站公司名称如何网络推广新产品
  • CSGHub v1.12.0开源版本更新
  • 上海网站建设报价自建网站怎么做推广
  • Vue Router (编程式导航)
  • 特斯拉 Tesla 面试经验分享|流程全解析 + 技术细节 + 面试感受
  • .net网站开发面试网站平台定制开发
  • 网站制作公司咨询工作内容个人做网站可以盈利么
  • 【Unity】MMORPG游戏开发(十)断线恢复
  • 深圳app开发公司哪家服务好网站建设丶seo优化
  • C#/.NET/.NET Core技术前沿周刊 | 第 期(年.-.)
  • 手机网站标准自助建站系统哪个好用
  • 科技赋能文博传播 众趣科技引领数字博物馆虚拟展厅新生态
  • 科技驱动服务升级 榕树钱小乐的创新发展之路
  • 如何系统提升英文科技文献阅读能力:方法、工具与 30 天训练计划
  • 网站开发费用摊销时间深圳 网站公司
  • 网站建设案例方案做ppt卖给网站