首页 >> 大全

python爬虫——将爬取的数据进行存储

2023-12-30 大全 26 作者:考证青年

在前面我的博客中,讲了怎么爬取一些简单的数据,但是我们爬取数据的目的是利用和分析这些数据,所以今天我们来试试将这些数据存储起来。

目录

序言

在将如何将数据存储之前我们必须来了解一个爬虫的过程。

爬虫分为:1.获取数据,2.处理数据,3.存储数据。

在前面的博客中我们已经完成了前两个步骤,就差对数据的存储部分了。通常我们对数据的存储可以分为以数据库的形式和以文件的形式存储。数据库的存储分为关系型数据库 MySQL 和非关系型数据库 等,通常是适用于数据量大,数据关系复杂的存储;而以文件的形式存储就是用我们平时常用的Excel文件或者是用csv文件进行存储。对于初级爬虫阶段的我们,掌握第二种就好了。

(一) 通过Excel文件进行存储

Excel 文件也被称为 工作簿(),每个工作簿中可以新建多个工作表(),它是我们常用的办公软件,而有一个专门的模块实现对Excel文件的操作—模块

要实现对Excel文件的写入,我们首先得导入模块,具体得方法可以参考我的一篇博客:中常见库的导入

导入成功后我们来简单看看是怎么将数据写入Excel文件的吧。

首先需要创建一个 Excel 文件,我们使用 中的 类实例化了一个工作簿,即创建了一个空的 Excel 文件。

# 从 openpyxl 引入 Workbook(工作簿)类
from openpyxl import Workbook# 通过 Workbook 类实例化一个工作簿
wb = Workbook()

然后我们通过 wb. 选择了默认的工作表,并赋值给 sheet 变量,然后通过 title 属性重命名了默认工作表。

from openpyxl import Workbookwb = Workbook()
# 选择默认的工作表
sheet = wb.active
# 给工作表重命名
sheet.title = '成绩统计表'

我们通过for循环调用 () 方法往工作表内写入多行数据,最后我们还需要调用 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)# 解析JSONdata = 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 作为下一页的 lasthotcommentidself.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- (逗号分隔值),它是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。csv 格式的文件是纯文本,你可以用记事本打开它,当用 Excel 打开 csv 文件时,会将其解析成表格形式展示。而它相比于xlsx文件,存储空间更小,打开速度更快。那么接下来我们来看下如何用csv文件写入数据的吧。

写之前还是需要先导入csv库,具体的操作方法可以参看我这篇博客:中常见库的导入

下面是简单的写入csv文件的方法:

import csvwith 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.() 方法进行处理,得到一个可写入对象,接下来就可以用它的 () 方法写入 csv 文件了(这里的 =’’ 也是为了让文件内容中的换行符能被正确解析)。

简单的了解写入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)# 解析JSONdata = 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 作为下一页的 lasthotcommentidself.lasthotcommentid = data['comment']['commentlist'][-1]['commentid']# 防止爬取太快被封time.sleep(1)# 爬取前六页评论
music = YuAi_Review(6)
music.write_view()

在代码运行成功后,在该项目对应的文件夹下就会生成csv文件,大家可以打开看看是否是我们需要的内容。

以上便是我本次分享的内容了,希望大家可以多提出意见,互相学习!!

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了