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