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

爬虫数据存储全攻略:从 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 csvurl = "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 适合表格数据,掌握这两种方式,足以应对大部分爬虫场景。下次我们将探讨数据库存储,带你处理更复杂的数据分析需求。

http://www.lryc.cn/news/620762.html

相关文章:

  • 【深度学习新浪潮】VGGT待提升点分析及解决方案的思考
  • 基于大语言模型的爬虫数据清洗与结构化
  • pdf文件流或者本地文件读取
  • 掌握MATLAB三维可视化:从基础到实战技巧
  • OpenCV Canny 边缘检测
  • 【js】让项目支持倾听和朗读AI技术
  • OpenCV图像平滑处理方法详解
  • tp5集成elasticsearch笔记
  • 开疆智能Ethernet转ModbusTCP网关连接UR机器人配置案例
  • ComfyUI工作流不动了?
  • OpenCV 形态学操作
  • Spring AI PagePdfDocumentReader 全解析:基于 Apache PdfBox 的按页 PDF 读取实战
  • COLMAP进行密集重建,三维重建的步骤
  • [机器学习]08-基于逻辑回归模型的鸢尾花数据集分类
  • AUTOSAR汽车电子嵌入式编程精讲300篇-【自动驾驶】硬件在环(HIL)(二)
  • 第四天~在CANFD或CAN2.0的ARXML文件中实现Multiplexor多路复用信号实战
  • 依托AR远程协助,沟通协作,高效流畅
  • 读From GPT-2 to gpt-oss: Analyzing the Architectural Advances
  • 第四天-创建一个Classic CAN(经典CAN2.0)/CANFD的系统描述ARXML文件
  • IDEA、Pycharm、DataGrip等激活破解冲突问题解决方案之一
  • 学习设计模式《二十二》——职责链模式
  • 深入了解linux系统—— 线程概念
  • 深入解析 Spring IOC 容器在 Web 环境中的启动机制
  • 嵌入式学习Day27
  • stm32项目(29)——基于stm32的智能眼镜设计
  • 【代码随想录day 20】 力扣 108.将有序数组转换为二叉搜索树
  • SwiftUI 页面弹窗操作
  • Linux网络编程:应用层自定义协议与序列化
  • Flutter sqflite插件
  • 支付域——账户系统设计