Python 爬虫数据存储:TXT 文本存储指南

1. 概述

TXT 文本是最基础的数据存储格式,具有以下特点:

  • 优点:简单易用、跨平台兼容性强、无需额外依赖
  • 缺点:不利于结构化检索、缺乏数据验证机制

适合场景:快速原型开发、临时数据存储、对数据结构要求不高的场景

2. 实战示例:电影数据存储

2.1 目标网站

使用示例电影网站 https://ssr1.scrape.center/ 爬取首页10部电影数据

2.2 现代实现方案

import requests
from bs4 import BeautifulSoup
from typing import List, Dict
import json

def scrape_movies() -> List[Dict]:
    """爬取电影数据"""
    url = "https://ssr1.scrape.center/"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    }
    
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, 'html.parser')
        
        movies = []
        for item in soup.select('.el-card'):
            name = item.select_one('h2').text.strip()
            categories = [c.text.strip() for c in item.select('.categories button')]
            published_at = item.select_one('.info:contains("上映")').text.split(':')[-1].strip()
            score = item.select_one('.score').text.strip()
            
            movies.append({
                'name': name,
                'categories': categories,
                'published_at': published_at,
                'score': score
            })
        return movies
    except Exception as e:
        print(f"爬取失败: {e}")
        return []

def save_to_txt(data: List[Dict], filename: str = 'movies.txt'):
    """将数据保存为TXT文件"""
    try:
        with open(filename, 'w', encoding='utf-8') as f:
            for movie in data:
                # 结构化输出
                f.write(f"电影名称: {movie['name']}\n")
                f.write(f"类型: {', '.join(movie['categories'])}\n")
                f.write(f"上映时间: {movie['published_at']}\n")
                f.write(f"评分: {movie['score']}\n")
                f.write("-" * 50 + "\n")
        print(f"数据已保存到 {filename}")
    except IOError as e:
        print(f"文件保存失败: {e}")

if __name__ == '__main__':
    movies_data = scrape_movies()
    if movies_data:
        save_to_txt(movies_data)

2.3 代码说明

  1. 现代特性

    • 使用类型注解 (-> List[Dict])
    • 使用更现代的 BeautifulSoup 替代 pyquery
    • 完善的错误处理机制
    • 使用 CSS 选择器提高可读性
  2. 改进点

    • 添加了 User-Agent 头
    • 设置了请求超时时间
    • 结构化输出更易读
    • 每个电影数据之间用分隔线区分

3. 文件操作详解

3.1 文件打开模式

模式描述适用场景
r只读读取现有文件内容
w写入创建新文件或覆盖现有文件
a追加在文件末尾添加内容
x独占创建仅当文件不存在时创建
b二进制模式处理非文本文件
+读写模式同时需要读写操作

最佳实践

  • 文本文件始终指定编码(推荐 utf-8
  • 使用 with 语句自动管理文件资源
  • 大文件考虑分块读写

3.2 高级写入技巧

# 1. 追加模式示例
with open('log.txt', 'a', encoding='utf-8') as f:
    f.write(f"[INFO] {datetime.now()}: New data added\n")

# 2. 批量写入提高性能
lines = [f"Line {i}\n" for i in range(1000)]
with open('bulk.txt', 'w', encoding='utf-8') as f:
    f.writelines(lines)

# 3. 格式化JSON存储
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(movies_data, f, ensure_ascii=False, indent=2)

4. 性能优化建议

  1. 缓冲区管理

    # 设置缓冲区大小(字节)
    with open('large.txt', 'w', buffering=8192) as f:
        pass
  2. 异步写入(Python 3.7+):

    import aiofiles
    
    async def async_write():
        async with aiofiles.open('async.txt', 'w') as f:
            await f.write("Async write example")
  3. 内存映射文件(处理超大文件):

    import mmap
    
    with open('large.txt', 'r+b') as f:
        mm = mmap.mmap(f.fileno(), 0)
        print(mm.read(100))  # 读取前100字节
        mm.close()

5. 安全注意事项

  1. 文件路径安全

    from pathlib import Path
    
    safe_path = Path('output') / 'data.txt'  # 自动处理路径分隔符
  2. 输入验证

    def sanitize_filename(filename: str) -> str:
        return "".join(c for c in filename if c.isalnum() or c in (' ', '-', '_'))
  3. 权限管理

    import os
    
    # 设置文件权限
    os.chmod('sensitive.txt', 0o600)  # 仅所有者可读写

6. 扩展应用

6.1 日志记录

import logging

logging.basicConfig(
    filename='app.log',
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

6.2 CSV存储(简单表格数据)

import csv

with open('movies.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.DictWriter(f, fieldnames=['name', 'categories', 'score'])
    writer.writeheader()
    writer.writerows(movies_data)

7. 总结

TXT 存储作为最简单的持久化方案,在爬虫开发中仍然有其价值:

  • 快速验证数据采集结果
  • 临时存储中间数据
  • 简单日志记录

下一步学习

  • 结构化数据存储(JSON/CSV)
  • 数据库存储(SQLite/MySQL)
  • 分布式存储方案