Python3网络爬虫(六) -- 数据储存之文件储存

使用TXT文本储存

例子:这个例子使用pyquery解析库进行解析

import requests
from pyquery import PyQuery as pq

url = 'https://www.zhihu.com/explore'
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
html = requests.get(url, headers=headers).text
doc = pq(html)
items = doc('.explore-tab .feed-item').items()
for item in items:
    question = item.find('h2').text()
    author = item.find('.author-link-line').text()
    answer = pq(item.find('.content').html()).text()
    file = open('explore.txt', 'a', encoding='utf-8')
    file.write('\n'.join([question, author, answer]))
    file.write('\n' + '=' * 50 + '\n')
    file.close()

控制文件的简单写法,使用with
在with控制块结束的时候,文件会自动关闭,所以就不需要再调用close()方法:

with open('explore.txt', 'a', encoding='utf-8') as file:
    file.write('\n'.join([question, author, answer]))
    file.write('\n' + '=' * 50 + '\n')

with open(…) as …



使用JSON文件储存

我们可以调用 json 库的 loads() 方法将 Json 文本字符串转为 Json 对象,可以通过 dumps()方法将 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))

我们使用loads方法后获得了一个数组,我们可以使用data[0]['name']获取第一个元素里面的name属性,但是!!!推荐使用data[0].get('name')这种方法,因为这样如果键名不存在不会报错,会返回None。JSON数据需要使用双引号来包围

输出JSON到文本:

import json

data = [{
    'name': 'Bob',
    'gender': 'male',
    'birthday': '1992-10-18'
}]
with open('data.json', 'w') as file:
    file.write(json.dumps(data))

这样写入到文本中就是一行长串数据,如果我们想储存成JSON缩进格式,可以加indent参数
file.write(json.dumps(data, indent=2))

如果要输出中文:
file.write(json.dumps(data, indent=2, ensure_ascii=False))



CSV文件储存

Comma-Separated Values 文件以纯文本形式储存表格数据,字段间的分隔符是其它字符或字符串

import csv

with open('data.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['id', 'name', 'age'])
    writer.writerow(['10001', 'Mike', 20])
    writer.writerow(['10002', 'Bob', 22])
    writer.writerow(['10003', 'Jordan', 21])

这样默认的字段之间是用逗号隔开的,如果我们想修改列与列之间的分隔符,我们可以:writer = csv.writer(csvfile, delimiter=' ') 这就代表分隔符为空格。
如果要一次性写入多行:writer.writerows([['10001', 'Mike', 20], ['10002', 'Bob', 22]]

但是大部分情况下爬虫爬取的数据是字典类型的结构化数据,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})

读取CSV文件:
可以使用CSV库来读取:

import csv

with open('data.csv', 'r', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)

这样打印出来的就是一个个列表,代表每一行的数据

但是这样看起来不够直观,所以我们可以使用更好处理数据的库pandas:

import pandas  as pd
df = pd.read_csv('data.csv')
print(df)

这种方法比较简便,并且输出的结果也很美观

你可能感兴趣的:(网络爬虫)