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

本文的内容是介绍网络爬虫中的数据存储方式。大家都知道爬虫的最重要功能就是从网络中将数据提取出来。现在问题来了,那么提取出来的数据该何去何从,如果仅仅只是保存在内存当中,当程序结束后岂不是所有的内容都消失了?因此需要将数据保存在计算机本地硬盘中。常见的存储方式如下:

  • 文本存储
  • json格式存储
  • 表格存储
  • MySQL存储
  • mongoDB存储
  • redis存储

以上存储方式均会在本次文章中为大家进行详细的讲解,后面大家如果往爬虫方向就业的话也是必须要掌握的知识点。

文本文档存储

文件打开模式

python中所有open()打开一个文件,文件的打开有很多模式:

  • r:以只读方式打开文件,文件的指针将会放在文件的开头,这是默认模式。
  • rb:以二进制只读方式打开一个文件,文件指针将会放在文件的开头。
  • r+:以读写方式打开一个文件,文件指针将会放在文件的开头。
  • rb+: 以二进制读写方式打开一个文件,文件指针将会放在文件的开头。
  • w:以写入方式打开一个文件。如果该文件已存在,则将其瞿盖;如果该文件不存在,则创建新文件。
  • wb:以二进制写入方式打开一个文件。如果该文件已存在,则将其覆盖;如果该文件不存在,则创建新文件。
  • w+:以读写方式打开一个文件。如果该文件已存在,则将其覆盖;如果该文件不存在,则创建新文件。
  • wb+:以二进制读写格式打开一个文件。如果该文件已存在,则将其覆盖;如果该文件不存在, 则创建新文件。
  • a:以追加方式打开一个文件。如果该文件已存在,文件指针将会放在文件结尾。也就是说,新的内容将会被写入到已有内容之后;如果该文件不存在, 则创建新文件来写入。
  • ab:以二进制追加方式打开一个文件。如果该文件已存在,则文件指针将会放在文件结尾。也就是说,新的内容将会被写入到己有内容之后;如果该文件不存在,则创建新文件来写入。
  • a+:以读写方式打开一个文件。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式;如果眩文件不存在,则创建新文件来读写。
  • ab+:以二进制追加方式打开一个文件。如果该文件已存在,则文件指针将会放在文件结尾;如果该文件不存在,则创建新文件用于读写。

实战知乎热点问题

目标网址:

import requests
from bs4 import BeautifulSoup

url = 'https://www.zhihu.com/explore'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
    'Referer': 'https://www.zhihu.com/'
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'lxml')
title_list = soup.select('div .css-1g4zjtl')

for div in title_list:
    title = div.select('a')[0].get_text()
    print(title)

运行结果如下:

如何评价京东请杨笠宣传?
多家品牌官微撤掉易建联相关内容,东莞政协回应「具体情况需等通报」,此次风波会对其商业价值造成哪些影响?
韩国有胆子对朝鲜首都发起第二次传单攻势吗?
楼市政策「组合拳」来了,住建部出台五项政策支持货币化安置房,允许地方发行专项债,将如何影响楼市?
如何评价电影《三体》将由张艺谋执导?
美国担心中国月球探测器「玉兔」轧了阿姆斯特朗的脚印,会出现这种情况吗?如何保护人类在月球上的历史遗迹?
梅西美洲杯决赛伤退,替补席捂脸持续痛哭 3 分钟,他本届比赛表现如何?如何评价他现在的实力?
如何评价外网玩家对绝区零的这句话?

打开目标网址就会发现,抓取的内容与图片的内容完全一致。但是你使用我这边的代码的时候就不一定能说抓取的内容是一样了,因为这个是小时榜。

在上面的代码中只是将热搜数据打印了出来,没有保存到本地,我们该怎么样修改代码呢?

当然,非常的简答,使用open()函数即可实现。

代码修改如下:

for div in title_list:
    title = div.select('a')[0].get_text()
    with open('hot.txt', 'a', encoding='utf-8') as f:
        print(title)
        f.write(title + '\n')

如上代码所示,仅仅需要将循环输出标题的代码进行修改即可。注意:将数据存储到文本文档的时候,写入的模式必须是a,意思是不停的往后添加内容。

json数据存储

JSON,全称为 JavaScript Object Notation, 也就是 JavaScript 对象标记,它通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。本节中,我们就来了解如何利用 Python 保存数据到 JSON 文件。

对象和数组

​ 在 JavaScript 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等,但是对象和数组是比较特殊且常用的两种类型,下面简要介绍一下它们。

  • 对象:它在 JavaScript 中是使用花括号 {} 包裹起来的内容,数据结构为 {key1:value1, key2:value2,…} 的键值对结构。在面向对象的语言中,key 为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。
  • 数组:数组在 JavaScript 中是方括号 [] 包裹起来的内容,数据结构为 [“java”, “javascript”, “vb”, …] 的索引结构。在JavaScript 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引用得多。同样,值的类型可以是任意类型。

所以,一个 JSON 对象可以写为如下形式:

[{
"name": "Bob", 
"gender": "male", 
"birthday": "1992-10-18" 
}, { 
"name": "Selina", 
"gender": "female", 
"birthday": "1995-10-18" 
}]

由中括号包围的就相当于列表类型,列表中的每个元素可以是任意类型,这个示例中它是字典类型,由大括号包围。

json模块方法

方法作用
json.dumps()把python对象转换成json对象的一个过程,生成的是字符串。
json.dump()用于将dict类型的数据转成str,并写入到json文件中
json.loads()将json字符串解码成python对象
json.load()用于从json文件中读取数据。

实战4399小游戏

目标网址:https://www.4399.com/flash/

目标:抓取该网址下所有的游戏标题及其链接,并以json的格式进行存储。

import requests
from lxml import etree

url = 'https://www.4399.com/flash/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
    'Referer': 'https://www.zhihu.com/'
}
response = requests.get(url, headers=headers)
response.encoding = 'gbk'
html_obj = etree.HTML(response.text)
li_list = html_obj.xpath('//ul[@class="n-game cf"]/li')
# print(li_list)
for li in li_list:
    link = li.xpath('./a/@href')[0]
    title = li.xpath('./a/b/text()')[0]
    print(link, title)

通过这段代码提取出了,网页游戏中的标题和链接,并把它打印出来。那么该如何保存呢?往往我们都会将它保存为json数组。

代码修改如下所示:

data = []
for li in li_list:
    item = {}
    item['link'] = li.xpath('./a/@href')[0]
    item['title'] = li.xpath('./a/b/text()')[0]
    data.append(item)

with open('4399.json', 'w', encoding='utf-8') as f:
    f.write(json.dumps(data, ensure_ascii=False, indent=2))
    print('存储完成!')

ensure_ascii=False:代表的含义是不对中文进行编码。

indent:美化json数据,每条数据两行显示。

总结

本篇文章是数据存储的上半部分,讲述的内容是如何将数据存储进文本文档和以json格式存储。内容不多,也比较简单,适合初学者学习过程中存储数据。

跟着我一起学习爬虫。

没有一件事情是可以一蹴而就,路漫漫其修远兮,吾将上下而求索!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/893246.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型赋能病理AI,自动从报告文本中分类TNM分期|顶刊精析·24-10-17

小罗碎碎念 这篇文章介绍了一种名为BB-TEN(Big Bird – TNM staging Extracted from Notes)的方法,它能够自动从病理报告文本中分类TNM(肿瘤大小、区域淋巴结受累和远处转移)分期。 今天分享的这篇文章于2024-10-16发表…

elementUi el-table 表头高度异常问题

1、现象 在同一个页面通过状态切换不同table时&#xff0c;当从有合并标头行的table切换到无合并表头的table时&#xff0c;无合并表头的table的表头的高度异常了&#xff0c;如下图 切换后 2、解决 给每个el-table 加上一个唯一的key <el-table key"1"></…

大规模语言模型与生成模型:技术原理、架构与应用

大规模语言模型与生成模型&#xff1a;技术原理、架构与应用 个人主页&#xff1a;chian-ocean文章专栏 大规模语言模型与生成模型&#xff1a;技术原理、架构与应用1. 引言2. 大规模语言模型概述2.1 什么是大规模语言模型&#xff1f;2.2 常见的语言模型架构2.3 语言模型的技术…

在ESP-IDF环境中如何进行多文件中的数据流转-FreeRTOS实时操作系统_流缓存区“xMessageBuffer”

一、建立三个源文件和对应的头文件 建立文件名&#xff0c;如图所示 图 1-1 二、包含相应的头文件 main.h 图 2-1 mess_send.h mess_rece.h和这个中类似,不明白的大家看我最后面的源码分享 图2-2 三、声明消息缓存区的句柄 大家注意&#xff0c;在main.c中定义的是全局变…

Java 类和对象详解(上 )

个人主页&#xff1a; 鲤鱼王打挺-CSDN博客 Java专栏&#xff1a;https://blog.csdn.net/2401_83779763/category_12801101.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12801101&sharereferPC&sharesource2401_83779763&sharefromfrom_link &…

github下载文件的两种方式(非git形式)

1.以下面的图为例 &#xff0c;可以直接点击右上方的绿色Code按键&#xff0c;在弹出的列表中选择Download Zip选项&#xff0c;即可下载。 2.如果下载的是单独的某一个文件&#xff0c;则可以按照下图的格式点击下图所示的那个下载的图标即可。

研发线上事故风险解读之缓存篇

专业在线打字练习平台-巧手打字通&#xff0c;只输出有价值的知识。 一 前言 本文继续基于《线上事故案例集》&#xff0c;进一步深入梳理线上事故缓存使用方面的问题点&#xff0c;重点关注缓存在使用和优化过程中可能出现的问题&#xff0c;旨在为读者提供具有实践指导意义的…

ThinkPHP5bootstrapMySQL开发学习平台(包括后台管理功能、PC端网页、移动端网页)手把手运行源码

一、项目预览(全部源码链接在最下面) 功能及页面持续优化中...... 二、本地运行方式 1、下载源码包进行解压&#xff08;源码在最下面&#xff09; 2、下载phpstudy_pro&#xff0c;并运行Apache&MySQL 3、打开phpstudy_pro按照根目录&#xff0c;复制粘贴解压好的源码包&…

【时时三省】(C语言基础)函数介绍strcmp

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 假如有一个这样的代码 这个代码这样写对不对呢 它是不对的 因为p是一个地址 里面可能是0x5546643 q也是一个地址 所以她们没法这样比较 这个时候就可以用到我们的 strcmp 他就说用来比较字…

微软十月补丁星期二发现了 118 个漏洞

微软将在2024 年 10 月补丁星期二解决 118 个漏洞&#xff0c;并且有证据表明发布的 5 个漏洞被野蛮利用和/或公开披露&#xff0c;尽管微软尚未将其中任何一个漏洞评定为严重漏洞。 在这五个漏洞中&#xff0c;微软列出了两个已被利用的漏洞&#xff0c;这两个漏洞现在都已列…

如何实现安川MP3300运动控制器与西门子1200系列PLC进行ModbusTCP通讯

在工业自动化中&#xff0c;实现不同品牌、不同型号设备之间的通讯是确保生产流程顺畅、高效运行的关键。本文详细介绍了安川MP3300运动控制器与西门子1200系列PLC进行ModbusTCP通讯的具体方法。 一&#xff0e;软硬件需求 1.一台安川MP3300CPU301&#xff0c;其IP地址是192.…

SpringBoot项目热部署-devtools

DevTools 会使用两个类加载器&#xff08;一个用于加载不变的类&#xff0c;一个用于加载可能会变化的类&#xff09;&#xff0c;每次重启只重新加载管理变化的类的加载器&#xff0c;因此会快很多 1.导入依赖 <dependency> <groupId>org.springframework.boot&l…

uni-app使用v-show编译成微信小程序的问题

问题 在uni-app使用v-show语法编译成微信小程序会有一个问题 当我们设置成v-show"false" 在Hbuilder X里面确实没有显示 然后运行到 微信开发程序里面 发现显示了出来&#xff0c;说明设置的 v-show"false"没有起作用 解决办法 首先去uniapp官网查看v…

考研C语言程序设计_编程题相关(持续更新)

目录 零、说明一、程序设计经典编程题(C语言实现)T1 求1~100的奇数T2 求n!T3 求1!2!3!...10!T4 在一个有序数组中查找具体的某个数字n(二分查找)T5 编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚T6 模拟用户登录(三次机会)T7 输入三个数 并从大到小输出T8…

【Ubuntu】在Ubuntu上安装IDEA

【Ubuntu】在Ubuntu上安装IDEA 零、前言 最近换了Ubuntu系统&#xff0c;但是还得是要写代码&#xff0c;这样就不可避免地用到IDEA&#xff0c;接下来介绍一下如何在Ubuntu上安装IDEA。 壹、下载 这一步应该很容易的&#xff0c;直接打开IDEA的下载页面&#xff0c;点击下…

精密仪器制造企业如何保障安全高效的跨网文件交换?

在数字化时代&#xff0c;精密仪器制造企业面临着日益增长的跨网文件交换需求。这些企业通常拥有多个隔离的网络环境&#xff0c;如内网、外网、测试网等&#xff0c;以确保数据安全和合规性。然而&#xff0c;如何在保障数据安全的同时&#xff0c;实现文件的快速、稳定传输&a…

前端学习-css的元素显示模式(十五)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 什么是元素显示模式 块元素 常见的块元素 块元素的特点 注意 行内元素 行内元素的特点 注意 行内块元素 行内块元素的特点 元素显示模式的转换 语法格…

黑马程序员-redis项目实践笔记1

目录 一、 基于Session实现登录 发送验证码 验证用户输入验证码 校验登录状态 Redis代替Session登录 发送验证码修改 验证用户输入验证码 登录拦截器的优化 二、 商铺查询缓存 缓存更新策略 数据库和缓存不一致解决方案 缓存更新策略的最佳实践方案 实现商铺缓…

【UML】一个UML学习的还不错的几个帖子

https://segmentfault.com/a/1190000042775634 寂然解读设计模式 - UML类图&类的六大关系-阿里云开发者社区

学习threejs,网格深度材质MeshDepthMaterial

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️网格深度材质MeshDepthMate…