爬虫数据存储全攻略:从 Robots 协议到文件存储

爬虫在获取网页数据后,如何高效、合规地存储数据?这是爬虫开发的关键环节。本文将从爬虫的 "行为规范"(Robots 协议)讲起,详细介绍两种常用的文件存储方式(TXT、CSV),并附 Python 实战代码,帮你搞定数据存储的全流程。

一、爬虫的 "潜规则":Robots 协议

在爬取数据前,首先要遵守 Robots 协议(机器人协议),这是网站与爬虫之间的 "约定",避免因违规爬取引发法律风险或服务器负载问题。

  1. 什么是 Robots 协议?

    它是一个名为 robots.txt 的文本文件,放在网站根目录下,用于告诉爬虫:哪些页面可以爬,哪些不行。例如京东的 robots.txt 会限制某些路径的爬取(如 /pinpai/*.html)。

  2. 协议内容怎么看?

    核心规则由 User-agent(目标爬虫)、Disallow(禁止爬取的路径)、Allow(允许爬取的路径)组成。

    示例(某网站的 robots.txt):

    复制代码
    User-agent: *  # 对所有爬虫生效
    Disallow: /cgi-bin/  # 禁止爬取 /cgi-bin/ 目录
    Disallow: /tmp/      # 禁止爬取 /tmp/ 目录
    Allow: /public/      # 允许爬取 /public/ 目录
  3. 如何查看网站的 Robots 协议?

    直接在网站域名后加 /robots.txt,例如:

    • 百度:https://www.baidu.com/robots.txt
    • 京东:https://www.jd.com/robots.txt
  4. 必须遵守吗?

    协议本身不具备法律强制性,但违规可能面临法律风险(如侵犯数据产权)或被网站封禁 IP,建议遵守。

二、TXT 文件存储:简单直接的 "入门款"

TXT 是最基础的文件存储格式,适合存储结构化不强的文本数据(如网页源码、日志)。

  1. 优缺点分析

    • 优点:操作简单,兼容所有平台,适合快速保存数据;
    • 缺点:检索困难,不适合存储表格类数据(如多字段的列表)。
  2. Python 操作 TXT 文件

    用内置的 open() 函数即可实现读写,关键是掌握 文件打开模式

    模式 功能描述
    r 只读(文件不存在则报错)
    w 写入(覆盖原有内容,文件不存在则创建)
    a 追加(在文件末尾添加内容,文件不存在则创建)
    r+ 读写(文件不存在则报错)
    a+ 读写(追加模式)

    示例(爬取网页并保存为 TXT):

    复制代码
    import requests
    
    # 爬取网页内容
    url = "http://www.cqie.edu.cn/html/2/xydt/"
    response = requests.get(url)
    response.encoding = "utf-8"  # 解决中文乱码
    
    # 保存到 TXT
    with open("news.html", "w", encoding="utf-8") as f:
        f.write(response.text)  # 写入网页源码
  3. 技巧

    • 多字段数据可用 \t(制表符)分隔,便于后续解析;
    • 路径推荐用绝对路径(如 D:/data/news.txt),避免路径错误。
三、CSV 文件存储:表格数据的 "最佳拍档"

CSV(逗号分隔值)是存储结构化数据的理想格式,本质是纯文本,但以表格形式组织(类似 Excel),可被 Excel、Python 等工具直接解析。

  1. 优缺点分析

    • 优点:结构化清晰,支持多字段,可被 Excel 打开,适合存储列表类数据(如用户信息、商品列表);
    • 缺点:功能简单,不支持公式或单元格样式。
  2. Python 操作 CSV 文件

    用标准库 csv 或第三方库 pandas 实现,后者更简洁。

    • 方法一:用 csv

      示例(写入学生信息):

      复制代码
      import csv
      
      # 写入 CSV
      with open("students.csv", "w", encoding="utf-8", newline="") as f:
          writer = csv.writer(f)
          writer.writerow(["学号", "姓名", "年龄"])  # 标题行
          writer.writerow(["2023001", "张三", 20])
          writer.writerow(["2023002", "李四", 19])
    • 方法二:用 pandas

      适合处理大量数据,支持直接转为 DataFrame 操作:

      复制代码
      import pandas as pd
      
      # 数据字典
      data = {
          "学号": ["2023001", "2023002"],
          "姓名": ["张三", "李四"],
          "年龄": [20, 19]
      }
      # 转为 DataFrame 并保存
      df = pd.DataFrame(data)
      df.to_csv("students_pandas.csv", index=False)  # index=False 去除行索引
  3. 实战案例:爬取新闻列表并存储为 CSV

    步骤:

    1. 爬取网页源码;
    2. lxml 解析出新闻标题、链接;
    3. 写入 CSV 文件。

    核心代码:

    复制代码
    import requests
    from lxml import etree
    import csv
    
    url = "http://www.cqie.edu.cn/html/2/xydt/"
    response = requests.get(url)
    html = etree.HTML(response.text)
    
    # 解析新闻标题和链接
    titles = html.xpath("//a[@class='news-title']/text()")
    links = html.xpath("//a[@class='news-title']/@href")
    
    # 写入 CSV
    with open("news.csv", "w", encoding="utf-8", newline="") as f:
        writer = csv.writer(f)
        writer.writerow(["标题", "链接"])
        for title, link in zip(titles, links):
            writer.writerow([title, link])
四、如何选择存储方式?
  • 临时保存、非结构化数据(如网页源码)→ 选 TXT;
  • 结构化数据(多字段列表)、需要后续分析 → 选 CSV;
  • 大量数据或需要复杂查询 → 考虑数据库(如 MySQL、MongoDB)。
小结

数据存储是爬虫开发的 "收尾工作",既要遵守 Robots 协议确保合规,也要根据数据特点选择合适的存储格式。TXT 简单直接,CSV 适合表格数据,掌握这两种方式,足以应对大部分爬虫场景。下次我们将探讨数据库存储,带你处理更复杂的数据分析需求。