Scrapy 爬取实战:爬取 B 站视频评论并做精美可视化!

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

本文通过 Scrapy 对 B 站进行视频评论抓取分析然后对数据清洗、制作词频图、词云图到最后的精美大屏可视化。带大家快速认识 Scrapy 爬虫框架并且应用。只要你有一定的 Python 基础,就可…

本文通过 Scrapy 对 B 站进行视频评论抓取分析然后对数据清洗、制作词频图、词云图到最后的精美大屏可视化。带大家快速认识 Scrapy 爬虫框架并且应用。只要你有一定的 Python 基础,就可以快速上手。

通化本文的学习,你可以掌握以下知识:

  1. Scrapy 基础了解
  2. Scrapy 的安装和使用
  3. Scrapy 结构详解
  4. 爬取 B 站视屏评论深度体验 Scrapy 框架
  5. 使用 Openpyxl 将数据保存到本地 Excel
  6. Pandas 对数据清洗、筛选、过滤等
  7. 使用 Jieba 分词、WordCloud 绘制精美词云图
  8. Pyecharts 精美可视化大屏展示

短短两万字带你体验从网页数据爬取到最后精美大屏数据展示,虽然无法保证你能成为大神,但是一定会让你对爬虫有一个更深入的了解!

适用对象:

  1. 有一定 Python 基础的童鞋
  2. 对爬虫或者 Scrapy 有兴趣的童鞋
  3. 对可视化有兴趣的童鞋


Scrapy 框架介绍

Scrapy 是由 Python 语言开发的一个快速、高层次的屏幕抓取和 Web 抓取框架,用于抓取 Web 站点并从页面中提取结构化的数据。

它的作用:

  • Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。
  • Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

通常我们可以很简单地通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。

Scrapy 的安装和使用

Scrapy 框架的传送门:

https://scrapy.org

Scrapy 官方文档地址:

https://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.htm

Scrapy 的安装:

pip install scrapy

Scrapy 结构详解

Scrapy 框架运行原理

在这里插入图片描述

Scrapy 项目开发流程

创建项目:

scrapy startproject mySpider

生成一个爬虫:

scrapy genspider baidu baidu.com

提取数据:根据网站结构在 spider 中实现数据采集相关内容。

保存数据:使用 pipeline 进行数据后续处理和保存。

流程原理描述

  1. 爬虫中起始的 url 构造的 url 对象 -> 爬虫中间件 -> 引擎 -> 调度器
  2. 调度器把 request -> 引擎 -> 下载中间件 -> 下载器
  3. 下载器发送请求,获取 response 响应 -> 下载中间件 -> 引擎 -> 爬虫中间件 -> 爬虫
  4. 爬虫提取 url 地址,组装成 request 对象 -> 爬虫中间件 -> 引擎 -> 调度器,重复步骤 2
  5. 爬虫提取数据 -> 引擎 -> 管道处理和保存数据

爬虫中间件和下载中间件只是运行的逻辑的位置不同,作用是重复的,如替换 UA 等。

案例一:爬取 B 站视频评论深度体验 Scrapy 框架

今天我们就以 B 站小姐姐为例,带大家亲自体验一下 Scrapy 的强大之处。

创建 spider 项目

首先我们来看看 Scrapy 的常用命令:

    scrapy startproject 项目名称    # 创建一个爬虫项目或工程    scrapy genspider 爬虫名 域名     # 在项目下创建一个爬虫 spider 类    scrapy runspider 爬虫文件       #运行一个爬虫 spider 类    scrapy list                  # 查看当前项目有多少个爬虫    scrapy crawl 爬虫名称           # 通过名称指定运行爬取信息    scrapy shell url/文件名        # 使用 shell 进入 scrapy 交互环境

1. 我们创建一个 Scrapy 工程,进入到你指定的目录下,使用命令:

    scrapy startproject 项目名称    # 创建一个爬虫项目或工程

在这里插入图片描述

此时可以看到该目录下多了一个叫 bbbbl 的文件夹:

在这里插入图片描述

2. 当我们创建完项目之后,它会有提示,那么我们就按照它的提示继续操作。

    You can start your first spider with:        cd BliBli        scrapy genspider example example.com

当你按照上面的操作,之后你就会发现,在 spiders 文件夹下就会出现 spider_bbbl.py 这个文件。这个就是我们的爬虫文件。

后面的 earch.bilibili.com 就是我们要爬取的目标网站:

    BliBli    |—— BliBli    |   |—— __init__.py    |   |—— __pycache__.    |   |—— items.py        # Item 定义,定义抓取的数据结构    |   |—— middlewares.py  # 定义 Spider 和 Dowmloader 和 Middlewares 中间件实现    |   |—— pipelines.py    # 它定义 Item Pipeline 的实现,即定义数据管道    |   |—— settings.py     # 它定义项目的全局配置    |   |__ spiders         # 其中包含一个个 Spider 的实现,每个 Spider 都有一个文件            |—— __init__.py            |—— spider_bl.py # 爬虫实现            |—— __pycache__    |—— scrapy.cfg  # Scrapy 部署时的配置文件,定义了配置文件的路径、部署相关的信息内容。

在这里插入图片描述

目标确定

接下来我们打开 B 站搜索“小姐姐”如下。我们今天的任务很简单。

视频标题、视频链接、视频播放时长、视频播放量、视频发布时间、视频作者还有封面图片和视频链接。

图片

网页分析

我们打开网页分析这是一个 get 请求。分页是由参数 page 来控制的,所有的数据都存在于一个 json 格式的数据集里面。

我们的目标就是获取 result 列表中的数据:

在这里插入图片描述

在这里插入图片描述

请求发送

1. 设置 item 模板,定义我们要获取的信息如下:

    # 视频标题    title_video = scrapy.Field()    # 视频时长    time_video = scrapy.Field()    # 播放量    num_video = scrapy.Field()    # 发布时间    date_rls = scrapy.Field()    # 作者    author = scrapy.Field()    # 图片链接    link_pic = scrapy.Field()    # 视频地址    link_video = scrapy.Field()

2. 然后我们在我们创建的 spider_bl.py 文件中写我们爬虫函数的具体实现。

    bl_list = response.json()[\'data\'][\'result\']    ic(bl_list)

在这里插入图片描述

数据提取

接下来我们提取我们所需的数据:

    for bl in bl_list:      # 视频标题      item[\'title_video\'] = bl[\'title\']      # 视频时长      item[\'time_video\'] = bl[\'duration\']      # 视频播放量      item[\'num_video\'] =bl[\'video_review\']      # 发布时间      date_rls = bl[\'pubdate\']      item[\'date_rls\'] = time.strftime(\'%Y-%m-%d %H:%M\', time.localtime(date_rls))      # 视频作者      item[\'author\'] = bl[\'author\']      # 图片链接      link_pic = bl[\'pic\']      item[\'link_pic\'] = \'https:\'+link_pic      # 视频链接      item[\'link_video\'] = bl[\'arcurl\']      \'\'\'      {\'author\': \'共青团中央\',       \'date_rls\': \'2019-11-26 18:35\',       \'link_pic\': \'https://i0.hdslb.com/bfs/archive/c24d34f04ba017e806c3554a9fc8c286f809a4b1.jpg\',       \'link_video\': \'http://www.bilibili.com/video/av77087288\',       \'num_video\': 1781,       \'time_video\': \'2:7\',       \'title_video\': \'《华服抄》随风轻逸,莲步生情(绝美华服小姐姐 MV 付)\'}      Excel 数据成功保存!      {\'author\': \'祖瑜兄\',       \'date_rls\': \'2019-06-22 18:06\',       \'link_pic\': \'https://i0.hdslb.com/bfs/archive/784607de4c3397af15838123a2fde8c1d301fb42.jpg\',       \'link_video\': \'http://www.bilibili.com/video/av56450490\',       \'num_video\': 5307,       \'time_video\': \'9:51\',       \'title_video\': \'5 分钟戏腔教程!满满干货不废话!京剧系小姐姐教你如何快速入门~赶紧收藏~(内有清唱示范)\'}      Excel 数据成功保存!      {\'author\': \'皮皮皮皮皮皮皮卡乒\',       \'date_rls\': \'2020-09-02 16:36\',       \'link_pic\': \'https://i1.hdslb.com/bfs/archive/39600c112ea656788740838d53df36fc3fe29e1f.jpg\',       \'link_video\': \'http://www.bilibili.com/video/av754474482\',       \'num_video\': 1148,       \'time_video\': \'3:41\',       \'title_video\': \'小姐姐:我等会你(温柔声)外卖小哥:我太感动了!\'}      Excel 数据成功保存!      {\'author\': \'小疼聊音乐\',       \'date_rls\': \'2020-06-19 17:47\',       \'link_pic\': \'https://i1.hdslb.com/bfs/archive/d5bc2336899759fc5bc3cd3742f76d2846609fbd.jpg\',       \'link_video\': \'http://www.bilibili.com/video/av668575442\',       \'num_video\': 814,       \'time_video\': \'3:29\',       \'title_video\': \'小姐姐随口哼两句,没想到引发整栋楼的合唱!这届毕业生太惨了!\'}      Excel 数据成功保存!      {\'author\': \'奇视界\',       \'date_rls\': \'2019-11-26 10:39\',       \'link_pic\': \'https://i0.hdslb.com/bfs/archive/d0c1937e9dbccf2c639be865763e41df78f0bed5.jpg\',       \'link_video\': \'http://www.bilibili.com/video/av77065062\',       \'num_video\': 1583,       \'time_video\': \'4:58\',       \'title_video\': \'两个钢铁直男交流追女孩子方法,让坐在边上的小姐姐笑喷了\'}      \'\'\'

数据保存至 json

我们现在 pipeline 中打印一下,没问题我们再将其保存到本地。

当我们要把数据保存成文件的时候,不需要任何额外的代码,只要执行如下代码即可:

    scrapy crawl spider 爬虫名 -o xxx.json      #保存为 JSON 文件    scrapy crawl spider 爬虫名 -o xxx.jl 或 jsonlines    #每个 Item 输出一行 json    scrapy crawl spider 爬虫名 -o xxx.csv          #保存为 csv 文件    scrapy crawl spider 爬虫名 -o xxx.xml #保存为 xml 文件

想要保存为什么格式的文件,只要修改后缀就可以了,在这里我就不一一例举了。我们在此将其保存为 json 格式如下:

    class BbbblPipeline:    def process_item(self, item, spider):        # 保存文件到本地        with open(\'./B 站小姐姐.json\', \'a+\', encoding=\'utf-8\') as f:            lines = json.dumps(dict(item), ensure_ascii=False) + \'\\n\'            f.write(lines)        return itemsettings.py 找到以下字段,取消字段的注释    # Obey robots.txt rules    ROBOTSTXT_OBEY = False    # Override the default request headers:    DEFAULT_REQUEST_HEADERS = {       \"User-Agent\" : str(UserAgent().random),        \'Accept\': \'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\'    }    # Configure item pipelines    # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html    ITEM_PIPELINES = {        \'BliBli.pipelines.BbbblPipeline\': 300,    }

使用如下命令运行程序,可以看到产生了一个 json 文件如下:

    scrapy crawl spider_bbbbl

在这里插入图片描述

打开文件可以看到已经成功的获取到了我们想要的数据:

在这里插入图片描述

数据保存至 Excel

我们使用 openpyxl 将数据保存到 excel 中便于后面的数据分析,我们先在 pipeline.py 中定义一个 ExcelPipeline 的函数。

       # 名称       ws.append([\'视频标题\', \'视频时长\', \'视频播放量\', \'发布时间\', \'视频作者\', \'图片链接\', \'视频链接\'])       # 存储       line = [item[\'title_video\'], item[\'time_video\'], item[\'num_video\'], item[\'date_rls\'], item[\'author\'], item[\'link_pic\'],item[\'link_video\']]       ws.append(line)       wb.save(\'../B 站小姐姐.xlsx\')

然后在 settings 中打开这个通道的开关,资源就会下载下来。

    ITEM_PIPELINES = {      \'bbbbl.pipelines.BbbblPipeline\': 300,      \'bbbbl.pipelines.ExcelPipeline\': 301,    }

结果如下,我们会在 Scrapy 目录下发现一个我们下载数据的 excel:

在这里插入图片描述

可以看到数据全部已经成功下载到 excel 中:

在这里插入图片描述

案例二:爬取网易严选

再给大家来一个真实的爬虫 + 可视化案例:使用 Scrapy 抓取网易严选 iPhone 12 评论数据,看看到底值不值得入手。

创建 Scrapy 项目

在这里插入图片描述

网页分析

找到网页真实请求连接,可以看到数据实际上存储在 json 格式数据集里面。所以我们第一步必须先获取到这一整个 json 数据集。

在这里插入图片描述

为了防止被网站防爬,我们还需在 setting.py 加上 ua,如下:

在这里插入图片描述

我们使用浏览器打开请求连接可以更加直观的观察数据格式。

在这里插入图片描述

发送请求

我们要此次要抓取的数据一共有 7 个,分别如下所示:

在这里插入图片描述

我们先在 items 中定义好我们要获取的数据 :

        # 名称        name = scrapy.Field()        # 等级        level = scrapy.Field()        # 评分        star = scrapy.Field()        # 时间        rls_time = scrapy.Field()        # 颜色        color = scrapy.Field()        # 内存        storage = scrapy.Field()        # 评论        content = scrapy.Field()

刚才我们已经成功分析出来要获取的数据集合是一个 json 格式的,Scrapy 已经帮我们请求好了,我们直接打印即可:

    ic(response.json())

在这里插入图片描述

接下来我们要做的就是获取 json 格式中的 commentList 信息,因为我们需要的信息都在这个里面。

获取数据

phone_list = phone_info[\'data\'][\'commentList\']# 打印所需信息for phone in phone_list:    # 名称    item[\'name\'] = phone[\'frontUserName\']    # 等级    item[\'level\'] = phone[\'memberLevel\']    # 评分    item[\'star\'] = phone[\'star\']    # 时间    rls_time = phone[\'createTime\']    item[\'rls_time\'] = time.strftime(\'%Y-%m-%d %H:%M:%S\', time.localtime(rls_time/1000)).split(\' \')[0]    # 颜色    item[\'color\'] = phone[\'skuInfo\'][0].split(\':\')[1]    # 内存    item[\'storage\'] = phone[\'skuInfo\'][1].split(\':\')[1]    # 评论    item[\'content\'] = phone[\'content\']    yield item

数据成功获取到,最后我们把它扔给 Pipeline,让他自己去下载好了。你可以选择自己想要保存的格式。

在这里插入图片描述

数据保存 Excel

我一般为了后续的数据分析和可视化专门写了一个可以直接保存在 excel 的函数,如下:

    class ExcelPipeline:      op.Workbook()      self.wb.active      ws.append([\'用户名称\', \'会员等级\', \'手机评分\', \'评论时间\', \'手机颜色\', \'手机内存\', \'评论\'])      self.wb.save(\'../网易.xlsx\')      print(\'网易数据成功保存!\')

直接运行数据就会保存在我们本地啦!(部分数据如下)

在这里插入图片描述

Pandas 对数据清洗、筛选、过滤

我们在此使用 Pandas 对数据进行读取然后去重复和去除空值处理。并且随机抽取五条数据展示如下:

pd.set_option(\'display.max_columns\', None)   # 显示完整的列pd.set_option(\'display.max_rows\', None)  # 显示完整的行pd.set_option(\'display.expand_frame_repr\', False)  # 设置不折叠数据# 读取数据rcv_data = pd.read_excel(\'../网易.xlsx\')# 删除重复记录和缺失值rcv_data = rcv_data.drop_duplicates()rcv_data = rcv_data.dropna()# 抽样展示print(rcv_data.sample(5))\'\'\'  用户名称  会员等级  手机评分        评论时间   手机颜色  手机内存                      评论  7    赵****豪     5     5  2021-03-05     黑色  128G                没买 2 天又便宜了  42   用****4     5     5  2021-06-23  返红包黑色  128G            手机非常好用,老婆很喜欢  268  独****息     6     5  2021-06-04  返红包绿色  256G             发货很快,第二天就到了  144  1****5     5     5  2021-02-27     黑色  128G                 没啥可说的 好  97   用****4     5     5  2021-06-05  返红包白色  128G  发货快,物流也给力,包装保护的好,正品没问题\'\'\'

精美词云图

词云图展示如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

看来 iPhone 12 依旧还是很香的,虽然 13 出来了。但是依旧值得入手。

大屏可视化

词频提取

我们提取网易手机评论前十大高频词汇如下:

    # 词频设置    all_words = [word for word in result.split(\' \') if len(word) > 1 and word not in stop_words]    wordcount = Counter(all_words).most_common(10)    \'\'\'    (\'非常\', \'不错\', \'手机\', \'好好\', \'很快\', \'发货\', \'喜欢\', \'正品\', \'物流\', \'速度\')    (65, 48, 45, 36, 32, 32, 31, 30, 29, 29)    \'\'\'

词频可视化

使用 pyecharts 绘制可视化大屏图展示如下:

图片

评分可视化

我们使用 Pandas 提取手机评分数据以及频率,数据可视化展示如下:

从图中可以非常直观的看出苹果 12 的受欢迎程度。

# 划分价格区间rcv_data[\'手机评分\'] = pd.cut(rcv_data[\'手机评分\'], [0, 1, 2, 5], labels=[\'差评\', \'中评\', \'好评\'])# 统计数量stars = rcv_data[\'手机评分\'].value_counts()stars1 = stars.index.tolist()  # 人气值分类stars2 = stars.tolist()   # 人气值分类对应数量\'\'\'[\'好评\', \'差评\', \'中评\'][308, 9, 2]\'\'\'

在这里插入图片描述

购机时间可视化

我们爬取的数据都是在 2021 年,接下来我们提取事件中的月份数据,

来看看大家普遍的下单时间集中在哪几个月份?

    # 提取时间月份    rcv_data[\'评论时间\'] = rcv_data[\'评论时间\'].map(lambda x: x.split(\'-\')[1])    rcv_data[\'评论时间\'] = pd.cut(rcv_data[\'评论时间\'], [\'00\', \'01\', \'02\', \'03\', \'04\', \'05\', \'06\', \'07\', \'08\', \'09\'], labels=[\'一月\', \'二月\', \'三月\', \'四月\', \'五月\', \'六月\', \'七月\', \'八月\', \'九月\'])    # 统计数量    dates = rcv_data[\'评论时间\'].value_counts()    dates1 = dates.index.tolist()  # 月份分类    dates2 = dates.tolist()  # 月份分类对应数量    \'\'\'    [\'六月\', \'三月\', \'四月\', \'九月\', \'二月\', \'七月\', \'一月\', \'五月\', \'八月\']    [95, 66, 34, 33, 22, 20, 18, 16, 15]    \'\'\'

从图中可以很直观的看到大家的下单日期大多集中在六月份。年终奖 6 月发吗?

在这里插入图片描述

内存大小可视化

接下来我们对手机内存进行可视化分析,看看大家喜欢的内存是多大?

    storage = rcv_data[\'手机内存\'].value_counts()    storage1 = storage.index.tolist()  # 内存种类    storage2 = storage.tolist()  # 内存种类对应数量    \'\'\'    [\'128G\', \'256G\', \'64G\']    [221, 81, 18]    \'\'\'

64 太小,256 浪费。128G 才是真爱啊!

在这里插入图片描述

手机颜色可视化

关于 iPhone 的颜色,哪一种最受欢迎呢?

    # 颜色分布    rcv_datas = rcv_data[rcv_data[\'手机颜色\'].str.len()==2]    colors = rcv_datas[\'手机颜色\'].value_counts()    colors1 = colors.index.tolist()  # 内存种类    colors2 = colors.tolist()  # 内存种类对应数量    \'\'\'    [\'白色\', \'黑色\', \'红色\', \'绿色\', \'蓝色\', \'紫色\']    [73, 56, 31, 30, 23, 15]    \'\'\'

通过下图看出,大众选择都是喜欢白色的。相反紫色是最不容易撞衫的。

在这里插入图片描述

通过上面两个案例的学习,相信你已经可以独立创建一个 Scrapy 项目并使用此框架进行简单的爬虫项目编写并且可视化展示。

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

免责声明: 1、本站信息来自网络,版权争议与本站无关 2、本站所有主题由该帖子作者发表,该帖子作者与本站享有帖子相关版权 3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和本站的同意 4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责 5、用户所发布的一切软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 6、您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 7、请支持正版软件、得到更好的正版服务。 8、如有侵权请立即告知本站(邮箱:1099252741@qq.com,备用微信:1099252741),本站将及时予与删除 9、本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章和视频仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。