在爬虫中,我们需要将获取到的数据存储到文件中,这样数据就可以保存在本地了。当然数据也可以存储在数据库中。
今天我们就来看看如何把爬到的文件保存到本地。
首先我们是保存爬取到的数据,自然要写爬虫,书上说的是知乎的发现页的信息,我试了试,知乎的反爬虫还是很厉害的,没成功,400。所以我就将源码直接保存到本地html.txt,省去了请求页面的一步,直接从本地打开。
提取信息我就直接放代码了,用的BeautifulSoup的节点选择器和方法选择器。
import json
import csv
import lxml
import requests
from bs4 import BeautifulSoup as BS
response = open('html.txt',encoding='utf-8')
bsobj = BS(response, 'lxml')
items = bsobj.find_all('div', class_='explore-feed feed-item', )
for item in items:
question = item.a.string
author = item.find(name='a', class_='author-link').get_text()
answer = item.textarea.string
info = [question,author,answer,]
dict = {'question':question, 'author':author, 'answer':answer}
save_as_txt(info)
save_as_json(dict)
save_as_csv(info)
可以看到后面的三行就是我们今天要完成的三种存储方式:
TXT:
txt文件是一种跨平台的文件格式,几乎所有系统都支持这种文件,自然是我么存储信息的好帮手,但是txt在索引方面就不那么行了。
我们用open()函数打开文件,并新建一个文件对象file,然后写入文本,然后关闭这个文件。
file = open('info.txt', 'a', encoding='utf-8')
file.write('Hello world!')
file.write('\n')
file.close()
上面的程序我们打开了当前目录下的‘info.txt’文件,并制定打开方式为追加,编码格式为‘utf-8’。
文件目录可以是绝对路径,也可以是相对路径。
打开方式总分为三种——r,w,a,r是只读模式,w是写入模式,a是追加模式,每种模式又有4种不同方式,以r为例:r,rb,r+,rb+。
- r——只读模式打开(read),打开时指针在文件首部,文件要存在,这是默认的模式
- w——写入模式打开(write),若文件存在,则覆盖它,不存在则新建文件
- a——追加模式打开(add),若文件存在则,在文件尾部开始写入,不存在则新建文件
而b+\b+
可以这么记:b就是以二进制打开,+就是以读写模式打开,然后在加上r\w\a的特性即可。
以r为例:
- rb——二进制只读
- r+——读写模式
- rb+——二进制读写
其他以此类推。
在文件读写时更加建议使用with语句来读写文件,这样就避免了忘记关闭文件的情况,而导致数据丢失。
现在我们就可以将获得的文件存储到txt文件中了
def save_as_txt(list):
filename = 'info.txt'
with open(filename, 'a',encoding='utf-8') as file:
file.write('\n'.join(list))
输入列表,存入txt
结果:

JSON
json 全称为:JavaScript object notation,json我们主要用两个方法:
loads(string)读取
和
dumps(data, indent=4, ensure_ascii=False)输出
indent 是为了美化输入,是缩进4格
ensure_ascii是为了能够显示中文,否则中文会显示为Unicode字
我们接受一个字典作为输入内容,追加模式写入
def save_as_json(dict):
filename = 'info.json'
with open(filename, 'a',encoding='utf-8') as file:
file.write(json.dumps(dict, indent=4, ensure_ascii=False)+',\n')
结果:


csv
csv是以纯文本的格式存储表格数据,它相比庞大的excel要小很多,它并不包含函数,公式,等内容。
写入用csv.writer()对象,读取用csv.reader()对象。
filename = 'info.csv'
with open(filename, 'w', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(['question', 'author', 'answer'])
def save_as_csv(list):
filename = 'info.csv'
with open(filename, 'a', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(list)
为了防止重复的存储键值,我就把新建键值放前面,单独拿出去了。
结果:

网友评论