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

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

序言

在将如何将数据存储之前我们必须来了解一个爬虫的过程。
爬虫分为: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文件,大家可以打开看看是否是我们需要的内容。
在这里插入图片描述
以上便是我本次分享的内容了,希望大家可以多提出意见,互相学习!!

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值