相关推荐recommended
Python 网络爬虫 数据的存储(一):TXT 文本文件存储:
作者:mmseoamin日期:2023-12-21

提取到数据后, 接下来就是存储数据了, 数据的存储形式多种多样, 其中最简单的一种就是将数据直接保存为文本文件, 例如:txt,  json, csv 等, 还可以将数据保存到数据库中, 如关系型数据库 MySQL, 非关系型数据库 MongoDB, Redis等, 除了这两种, 也可以直接把数据存储到一些搜索引擎,例如 Elasticsearch 中, 以便检索和查看

txt 文本文件存储:

将数据保存为 txt 文本的操作非常简单, 而且txt 文本几乎兼容任何平台, 但是这也有个缺点, 就是不利于检索, 所以如果对检索和数据结构的要求不高,追求方便第一的话,就可以采用txt 文本存储

import requests
from pyquery import PyQuery as pq
import re
url = 'https://static1.scrape.center/'
html = requests.get(url).text
doc = pq(html)
items = doc('.el-card').items()
file = open('movies.txt', 'w', encoding='utf-8')
for item in items:
    # 名称
    name = item.find('a > h2').text()
    file.write(f'名称: {name}\n')
    # 类别
    categories = [item.text() for item in item.find('.categories button span').items()]
    file.write(f'类别: {categories}\n')
    # 上映时间
    published_at = item.find('.info:contains(上映)').text()
    published_at = re.search('(\d{4}-\d{2}-\d{2})', published_at).group(1) \
        if published_at and re.search('\d{4}-\d{2}-\d{2}', published_at) else None
    file.write(f'上映时间: {published_at}\n')
    # 评分
    score = item.find('p.score').text()
    file.write(f'评分: {score}\n')
    file.write(f'{"=" * 50}\n')
file.close()

这里的目的主要是演示文件的存储方式,因此省去了requests 异常处理部分, 首先,用requests库提取网站首页的HTML代码, 然后利用 pyquery解析库将电影的名称,类别,上映时间,评分信息提取出来。

我们可以利用python提供的open方法, 打开一个文本文件,获取一个文件操作对象, 这里赋值为file,  每提取一部分信息, 就利用file 对象的write方法 将这部分信息写入文件,全部提取完毕后, 调用close 方法将 file 对象关闭, 运行程序后,我们会发现生成了一个 movies.txt 的文件

文本内容的存储最重要的就是 open, write, close 这三个方法 的用法

打开方式:

在上面的实例中,open方法的第二个参数设置成了w,  这样在每次写入文本时都会清空源文件, 然后将新的内容写入文件, w 只是文件打开方式的一种, 下面简要介绍一下其它几种:

r: 以只读的方式打开一个文件, 意思是只能读取文件内容, 不能吸入, 这也是默认模式

rb:以二进制只读方式打开一个文件, 通常用于打开二进制文件,例如音频,图片,视频等

r+:以读写的方式打开一个文件,既可以读文件,也可以写文件,

rb+: 以读写的方式打开一个二进制文件,既可以读,也可以写文件,只是读写的方式都是二进制

w:以写入方式打开一个文件, 如果该文件已存在,则将其覆盖, 如果该文件不存在, 则创建

wb:以二进制写入方式打开一个文件, 如果该文件已存在,则覆盖, 如果该文件不存在,则创建

w+:以读写方式打开一个文件,如果该文件已存在,则覆盖,如果该文件不存在,则创建

wb+:以二进制读写格式打开一个文件, 如果该文件已存在,则覆盖,不存在, 则创建

a:以追加方式打开一个文件,如果该文件已存在,则文件指针将会放在文件结尾, 也就是说, 新的内容将会被写到已有内容之后, 如果该文件不存在,则创建新文件来写入

ab:以二进制追加方式打开一个文件,如果该文件已存在,则文件指针将会放在文件结尾,也就是说,新的内容会被写到已有内容之后, 如果该文件不存在,则创建新文件来写入

a+:以读写方式打开一个文件,如果该文件已存在,则文件指针将会放在文件结尾, 文件打开时会是追加模式,如果该文件不存在, 则创建新文件用于读写

ab+:以二进制追加方式打开一个文件, 如果该文件已存在,则文件指针将会放在文件结尾,如果该文件不存在,则创建新文件用于读写

简化写法:

使用 with as 语法, 当with可控制块结束时, 文件会自动关闭,这样就不用调用close 方法了

with open('movies.txt', 'w', encoding='utf-8'):
    file.write(f'名称: {name}\n')
    file.write(f'类别: {categories}\n')
    file.write(f'上映时间: {published_at}\n')
    file.write(f'评分: {score}\n')