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

【0基础学爬虫】爬虫基础之文件存储

0

大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫,本期为文件存储。

概述

前几期文章中我们已经了解到了请求库、解析库的使用,已经学会了如何向目标网站发送请求以及解析响应信息,那么我们还需要知道如何将数据进行存储。数据存储有很多方式,本期会介绍如何将数据存入文本文件,如 TXT、JSON、CSV 等。

TXT 文件存储

介绍

TXT文件存储是最基本的数据存储方式,TXT 文本文件基本上兼容任何平台,因此它的应用也非常广泛。使用代码操作 TXT 文件十分简单,但是缺点也非常明显,不利于对数据进行检索。

使用

Python 中操作 TXT 文件需要使用到内置的 open() 函数。

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

open() 函数有七个参数分别为:

file:文件路径

mode:打开方式,默认为(r)只读模式

buffering:文件缓冲

encoding:字符编码

errors:报错级别

newline:换行模式,默认以\n换行

closefd:控制在关闭文件时是否彻底关闭文件

文件打开方式分为以下几种:

r:以只读方式打开文件

w:以写入方式打开文件。如果文件存在则覆盖原文件,不存在则新建。

x:创建新文件并以写入方式打开文件

a:以追加方式打开文件。如果文件存在,则在结尾位置写入,不存在则新建。

b:二进制模式

t:文本模式

+:读取与写入

wb:以二进制写入方式打开文件。如果文件存在则覆盖原文件,不存在则新建。

w+:以读写方式打开文件。如果文件存在则覆盖原文件,不存在则新建。

wb+:以二进制读写方式打开文件。如果文件存在则覆盖原文件,不存在则新建。

ab:以二进制追加方式打开文件。如果文件存在,则在结尾位置写入,不存在则新建。

ab+:以二进制追加读写方式打开文件。如果文件存在,则在结尾位置写入,不存在则新建。

f = open('data.txt','r',encoding="utf-8")
f.seek(2) #从指定下标位置开始读取
data = f.read()
f.close()
f = open('data.txt','w',encoding="utf-8")
f.write('hello')
f.write(' ')
f.write('world')
f.close()
#hello world

上下文管理器

上文中可以看到,对一个文件进行读写操作后需要使用 close() 方法关闭文件。如果不使用 close() 关闭文件会导致资源泄露问题。为了避免这个问题和优化代码,我们可以使用上下文管理器来操作文件。

with open('data.txt','w',encoding='uutf-8')as f:f.write('hello')f.write(' ')f.write('world')

当 with 语句块结束后文件会自动关闭,这样不需要再调用 close() 方法。

JSON 文件存储

介绍

JSON 全称为 JavaScript Object Notation,也就是 JavaScript 对象标记,是一种轻量级的数据交换格式。人们可以很容易的对 JSON 格式的数据进行阅读和编写,同时也方便了机器进行解析和生成。JSON 采用完全独立于程序语言的文本格式,但是也使用了类 C 语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使 JSON 成为理想的数据交换语言。

JSON 通过对象和数组的组合来表示数据,而在 JavaScript 中,一切皆为对象,因此任何数据类型都可以通过 JSON 来表示。

在 JavaScript 中 JSON 通常以对象或数组的形式存在。对象形式为被花括号包裹的键值对结构,如 { key1 : value1, key2 : value2 },key表示对象的属性,value表示对象的值。数组形式与对象形式的区别就在于它是被方括号所包裹,如[{ key1 : value1}, {key2 : value2}]。对象形式与数组形式可以自由组合,任意嵌套。JSON中字符串类型的数据需要以双引号包围。

JSON 的这种结构非常简洁清晰,且结构化程度很高,因而被广泛使用。

使用

JSON 是一个数据格式,本质上是纯字符串类型,在 Python 中它可以被转换为对应的数据类型,如对象形式可以被转换为字典,数组类型可以转换为列表。Python 中内置了一个强大的 JSON 库,通过它可以简便的实现 JSON 文件的读写操作。

JSON 库提高了四个方法:

json.dump():将 JSON 对象写入文件

json.dumps():将Python对象编码成 JSON 字符串

json.load():从 JSON 文件中读取数据

json.loads():将已编码的 JSON 字符串解码为Python对象

下面我们以这段数据作为示例:

{"1001": {"name": "张三","age": 21,"gender": "female"},"1002": {"name": "李四","age": 22,"gender": "male"}
}

读取数据

data.json 文件内容为示例 JSON 数据。

with open('data.json','r',encoding='utf-8')as f:data = f.read()print(type(data))
#输出:<class 'str'>

可以看到,我们直接从 JSON 文件里面读取的数据是字符串类型,这不利于我们对它进行操作,我们可以使用 json.loads() 方法将 JSON 字符串转换为字典类型。

import jsonwith open('data.json','r',encoding='utf-8')as f:data = f.read()print(type(data))
data = json.loads(data)
print(type(data))
#输出:
#<class 'str'>
#<class 'dict'>

我们也可以使用更加简洁的写法,通过 json.load() ,直接对文件操作对象进行解析。

import jsondata = json.load(open('data.json',encoding='utf-8'))print(type(data))
#输出:<class 'dict'>

写入数据

使用 write() 方法写入文件时,它只能传入字符串类型的数据。因此我们需要将字典数据先转换为 JSON 字符串,可以通过 json.dumps() 方法实现。

import jsondata = {"1001": {"name": "张三","age": 21,"gender": "female"},"1002": {"name": "李四","age": 22,"gender": "male"}
}print(data)
data = json.dumps(data)
print(type(data))
with open('data.json','w',encoding="utf-8")as f:f.write(data)
#输出:
#<class 'dict'>
#<class 'str'>

当然,将数据写入文件也有更加简便的方法。

import jsondata = {"1001": {"name": "张三","age": 21,"gender": "female"},"1002": {"name": "李四","age": 22,"gender": "male"}
}json.dump(data,open('data.json','w',encoding='utf-8'),indent=2,ensure_ascii=False)

CSV 文件存储

介绍

CSV 全称 Comma-Sparated Values(逗号分隔值),它以纯文本形式存储数据表格。CSV 文件是一个字符序列,它由任意数目的记录组成,记录之间以某种换行符分隔。文件的每条记录由字段和字段值组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。CSV 并不是一种单一的、明确定义的文本格式,它泛指具备以下特征的任何文件:

  1. 纯文本呢,使用某个字符集

  2. 由记录组成

  3. 每条记录被分隔符分隔为字段

  4. 每条记录都有相同的字段序列

使用

Python 中提供了一个内置的 csv 库来对 CSV 文件进行操作。

写入

import csv#writerow默认换行,因此需要通过 newline 将换行符设置为空,避免重复换行
with open('data.csv','w',encoding='utf-8',newline="") as csvfile:#delimiter:指定分隔符,默认为逗号writer = csv.writer(csvfile,delimiter = " ")#写入一行writer.writerow(['id', 'name', 'age'])writer.writerow(['1001', 'jack', 15])writer.writerow(['1002', 'marin', 22])writer.writerow(['1003', 'alex', 19])#写入多行writer.writerows([['1004', 'lucy', 23],['1005', 'john', 30]])

csv库也提供了其它的写入方法

import csvwith open('data.csv','w',encoding='utf-8',newline="") as csvfile:#字典写入对象writer = csv.DictWriter(csvfile,fieldnames=['id','name','age'])writer.writeheader()writer.writerow({'id':'1001','name':'jack','age':21})writer.writerow({'id': '1002', 'name': 'marin', 'age': 22})writer.writerows([{'id': '1003', 'name': 'lucy', 'age': 23},{'id': '1004', 'name': 'mike', 'age': 22}])

读取

import csvwith open('data.csv','r',encoding='utf-8')as csvfile:reader = csv.reader(csvfile)for row in reader:print(row)

总结

上文中讲到了 TXT、JSON、CSV 三种文件的存储方式,介绍了如何对这些文件进行读写操作。文本文件存储的优势在于简单、方便,适合存储少量信息,但想要规范的储存数据的话并不推荐使用文本文件储存。

相关文章:

【0基础学爬虫】爬虫基础之文件存储

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…...

airflow源码分析-任务调度器实现分析

Airflow源码分析-任务调度器实现分析 概述 本文介绍Airflow执行器的总体实现流程。通过函数调用的方式说明了Airflow scheduler的实现原理&#xff0c;对整个调度过程的源码进行了分析。 通过本文&#xff0c;可以基本把握住Airflow的调度器的运行原理主线。 启动调度器 可…...

一文学会数组的reduce()和reduceRight()

reduce()方法和reduceRight()方法依次处理数组的每个成员&#xff0c;最终累计为一个值。 它们的差别是&#xff0c;reduce()是从左到右处理&#xff0c;reduceRight()则是从右到左&#xff0c;其他完全一样。 [1, 2, 3, 4, 5].reduce(function (a, b) {console.log(a, b);ret…...

登录校验-Filter

上一篇介绍完了基础应用和细节&#xff0c;现在来完成登录校验功能基本流程&#xff1a; 要进入后台管理系统&#xff0c;必须完成登录操作&#xff0c;此时就需要访问登录接口Login。登录成功服务端会生成一个JWT令牌&#xff0c;并且返回给前端&#xff0c;前端会将JWT令牌存…...

C C++ Java python 分别写出不同表白girlfriend的爱心动态代码实现

C `` #include <stdio.h> #include <stdlib.h> #include <windows.h> void heart_animation() {int i, j, k; for (i = 1; i <= 6; i++) {for (j = -3; j <= 3; j++) {for (k = -4; k <= 4; k++) {if (abs(j) + abs(k) < i * 2) {printf(“I”)…...

ThreeJS-投影、投影模糊(十七)

无投影&#xff1a; 完整的代码&#xff1a; <template> <div id"three_div"></div> </template> <script> import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/Or…...

蓝桥杯赛前冲刺-枚举暴力和排序专题1(包含历年蓝桥杯真题和AC代码)

目录 连号区间数&#xff08;第四届蓝桥杯省赛CB组,第四届蓝桥杯省赛JAVAB组&#xff09; 递增三元组&#xff08;第九届蓝桥杯省赛CB组,第九届蓝桥杯省赛JAVAB组&#xff09; 特别数的和&#xff08;第十届蓝桥杯省赛CB组,第十届蓝桥杯省赛JAVAB组&#xff09; 错误票据&a…...

Github库中的Languages显示与修改

目录 前言 【.gitattributes】文件 修改GitHub语言 前言 上传一个项目到GitHub时&#xff0c;发现显示的语言并非是自己项目所示的语言&#xff0c;这样的情况是经常发生的&#xff0c;为了能到达自己所需快速检索&#xff0c;或者是外部访问者能很好的搜索我们的项目&#…...

RocketMQ消息高可靠详解

文章目录 消息同步策略殊途同归同步基于offset而不是消息本身刷盘策略RocketMQ broker服务端以组为单位提供服务的,拥有着一样的brokerName则认为是一个组。其中brokerId=0的就是master,大于0的则为slave。 消息同步策略 master和slave都可以提供读服务,但是只有master允许…...

【python设计模式】4、建造者模式

哲学思想&#xff1a; 建造者模式的哲学思想是将复杂对象的创建过程分解成多个简单的步骤&#xff0c;并将这些步骤分别封装在一个独立的建造者类中。然后&#xff0c;我们可以使用一个指挥者类来控制建造者的调用顺序&#xff0c;以便在每个步骤完成后正确地构建复杂对象。 …...

【全网独家】华为OD机试Golang解题 - 机智的外卖员

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 如果想要在华为od机试中获取高分…...

Sentinel滑动时间窗限流算法原理及源码解析(中)

文章目录 MetricBucketMetricEvent数据统计的维度WindowWrap样本窗口实例 范型T为MetricBucket windowLengthInMs 样本窗口长度 windowStart 样本窗口的起始时间戳 value 当前样本窗口的统计数据 其类型为MetricBucket MetricBucket MetricEvent数据统计的维度 1、首先计算27t位…...

【OpenLayers】VUE+OpenLayers+ElementUI加载WMS地图服务

【OpenLayers】VUEOpenLayersElementUI加载WMS地图服务准备工作安装vue创建vue项目安装OpenLayers安装ElementUI加载wms地图服务准备工作 需要安装好nodejs&#xff0c;nodejs下载地址&#xff0c;下载对应的版本向导式安装即可。 安装完成后&#xff0c;控制台输入node -v&a…...

linux 命名管道 mkfifo

专栏内容&#xff1a;linux下并发编程个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e;目录 前言 概述 原理介绍 接口说明 代码演示 结尾 前言 本专栏主要分享linux下并发编程…...

Redis(主从复制、哨兵模式、集群)概述及部署

目录 1.redis高可用 2.redis持久化 1.Redis 提供两种方式进行持久化&#xff1a; 2.RDB 持久化 3.AOF持久化 4.RDB和AOF的优缺点 5.Redis 性能管理 3.redis主从复制 1.Redis主从复制的概念 2.Redis主从复制的作用 3.Redis主从复制的搭建 4.redis哨兵模式 1.哨兵模式…...

windows下软件包安装工具之Scoop安装与使用

Scoop介绍 Scoop是Windows的命令行程序安装器。 Scoop从命令行安装程序&#xff0c;及其容易。它有如下特点&#xff1a; 消除权限弹出窗口隐藏 GUI 向导样式的安装程序防止安装大量程序的 PATH 污染避免安装和卸载程序的意外副作用自动查找并安装依赖项自行执行所有额外的设…...

九龙证券|人工智能+国产软件+智慧城市概念股火了,欧洲资管巨头大举抄底

近一周组织调研个股数量有130多只&#xff0c;迈瑞医疗成为调研组织数量最多的股票。 证券时报数据宝统计&#xff0c;近一周组织调研公司数量有130多家。从调研组织类型来看&#xff0c;证券公司调研相对最广泛&#xff0c;调研80多家公司。 迈瑞医疗获超500家组织调研 迈瑞…...

Nacos下载安装与配置(windows)

一、Nacos下载 官网地址&#xff1a;home (nacos.io) 点击前往Github&#xff0c;跳转至Github下载页面。 点击Tags&#xff0c;跳转至版本选择页面&#xff0c;此处选择2.2.0版本。 点击nacos-server-2.2.0.zip&#xff0c;进行下载。 二、Nacos安装 将下载的压缩包解压至需…...

QT学习笔记(语音识别项目 )

语音识别项目 我们知道 AI 智能音箱已经在我们生活中不少见&#xff0c;也许我们都玩过&#xff0c;智能化非常高&#xff0c;功能 强大&#xff0c;与我们平常玩的那种蓝牙音箱&#xff0c;Wifi 音箱有很大的区别&#xff0c;AI 智能在哪里呢&#xff1f;语音识别技 术和云端…...

Vulnhub:DC-4靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.251 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --scripthttp-enum 192.168.111.251 访问目标网站发现需要登录 使用账号admin爆破出密码&#xff1a;happy 登陆后抓包执行反弹shell 提权 在/home/jim/backu…...

序列差分练习题--从模板到灵活运用

本篇包含6道序列差分练习题及题解&#xff0c;难度由模板到提高 语文成绩 题目背景 语文考试结束了&#xff0c;成绩还是一如既往地有问题。 题目描述 语文老师总是写错成绩&#xff0c;所以当她修改成绩的时候&#xff0c;总是累得不行。她总是要一遍遍地给某些同学增加分…...

Xshell 连接 Ubuntu 20.04

1 更改网络配置信息 修改/etc/netplan/01-network-manager-all.yaml文件信息 sudo gedit /etc/netplan/01-network-manager-all.yaml删除原有内容&#xff0c;替换为以下信息&#xff1a; 注意&#xff1a;addresses、gateway4 要根据个人虚拟机的实际情况修改 # Let Networ…...

【网口交换机:交换机KSZ9897学习-笔记-资料汇总-记录】

【网口交换机&#xff1a;交换机KSZ9897学习-笔记-资料汇总-记录】1、概述2、 自己的学习与摸索之路第一阶段&#xff1a;随意在网上查找相关资料第二阶段&#xff1a;针对性在网上资料第三阶段&#xff1a;测试并且使用开发板第四阶段&#xff1a;针对性使用工具进行测试。2、…...

linux信号量及其实例

概述 Linux信号量是用于进程间同步和互斥的一种通信机制。本质是计数器 它们通常用于控制对共享资源的访问&#xff0c;以确保只有一个进程可以同时访问该资源。以下是一个详细的教程和C语言代码示例&#xff0c;展示如何使用信号量进行进程间通信。 创建信号量 要使用信号量…...

Nomogram | 盘点一下绘制列线图的几个R包!~(一)

1写在前面 列线图&#xff0c;又称诺莫图&#xff08;Nomogram&#xff09;&#xff0c;是一种用于预测模型的可视化工具&#xff0c;它可以将多个影响因素和结局事件的关系展示在同一平面上。&#x1f973; 列线图最早是由法国工程师Philbert Maurice dOcagne于1884年发明的&a…...

两个数组的交集(力扣刷题)

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/intersection-of-two-arrays 说…...

SonarQube 10.0 (macOS, Linux, Windows) - 清洁代码 (Clean Code)

请访问原文链接&#xff1a;https://sysin.org/blog/sonarqube-10/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Sonar Clean Code Industry leading solutions IDE | SonarLint Free IDE extension that provides on-the-f…...

怎么统一把文件名不需要部分批量替换掉

同事把文件传给我&#xff0c;我接在电脑上看发现文件名都是乱的&#xff0c;前面都加了一串挺长的数字&#xff0c;总之看起来很乱&#xff0c;顺序也跟着乱了&#xff0c;如何把红色框内部分删除掉呢&#xff1f; 上图就是我收到同事发我文件呢&#xff0c;你说要什么修改呢&…...

Vue3电商项目实战-结算支付 3【05-结算-收货地址-添加、06-结算-收货地址-修改、07-结算-提交订单】

文章目录05-结算-收货地址-添加06-结算-收货地址-修改07-结算-提交订单05-结算-收货地址-添加 目的&#xff1a;实现收货地址的添加。 大致步骤&#xff1a; 独立组件&#xff0c;准备一个对话框完成表单布局完成确认添加操作 落的代码&#xff1a; 1.独立组件&#xff0c;准…...

开心档之开发入门网-C++ 变量作用域

C 变量作用域 目录 C 变量作用域 局部变量 实例 全局变量 实例 实例 初始化局部变量和全局变量 作用域是程序的一个区域&#xff0c;一般来说有三个地方可以定义变量&#xff1a; 在函数或一个代码块内部声明的变量&#xff0c;称为局部变量。 在函数参数的定义中声明…...