网络爬虫文件存取(TXT,JSON,CSV)特点与用法

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(strprint(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都更适合进行大型的数据结构可视化处理,而各种可视化的库应用的方法又有不同,所以要适当选择。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值