在前面我的博客中,讲了怎么爬取一些简单的数据,但是我们爬取数据的目的是利用和分析这些数据,所以今天我们来试试将这些数据存储起来。
序言
在将如何将数据存储之前我们必须来了解一个爬虫的过程。
爬虫分为:1.获取数据,2.处理数据,3.存储数据。
在前面的博客中我们已经完成了前两个步骤,就差对数据的存储部分了。通常我们对数据的存储可以分为以数据库的形式和以文件的形式存储。数据库的存储分为关系型数据库 MySQL 和非关系型数据库 MongoDB等,通常是适用于数据量大,数据关系复杂的存储;而以文件的形式存储就是用我们平时常用的Excel文件或者是用csv文件进行存储。对于初级爬虫阶段的我们,掌握第二种就好了。
(一) 通过Excel文件进行存储
Excel 文件也被称为 工作簿(workbook),每个工作簿中可以新建多个工作表(worksheet),它是我们常用的办公软件,而python有一个专门的模块实现对Excel文件的操作—openpyxl模块
要实现对Excel文件的写入,我们首先得导入openpyxl模块,具体得方法可以参考我的一篇博客:pycharm中常见库的导入
导入成功后我们来简单看看python是怎么将数据写入Excel文件的吧。
首先需要创建一个 Excel 文件,我们使用 openpyxl 中的 Workbook 类实例化了一个工作簿,即创建了一个空的 Excel 文件。
# 从 openpyxl 引入 Workbook(工作簿)类
from openpyxl import Workbook
# 通过 Workbook 类实例化一个工作簿
wb = Workbook()
然后我们通过 wb.active 选择了默认的工作表,并赋值给 sheet 变量,然后通过 title 属性重命名了默认工作表。
from openpyxl import Workbook
wb = Workbook()
# 选择默认的工作表
sheet = wb.active
# 给工作表重命名
sheet.title = '成绩统计表'
我们通过for循环调用 append() 方法往工作表内写入多行数据,最后我们还需要调用 wb.save(‘文件名.xlsx’) 将 Excel 文件保存。
grades = [
['姓名', '语文', '数学', '英语'],
['小明', 90, 90, 85],
['小红', 95, 95, 90]
]
# 写入多行数据
for row in grades:
sheet.append(row)
# 保存 Excel 文件
wb.save('成绩统计.xlsx')
完整代码如下:
from openpyxl import Workbook
# 新建工作簿
wb = Workbook()
# 选择默认的工作表
sheet = wb.active
# 给工作表重命名
sheet.title = '成绩统计表'
grades = [
['姓名', '语文', '数学', '英语'],
['小明', 90, 90, 85],
['小红', 95, 95, 90]
]
# 写入多行数据
for row in grades:
sheet.append(row)
# 保存 Excel 文件
wb.save('成绩统计.xlsx')
简单了解写入Excel的方法后,我们来试试把我上一篇爬取的“雨爱”评论(网页链接)存入Excel文件中吧,废话不多说直接上代码,具体过程我已经在注释里详细备注了。
import requests
import time
from datetime import datetime
from openpyxl import Workbook
# 定义获取“雨爱”评论的类
class YuAi_Review:
def __init__(self, page):
# 初始化 headers 参数
self.headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36'
}
# 要爬取的页数
self.page = page
# 首先从第一页开始爬取
self.pagenum = 0
# lasthotcommentid 最开始为空
self.lasthotcommentid = ''
# 写入Excel的方法
def write_view(self):
# 新建工作薄
self.wb = Workbook()
# 选择默认工作表
self.s = self.wb.active
# 给工作表重命名
self.s.title = '评论数据'
header = ['昵称', '评论时间', '评论内容']
# 插入一行数据
self.s.append(header)
# 设置params参数
def get_params(self):
self.params = {
'g_tk': '5381',
'loginUin': '0',
'hostUin': '0',
'format': 'json',
'inCharset': 'utf8',
'outCharset': 'GB2312',
'notice': '0',
'platform': 'yqq.json',
'needNewCode': '0',
'cid': '205360772',
'reqtype': '2',
'biztype': '1',
'topid': '645819',
'cmd': '8',
'needmusiccrit': '0',
'pagenum': self.pagenum,
# pagesize改为100,可以提高爬取速度
'pagesize': '25',
'lasthotcommentid': self.lasthotcommentid,
'domain': 'qq.com',
'ct': '24',
'cv': '10101010'
}
# 获取给定页数的评论
def get_view(self):
for self.pagenum in range(self.page):
# 传入params参数
self.get_params()
# 请求与网站的连接
res = requests.get('https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg', headers=self.headers,
params=self.params)
# 解析JSON
data = res.json()
for item in data['comment']['commentlist']:
name = item['nick']
# 将时间戳转换为时间
Time = datetime.fromtimestamp(item['time'])
content = item['rootcommentcontent']
row = [name, Time, content]
# 将name,Time,content写入表格
self.s.append(row)
print(name, Time, content)
# 当前页最后一个评论的 commentid 作为下一页的 lasthotcommentid
self.lasthotcommentid = data['comment']['commentlist'][-1]['commentid']
# 防止爬取太快被封
time.sleep(1)
# 将爬取信息存到表格
def set_view(self):
self.write_view()
self.get_view()
# 保存文件
self.wb.save('雨爱.xlsx')
# 爬取前六页评论
music = YuAi_Review(6)
music.set_view()
看过我上一篇博客的小伙伴可以发现这篇我用了类来对整个过程进行封装,这样写可以大大提高我们代码的可读性和逻辑性,建议大家可以多尝试这种风格。另外在代码运行成功后,在该项目文件就会有我们写入的xlsx文件咯。
打开之后我们就可以查看我们爬取的数据咯。
(二) 通过csv文件进行存储
CSV 全称 Comma-Separated Values(逗号分隔值),它是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。csv 格式的文件是纯文本,你可以用记事本打开它,当用 Excel 打开 csv 文件时,会将其解析成表格形式展示。而它相比于xlsx文件,存储空间更小,打开速度更快。那么接下来我们来看下如何用csv文件写入数据的吧。
写之前还是需要先导入csv库,具体的操作方法可以参看我这篇博客:pycharm中常见库的导入
下面是简单的写入csv文件的方法:
import csv
with open('成绩表.csv', 'w', newline='') as file:
csv_writer = csv.writer(file)
rows = [
['姓名', '语文', '数学', '英语'],
['小明', 90, 90, 85],
['小红', 95, 95, 90]
]
# 每次写入一行数据
for row in rows:
csv_writer.writerow(row)
首先还是导入 csv 库,接着用 w 模式(写入模式)新建一个 csv 文件,然后将得到的 file 对象传递给 csv.writer() 方法进行处理,得到一个可写入对象,接下来就可以用它的 writerow() 方法写入 csv 文件了(这里的 newline=’’ 也是为了让文件内容中的换行符能被正确解析)。
简单的了解写入csv文件的方法后,我们来试试把我上一篇爬取的“雨爱”评论(网页链接)存入csv文件中吧,废话不多说直接上代码,具体过程我已经在注释里详细备注了。
import requests
import time
import csv
from datetime import datetime
# 定义获取“雨爱”评论的类
class YuAi_Review:
def __init__(self, page):
# 初始化 headers 参数
self.headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36'
}
# 要爬取的页数
self.page = page
# 首先从第一页开始爬取
self.pagenum = 0
# lasthotcommentid 最开始为空
self.lasthotcommentid = ''
# 写入csv的方法
def write_view(self):
# 将 encoding 设置为 utf-8,防止 python 解释器解析不了
with open('雨爱.csv', 'w', newline='', encoding='utf-8') as file:
self.csv_writer = csv.writer(file)
header = ['昵称', '评论时间', '评论内容']
self.csv_writer.writerow(header)
# 获取爬取的数据
self.get_view()
# 设置params参数
def get_params(self):
self.params = {
'g_tk': '5381',
'loginUin': '0',
'hostUin': '0',
'format': 'json',
'inCharset': 'utf8',
'outCharset': 'GB2312',
'notice': '0',
'platform': 'yqq.json',
'needNewCode': '0',
'cid': '205360772',
'reqtype': '2',
'biztype': '1',
'topid': '645819',
'cmd': '8',
'needmusiccrit': '0',
'pagenum': self.pagenum,
# pagesize改为100,可以提高爬取速度
'pagesize': '25',
'lasthotcommentid': self.lasthotcommentid,
'domain': 'qq.com',
'ct': '24',
'cv': '10101010'
}
# 获取给定页数的评论
def get_view(self):
for self.pagenum in range(self.page):
# 传入params参数
self.get_params()
# 请求与网站的连接
res = requests.get('https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg', headers=self.headers,
params=self.params)
# 解析JSON
data = res.json()
for item in data['comment']['commentlist']:
name = item['nick']
# 将时间戳转换为时间
Time = datetime.fromtimestamp(item['time'])
content = item['rootcommentcontent']
row = [name, Time, content]
# 将name,Time,content写入表格
self.csv_writer.writerow(row)
print(name, Time, content)
# 当前页最后一个评论的 commentid 作为下一页的 lasthotcommentid
self.lasthotcommentid = data['comment']['commentlist'][-1]['commentid']
# 防止爬取太快被封
time.sleep(1)
# 爬取前六页评论
music = YuAi_Review(6)
music.write_view()
在代码运行成功后,在该项目对应的文件夹下就会生成csv文件,大家可以打开看看是否是我们需要的内容。
以上便是我本次分享的内容了,希望大家可以多提出意见,互相学习!!