TXT文本存储
1.基本实例
首先,我们采用selenium的方法爬取新闻联播文字稿的首页,这是因为这个网页比较简单,本文重点在文件存取上。
from selenium import webdriver
import time
url = "http://xwlbo.com/xwlb_.html"
browser = webdriver.Chrome()
browser.get(url)
time.sleep(1)
try:
content = browser.find_element_by_class_name('xwlist').text
strings = content.split("\n")
except Exception as e:
e.with_traceback()
strings = []
for s in strings:
with open("shouye.txt", "a+", encoding='utf-8')as f:
f.write(s + "\n")
browser.close()
运行程序,可以发现本地生成了一个文件,内容如下。
2.打开方式
刚才的实例中,open()方法的第二个参数设置的是a+,这样在每次写入文件是以追加写入的方式。如果文件不存在,则创建新文件读写。除此之外,还有这些方法。
r:以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb:以二进制只读方式打开一个文件。文件指针将会放在文件的开头。
r+:以读写方式打开一个文件。文件指针将会放在文件的开头。
rb+:以二进制读写方式打开一个文件。文件指针将会放在文件的开头。
w:以写入方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
wb:以二进制写入方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
w+:以读写方式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
wb+:以二进制读写格式打开一个文件。如果该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
a:以追加方式打开一个文件。如果该文件已存在,文件指针将会放在文件结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,则创建新文件来写入。
ab:以二进制追加方式打开一个文件。如果该文件已存在,则文件指针将会放在文件结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,则创建新文件来写入。
a+:以读写方式打开一个文件。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,则创建新文件来读写。
ab+:以二进制追加方式打开一个文件。如果该文件已存在,则文件指针将会放在文件结尾。如果该文件不存在,则创建新文件用于读写。
3.简化写法
上面的实例中,使用了with as 语法。在with 控制块结束时,文件会自动关闭,这些也是python基础语法的内容,相对于直接使用open()的方法相对简易。
JSON文件存储
JSON文件通过对象和数组的组合来表示数据,构造简洁,结构化程度高,是一种轻量级的数据交换格式。
1.对象和数组
在JavaScript中,一切都是对象。因此,其中任何支持的类型都可以通过JSON储存,而对象和数组是里面比较常用的两种类型。
对象
在JavaScript中就是用{}括住的内容,数据结构是{key1:value1,…}。key是属性,value是对应的值。
数组
同上,只不过数组是[]括住的内容。
JSON可以用上面两种组合无限次嵌套,而且结构清晰,处理起来十分方便。
2.读取
我们通常会爬取到JSON的字符串,此时可以使用loads()方法将JSON字符串转换为JSON对象,当然也可以用dumps()方法将JSON对象转化为文本。转换为JSON对像后就可以使用索引来获取相对应的内容了。下面给出方法和说明。
import json
str = '''
[{
"name": "Bob",
"gender": "male",
"birthday": "1992-10-18"
}, {
"name": "Selina",
"gender": "female",
"birthday": "1995-10-18"
}]
'''
print(type(str))
data = json.loads(str)
print(data)
print(type(data))
print(data[1]['name']) #索引第二个元素里面的name属性
print(data[0].get(name)) #索引第一个元素里面的name属性
#通过[]进行索引,得到第一个字典元素
print(data[0]['age'])
print(data[0].get('age',25))
#如果索引元素在原字典中不存在,返回None,不报错,其中get()方法也可以传入参数
'''
data = json.loads(str)
#此方法此时使用会报错,因为JSON字符串的表示只能用说引号,而此时上面使用的单引号,这样loads()会解析失败。
'''
#此时我们若从文件中读出,再用上面的方法转化
with open('data.jaon','r')as file:
str = file.read()
data = json.loads(str)
print(data)
输出
前面说过,我们可以用dumps()方法将JSON对象转化为字符串,此后我们再使用write方法将字符串写入文件。此外,我们也可以将文件储存为JSON的格式,我们可以再增加一个参数indent,代表缩进字符的个数,下面给出实例。
import json
data = [{
'name': 'Bob',
'gender': 'male',
'birthday': '1992-10-18'
}]
with open('data.json', 'w') as file:
file.write(json.dumps(data, indent = 2))
此时我们要注意,如果需要写入的JSON文件中有中文字符,此时要还要指定参数ensure_ascii=False。
CSV文件储存
CSV文件是以纯文本的形式来储存表格数据的,该文件是一个字符序列,最常见的是以逗号和制表符作为字段间的分隔符,它相对Excel文件更简洁,先对XLS文本没有公式等内容,他只是字符间隔的纯文本,结构清晰,处理起来也比较方便。
1. 写入
先放一个简单实例,用CSV库的writer初始化写入对象,我们直接就可以调用writerow()传入每行的数据,如果想修改列与列的间隔,直接加上delimiter参数进行调整就可以。delimiter=‘ ’时就是直接以空格为间隔。当然我们也可以用writerows写入多行数据,只是我们此时需要一个二维列表。
import csv
with open('data.csv', 'w') as csvfile:
writer = csv.writer(csvfile, delimiter=' ')
writer.writerow(['id', 'name', 'age'])
writer.writerow(['10001', 'Mike', 20])
writer.writerow(['10002', 'Bob', 22])
writer.writerow(['10003', 'Jordan', 21])
一般情况下,爬虫爬取的数据都是结构化的数据,一般用字典表示,用下面的方法我们就可以将字典形式的数据写入CSV文件中了。
import csv
with open('data.csv', 'w') as csvfile:
fieldnames = ['id', 'name', 'age']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'id': '10001', 'name': 'Mike', 'age': 20})
writer.writerow({'id': '10002', 'name': 'Bob', 'age': 22})
writer.writerow({'id': '10003', 'name': 'Jordan', 'age': 21})
当然如果出现中文,仍然要在open()中给一个参数,
2.读取
用CSV库写入,也可以进行读取。这里可以用其他的数据可视化库进行读取,以便进一步的进行数据分析,如pandas。但是未学,所以后期补充。
总结
三种数据存取方式各有各的优点,不能因为平时用哪个就一直使用同一种文件格式,这样虽然后期处理的顺手,但同时可能会增加数据分析的难度,就是增大代码量,因此,一定要根据爬取数据的特点,选择数据存储方式,如TXT适合简单的文本分析,JSON和CSV都更适合进行大型的数据结构可视化处理,而各种可视化的库应用的方法又有不同,所以要适当选择。