网络爬虫中的几种数据存储方式(中篇)

server/2024/10/25 7:26:53/

在上一篇文章中,带大家了解了文本的存储方式和json的存储方式,而这篇文章是要大家掌握其余的数据存储方式。

CSV存储文件存储

CSV,全称为 Comma-Separated Values,中文可以叫作逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。该文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分隔。每条记录由字段组成,字段间的分隔符是其他字符或字符串,最常见的是逗号或制表符。不过所有记录都有完全相同的字段序列,相当于一个结构化表的纯文本形式。它比 Excel 文件更加简洁,XLS 文本是电子表格,它包含了文本、数值、公式和格式等内容,而 CSV 中不包含这些内容,就是特定字符分隔的纯文本,结构简单清晰。所以,有时候用 CSV 来保存数据是比较方便的。现在,我们来讲解Python 读取和写入 CSV 文件的过程。

CSV的写入数据的方式主要有以下两种,分别是列表和字典。

列表数据的写入

在CSV中有两种文件的写入方式,分别是单行写入和多行写入,下面来看看代码示例:

单行写入

python">import csvcolumns = ['id', 'name', 'age']
data1 = ['1', '小明', '12']
data2 = ['2', '小红', '12']with open('data.csv', 'w', newline='', encoding='ANSI') as csvfile:# 将普通文本对象转换为csv文件对象writer = csv.writer(csvfile)writer.writerow(columns)writer.writerow(data1)writer.writerow(data2)

在这段代码中,创建了三个列表,第一个列表定义了表格数据的列名,另外两个列表定义了表格数据,另外保存CSV数据的时候,编码格式设置为了ANSI,主要是考虑到有些朋友的电脑可能会出现乱码,绝大多数windows系统的电脑若设置成utf-8遇到中文字符保存进CSV中均有可能会遇到乱码问题。

多行写入

多行写入其实道理非常的简单,无非就是将列表嵌套列表即可。

python">import csvcolumns = ['id', 'name', 'age']
data1 = ['1', '小明', '12']
data2 = ['2', '小红', '12']
datas = [['3', '小李', '15'], ['3', '小王', '20']]with open('data.csv', 'w', newline='', encoding='ANSI') as csvfile:# 将普通文本对象转换为csv文件对象writer = csv.writer(csvfile)writer.writerow(columns)writer.writerow(data1)writer.writerow(data2)writer.writerows(datas)

在上述示例代码中,

python">datas = [['3', '小李', '15'], ['3', '小王', '20']]

这里,我构建了一个列表,在列表中又嵌套了两个列表,那么可以通过方法writerows(),将嵌套的两个列表写入文件中。

注意,当你将上述代码运行后一定会生成一个data.csv文件,若你还需要将后续数据保存到该文件中,一定要先将data.csv关闭。否则,会出现如下错误:

PermissionError: [Errno 13] Permission denied: 'data.csv'

字典数据的写入

具体代码如下所示:

python">import csv# 定义字典的键
filenames = ['id', 'name', 'sex', 'age']
# 定义写入的数据
data1 = {'id': '1','name': '小李','sex': '男','age': 18
}
data2 = {'id': '2','name': '小王','sex': '女','age': 20
}
data3 = {'id': '3','name': '小张','sex': '男','age': 25
}with open('dict_data.csv', 'w', newline='') as csvfile:writer = csv.DictWriter(csvfile, fieldnames=filenames)# 写入列名writer.writeheader()writer.writerow(data1)writer.writerow(data2)writer.writerow(data3)
print('保存成功!')

实战案例

实战案例中涉及到的内容均以学习为目的,不参与任何的商业行为。若出现任何问题均与本作者无关

aHR0cDovL2NoYW5ncy5jY2dwLWh1bmFuLmdvdi5jbi9ncC9ub3RpY2VTZXJhY2guaHRtbD9hcnRpY2xlVHlwZT0yJmJhc2ljQXJlYT1nYW94aW4=

当你切换页面时,会发现网址并没有发生变化,因此可以判断出该页面是一个动态加载的页面,这是局部刷新的效果。

如上图所示,点击切换页面后,浏览器会监测到名为getNotice的数据包,通过这个数据包中的标头和载荷数据即可向目标网站发起请求。

具体代码

python">url = 'xxx'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36'}
data = {'page': 1,'limit': 10,'sidx': '','order': '','categoryId': '','articleType': 2,'projid': '','name': '','cgType': 0,'buyerNm': '','buyerOrgNm': '','supplyNm': '','basicType': '','basicDatetime': '2024-01-01','basicDatetimes': '2024-10-24','type': 0,'basicArea': 'gaoxin','categoryType': 0
}res = requests.post(url, headers=headers, data=data)
print(res.json())

运行得到的结果是一串Json格式的字符串,具体结果就不再展示,自行运行查看即可。

数据保存

仔这段运行的结果中,我需要提取,authorbasicDatetimebasicTitlebasicId,将这些数据保存到csv文件中。

具体代码

python">columns = ['author', 'basicDatetime', 'basicTitle', 'basicId']
with open('政府采购.csv', 'a', encoding='ANSI', newline='') as f:csv_writer = csv.DictWriter(f, fieldnames=columns)csv_writer.writeheader()for i in res.json()['list']['list']:item = {}item['author'] = i['author']item['basicDatetime'] = i['basicDatetime']item['basicTitle'] = i['basicTitle']item['basicId'] = i['basicId']csv_writer.writerow(item)
print('保存成功')

最后,仔当前文件夹下查看,便可以发现,出现了政府采购.csv文件。


http://www.ppmy.cn/server/134642.html

相关文章

解决后端给前端的返回数据过大的问题(压缩)

解决后端给前端的返回数据过大的问题(压缩) 问题 后端返回数据过大导致的前端接收数据慢的问题 方案 注解方式压缩后端给前端的返回数据,注解Gzip压缩后端返回数据(前端不用做任何处理) import com.fasterxml.jack…

基于ElementPlus的Form组件封装

前言 我们在项目开发过程中遇到最多就是表单页面的开发,那么使用频率比较高的就是Form组件,无论是vue亦或者是react,我们在项目中使用到UI库都会有Form组件。多数情况下都是用到了Form组件,我们先根据UI库或者其他类似的页面直接…

自动驾驶系列—图像数据在自动驾驶中的关键角色及其实际应用场景探讨

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

微信小程序美团点餐

引言:外卖已经成为了都市人的必备,在无数个来不及(懒得)做饭的时刻拯救孤单寂寞的胃。美团外卖无疑是外卖届的领头羊,它的很多功能与设计都值得我们学习。本文将从五个方面,对美团外卖展开产品分析&#xf…

Spring Boot + Vue项目开发学习笔记2

这个笔记是在看B站视频的时候做的,所以肯定是很多直接把课程的ppt的文字直接写下来了或者把老师口述的内容写下来,目的是为了让自己遗忘某些知识点的时候能直接看笔记,应该不至于构成侵权吧,如有不妥望告知,我会删除并…

动态规划之打家劫舍

大纲 题目思路第一步:确定下标含义第二步:确定递推公式第二步:dp数组如何初始化第三步:确定遍历顺序第四步:举例推导dp数组 总结 最近有人询问我 LeetCode 「打家劫舍」系列问题(英文版叫 House Robber&…

CentOS 8在Linux虚拟机修改IP地址,出现:错误:“ens160“ 不是活动的连接。错误:未提供活动连接。

问题:错误:"ens160" 不是活动的连接。错误:未提供活动连接。 1.查看网络服务运行状态: 1)CentOS 7执行命令:systemctl status network 2)CentOS 8执行命令:systemctl status NetworkManager&a…

医院信息化与智能化系统(7)

医院信息化与智能化系统(7) 这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图,可以试试PlantUML,告诉GPT你的文件结构,让他给你对应的…