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

server/2024/10/17 23:50:28/

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

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

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

文本文档存储

文件打开模式

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

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

实战知乎热点问题

目标网址:

import requests
from bs4 import BeautifulSoupurl = '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 etreeurl = '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格式存储。内容不多,也比较简单,适合初学者学习过程中存储数据。

跟着我一起学习爬虫

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


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

相关文章

Spring Boot框架下JavaWeb在线考试系统的创新实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

不同编程语言的隐式控制流分析:特性、利弊及代码示例

隐式控制流(Implicit Control Flow)是指代码的执行路径不显式暴露在源代码中,往往由多态、重载、接口等高级语言特性引发。尽管这些特性带来了灵活性,但它们也可能掩盖代码的实际执行路径,使调试变得更复杂。以下分析了…

视图使用控制器模板分配变量

文章目录 控制器视图路由配置控制器视图 视图使用控制器模板分配变量控制器视图 控制器视图 路由配置 <?phpuse Illuminate\Support\Facades\Route;/* |-------------------------------------------------------------------------- | Web Routes |---------------------…

【更新】上市公司企业创业导向数据集(2010-2023年)

计算说明&#xff1a;参考《南京审计大学学报》俞园园&#xff08;2024&#xff09;老师的做法&#xff0c;按照《管理学报》于晓宇&#xff08;2022&#xff09;老师开发的创业导向中文词表&#xff0c;采用Python爬虫技术对企业年报中关于董事或高管对公司经营状况及未来发展…

在Openshift(K8S)上通过EMQX Operator部署Emqx集群

EMQX Operator 简介 EMQX Broker/Enterprise 是一个云原生的 MQTT 消息中间件。 我们提供了 EMQX Kubernetes Operator 来帮助您在 Kubernetes 的环境上快速创建和管理 EMQX Broker/Enterprise 集群。 它可以大大简化部署和管理 EMQX 集群的流程&#xff0c;对于管理和配置的知…

小猿口算炸鱼脚本

目录 写在前面&#xff1a; 一、关于小猿口算&#xff1a; 二、代码逻辑 1.数字识别 2.答题部分 三、代码分享&#xff1a; 补充&#xff1a;软件包下载 写在前面&#xff1a; 最近小猿口算已经被不少大学生攻占&#xff0c;小学生直呼有挂。原本是以为大学生都打着本…

【Ubuntu】在Ubuntu上配置Java环境

【Ubuntu】在Ubuntu上配置Java环境 壹、前言 Java是运用得非常广泛的编程语言&#xff0c;在使用Linux时难免会碰到需要用到JDK的情况&#xff0c;故本文介绍如何在Ubuntu上配置Java21环境。 贰、下载 Java的下载渠道很多&#xff0c;有甲骨文公司的“官方”JDK&#xff0c…

在 Android Studio 中引入android.os.SystemProperties

在 Android Studio 中引入android.os.SystemProperties 前言 网上有很多种方法&#xff0c;其中直接导入包的办法是行不通的&#xff0c;昨天自己发现问题后也踩了很多坑&#xff0c;现在把问题解决了也全面汇总了几种方法&#xff0c;确保可以百分百引入 1. layoutlib.jar包…