自学内容网 自学内容网

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

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

  • 文本存储
  • 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格式存储。内容不多,也比较简单,适合初学者学习过程中存储数据。

跟着我一起学习爬虫。

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


原文地址:https://blog.csdn.net/weixin_42577686/article/details/143030492

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!