技术分享 | 基于 API 解析的 Python 爬虫

最近各大高校纷纷翻拍 Coincidence 抖肩舞,需要对这种流行现象进行数据分析。数据分析首先需要有数据,本文介绍了爬取 B 站相应视频的评论、弹幕、播放量、点赞数等数据的方法。爬虫有多种实现方法,大型的网络爬虫多基于成熟的爬虫框架(如:Scrapy 等)进行编写,代码量相对较大,且需要处理动态网页解析、应对反爬机制等,挑战较大。但如仅需爬取特定的网页数据,不要求动态更新,可以结合网页本身的特点,基于Requests请求和正则表达式即可快速获取需要的数据。本文以获取【中国人民大学抖肩舞】评论和监测数据为例,介绍基于 API 解析的数据爬取方法。

实验环境:chrome、python

一、实验原理介绍

首先简要介绍一下数据爬取的基本原理,浏览器打开一个网站,实际上是一个和网站服务器交互的过程,交互过程简要介绍如下:

  1. 浏览器从 URL 中获取 IP地址 和给定的端口号(HTTP 协议默认为端口 80,HTTPS 默认为端口 443),打开 TCP 连接,浏览器 和 服务器 建立连接;

  2. 浏览器向服务器发送 HTTP / HTTPS 请求,请求 URL 相应的页面 ;

  3. 服务器接收请求并查找相应 HTML 页面。如果页面存在,服务器 响应请求并将其发送回浏览器。如服务器找不到请求的页面,将发送一个 HTTP 404 错误消息,代表找不到页面;

  4. 浏览器接收到 HTML 页面,然后通过它从上到下解析寻找列出的其他资源,如图像,CSS 文件,JavaScript 文件等;

  5. 对于列出的每个资源,浏览器重复上述整个过程,向服务器发送 HTTP 请求;

  6. 浏览器完成加载 HTML 页面中列出的所有其他资源后,页面将最终加载到浏览器窗口中,且连接将被关闭。

待爬取的数据分为两种,一种是静态网页数据,这种数据隐藏在第 3 步请求得到的 HTML 中,我们只需通过 xpath、正则表达式等解析 HTML 网页抽取目标数据即可(注:静态网页数据可以通过鼠标右键 “显示网页源代码” ,如果在源代码里面找到目标数据,则为静态网页数据;如果未找到,则为动态网页数据);另外一种是动态网页数据,这种数据浏览器通过第 4 步解析需要的数据后,在第 5 步向服务器进行请求获取数据,这种请求大都被设计为 API( Application Programming Interface,应用程序编程接口 )供前端网页调用,动态网页数据获取可以采用多种方式解决,本文介绍的解析 API 模拟请求是其中一种。

我们想要获取的评论数据通过 B 站 主页即可得到,但是对于监测数据,由于 B 站只显示当前的播放量、点赞量等,无法获取历史数据,历史数据的获取需要每天爬取并存入数据库中,幸好找到记录历史数据的第三方网站:BiliOB观测者,可以通过该网站获取历史数据,监测和评论数据介绍如下:

  1. B 站视频监测数据获取:BiliOB观测者 是一个观测记录 B 站 UP主、视频历史数据的网站,可用于分析相关视频的历史数据,该网站数据为动态网页数据。

  2. B 站视频评论数据获取:评论数据在 B 站视频主页下方,评论数据也是动态网页数据。

本文待爬取的监测和评论数据均为动态网页数据,浏览器对于动态网页数据是通过 API 向服务器请求得到,我们是否可以使用 python 模拟请求获取我们想要的数据呢?答案是肯定的,这就是本文爬取数据的原理,第一步分析网页的 API 请求格式,第二步使用 python 利用同样的格式向服务器请求获取目标数据并保存下来即可。

二、分析目标网页

使用 chrome 浏览器进入 BiliOB观测者 网站,人大抖肩舞监测链接为:https://www.biliob.com/author/11746163/video/75694361,进入该页面之后,按 F12 进行 Chrome 浏览器的控制台,点击 Network,刷新监测网页加载过程,可以通过在 Filter 中输入 “api” 进行过滤,我们可以找到该网页发给向服务器 API 请求,如下图所示:

图片

上图中红框中即为请求目标数据的 API,在浏览器中输入该 API 请求,可以得到 Json 格式的目标数据,这里面包含了本视频的历史观测数据,如下图所示:

图片

至此,我们得到视频监测历史数据的 API,调用该 API 得到 Json 格式的目标数据,解析即可得到我们需要的数据,为了获取不同视频的监测数据,更换末尾的视频 ID 即可。

数据监测 API:https://www.biliob.com/api/video/ 75694361

接下来我们使用同样的方式进入 B 站【中国人民大学抖肩舞】的主页(https://www.bilibili.com/video/av75694361),找到视频评论所在区域,按 F12 进入 chrome 控制台,点击 Network ,刷新页面,可以看到所以的资源加载,由于该页面资源加载过多,难以定位目标 API ,可以在加载完成之后清除所以加载记录,然后点击网页中评论页面,仅重新加载评论区,即可定位的加载评论数据的 API,如图所示:

图片

可以看到,评论区数据获取的 API 较为复杂,API 请求为 https://api.bilibili.com/x/v2/reply ,后面的为 API 请求所带参数,完整的 API 请求如下所示:

https://api.bilibili.com/x/v2/reply?callback=jQuery172049692102912772707_1574524447296&jsonp=jsonp&pn=2&type=1&oid=75694361&sort=0&_=1574530129407

图片

容易知道部分参数的含义,pn 表示评论的页数、oid 表示视频的 ID,sort 表示评论的排序规则( 0 为按时间、2为按热度 ),其他参数意义不明,尝试仅使用已知含义的参数调用 API ,看能否成功获取数据,尝试成功,返回 Json 格式的数据,如图所示:

图片

经过尝试,我们得到成功调用 API 获取评论数据的最少参数格式为:pn、type、oid,以 Json 格式返回该页面的评论的数据。更改这几个参数的值即可获取相应视频对于页面的评论。

视频评论API:https://api.bilibili.com/x/v2/reply?pn=1&type=1&oid=75694361

图片

得到返回的 Json 文件后,使用 Ctrl + F(Mac 使用 Command + F),发现 “content”:{“message”:” 后面即为相应的评论文本,可以通过正则表达式方便抽取评论文本。

三、编写爬虫代码

第二节的分析,已经分析完爬虫解析数据的逻辑,爬取评论数据只需要循环更改 pn 的值,使用 requests 请求即可得到 Json 格式的目标数据,然后使用正则表达式抽取评论文本即可,有一点需要注意,代码中使用 time.sleep(0.5) 在每次请求前休眠 0.5 秒,避免访问频率过高,导致被服务器禁掉本 IP 的请求,爬取得到数据后,保存到本地文件中。代码如下:

import osimport reimport requestsimport mathimport jsonimport timeimport pandas as pd
schools = [    {"name": "中国人民大学", "aid": 75694361},]# 获取指定视频的评论def get_reply(aid):    # aid: URL中的视频的ID    reply_url = "https://api.bilibili.com/x/v2/reply"    replys = []    # 计算评论页数    req_json = requests.get("https://api.bilibili.com/x/v2/reply?pn=1&type=1&oid=" + aid).json()    page_json = req_json["data"]["page"]    page_num = math.ceil(page_json["count"] / page_json["size"])    # 获取所有评论    for i in range(page_num):        para = {'pn': str(i), 'type': '1', 'oid': aid}        time.sleep(0.5)        reply_str = requests.get(reply_url, para)        msgs = re.findall(r'\"content\":{\"message\":\"(.*?)\"', reply_str.text)        replys += msgs    return [r + "\n" for r in replys]# 爬取评论并保存数据def save_reply(schools):    for school in schools:        aid = school["aid"]        replys = get_reply(str(aid))        with open("./data/" + school["name"] + "_评论.txt", "w", encoding="utf-8") as f:            f.writelines(replys)        print(school["name"] + " 评论:爬取完成。")    return

接下来是获取监测数据的函数,模拟调用API的方式和上文类似,在解析完监测数据后,本函数使用 pandas 保存到 excel 文件中。

# 获取相应视频的监测数据def get_biliDB():    for school in schools:        name = school["name"]        aid = school["aid"]        biliDB_url = "https://www.biliob.com/api/video/"        time.sleep(0.5)        req_json = requests.get(biliDB_url + str(aid)).json()        try:            bilidb_data = [[0,0,0,0,0,0,None,req_json['datetime']]]            bilidb_data += [d.values() for d in req_json['data']]            df_bilidb = pd.DataFrame(bilidb_data, columns = ['view','favorite','danmaku','coin','share','like','dislike','datetime'])            df_bilidb = df_bilidb.sort_values(by='datetime')            df_bilidb = df_bilidb.reset_index(drop=True)            df_bilidb.to_excel("./data/监测_" + name + ".xlsx")        except:            print("数据爬取错误:" + name)    return

至此,已可成功获取人大抖肩舞的监测和评论数据,如果需要扩展到其他高校,仅需提供对应高校的视频 ID 即可。部分爬取数据如图所示:

图片

图片

总结

本文以爬取 B 站数据为案例,介绍了基于 API 解析爬取动态网页数据的原理和技巧,使用 Chrome 分析得到动态数据的 API,然后使用 Python 获取相应数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/356207.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud 基于Nacos和Eureka 实现双注册双订阅

一、使用场景/原因 过渡期迁移: 当系统从一个服务注册中心迁移到另一个时,例如从 Eureka 迁移到 Nacos,可以在过渡期内同时使用两个注册中心,确保服务平稳迁移,逐步过渡,避免一次性切换带来的风险。 兼容性考虑: 不同的…

这款跨界的软件也是非常强大!更快, 更轻, 更丝滑!

在网络世界中,一个好的浏览器就像一艘快速的帆船,帮助我们更快地到达目的地。迅雷浏览器正是这样一艘帆船,它不仅能够快速地带领我们浏览信息,还能提供安全的下载体验,让我们的网络生活更加丰富多彩。 迅雷浏览器&…

Python | Leetcode Python题解之第172题阶乘后的零

题目: 题解: class Solution:def trailingZeroes(self, n: int) -> int:ans 0while n:n // 5ans nreturn ans

AI播客下载:Machine Learning Street Talk(AI机器学习)

该频道由 Tim Scarfe 博士、Yannic Kilcher 博士和 Keith Duggar 博士管理。 他们做了出色的工作,对每个节目进行了彻底的研究,并与机器学习行业中一些受过最高教育、最全面的嘉宾进行了双向对话。 每一集都会教授一些新内容,并且提供未经过滤…

VMware Workstation安装Windows Server2019系统详细操作步骤

虚拟机版本 VMware Workstation 16 Prp 16.2.5 build-20904516 实现操作 创建虚拟机 创建新的虚拟机 自定义->下一步 默认即可,下一步 稍后安装操作系统->下一步 按照图下所示选择好系统->下一步 设置好虚拟机名称和位置->下一步 默认即可&#xff0…

基于uni-app和图鸟UI的智慧农业综合管控平台小程序技术实践

摘要: 随着信息化技术的飞速发展,智慧农业已成为推动农业现代化、提升农业生产效率的重要手段。本文介绍了一款基于uni-app框架和图鸟UI设计的智慧农业综合管控平台小程序,该平台整合了传感器控制、农业数据监测、设施管控、农业新闻传播以及…

Qt源码阅读笔记:初步了解QtCore模块目录结构

Qt框架是一个跨平台的C应用程序框架,广泛用于开发图形用户界面程序以及用于无界面后台操作的工具和服务器。它由多个模块组成,其中QtCore模块提供了核心的非GUI功能。 QtCore 提供了元对象系统,扩展了c 在元对象系统的基础上,qt又…

Redis—Hash数据类型及其常用命令详解

文章目录 Redis概述Hash类型Hash类型常用命令1 HSET:添加或者修改hash类型key的field的值2 HGET :获取一个hash类型key的field的值3 HMSET:批量添加多个hash类型key的field的值4 HMGET:批量获取多个hash类型key的field的值5 HGETA…

Windows11 24H2网络功能全新升级:全面支持Wi-Fi 7!

Windows11 24H2版本不仅推出了很多新功能,也全面升级了网络功能,全面支持Wi-Fi 7,带给用户最快的网速体验,还支持用户通过二维码分享Wi-Fi密码,操作更加便捷,也更新了SMB、LAPS和NDR协议。接下来跟随小编去…

MongoDB和AI 赋能行业应用:零售

欢迎阅读“MongoDB 和 AI 赋能行业应用”系列的第三篇。 本系列重点介绍 AI 应用于不同行业的关键用例,涵盖制造业和汽车行业、金融服务、零售、电信和媒体、保险以及医疗保健行业。 利用生成式 AI 技术(Gen AI),零售商可以创造…

BGP路由反射器实验

实验内容: 通过本实验验证bgp路由反射器的规则 1. 从client收到的路由更新,反射到non-client和client,同时发送给EBGP邻居 2. 从non-client收到的路由更新,只反射到client,同时发送给EBGP邻居 3. 从EBGP邻居收到的路…

通信系统概述

1.定义 通信系统(也称为通信网络)是利用各种通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,依靠网络软件及通信协议实现资源共享和信息传递的系统。 2.概述 随着通信技术和网络技术的不断发展&#xff…

ai绘画软件排行有哪些?介绍四款绘画软件

ai绘画软件排行有哪些?随着人工智能技术的飞速发展,AI绘画软件已经成为艺术创作领域的一股新势力。它们不仅极大地提高了绘画的效率,还为艺术家们带来了前所未有的创作灵感。在众多AI绘画软件中,聪明灵犀凭借其强大的功能和广泛的…

数据采集与预处理复习资料

目录 第一章 简答 1.简述Hadoop各个组件及其功能 2.Hadoop在大数据技术体系中的地位和作用(来自文心一言) 3.Hadoop 启动命令,停止命令 4.pig 加载HDFS 数据 5.数据采集的方法(来自ppt) 6.数据分析过程&#xf…

计算机网络 MAC地址表管理

一、理论知识 1.MAC地址表:交换机使用MAC地址表来记录各MAC地址对应的端口,用于帧转发的目的。 2.老化机制:交换机会为每一条MAC地址表项设置老化时间,老化时间到期后未收到该MAC地址报文的表项将被删除,释放资源。 …

【odoo】常用的基本视图类型

概要 在Odoo中,有几种基本视图类型,每种视图类型用于不同的目的和场景。这些视图类型包括表单视图(form view)、树视图(tree view)、看板视图(kanban view)、图表视图(gr…

数据库新技术【分布式数据库】

文章目录 第一章 概述1.1 基本概念1.1.1 分布式数据库1.1.2 数据管理的透明性1.1.3 可靠性1.1.4 分布式数据库与集中式数据库的区别 1.2 体系结构1.3 全局目录1.4 关系代数1.4.1 基操1.4.2 关系表达式1.4.3 查询树 第二章 分布式数据库的设计2.1 设计策略2.2 分布设计的目标2.3…

动手学深度学习(Pytorch版)代码实践 -深度学习基础-13Kaggle竞赛:2020加州房价预测

13Kaggle竞赛:2020加州房价预测 # 导入所需的库 import numpy as np import pandas as pd import torch import hashlib import os import tarfile import zipfile import requests from torch import nn from d2l import torch as d2l# 读取训练和测试数据 train_…

C#调用OpenCvSharp实现图像的直方图均衡化

本文学习基于OpenCvSharp的直方图均衡化处理方式,并使用SkiaSharp绘制相关图形。直方图均衡化是一种图像处理方法,针对偏亮或偏暗的图像,通过调整图像的像素值来增强图像对比度,详细原理及介绍见参考文献1-4。   直方图均衡化第…

【单片机】Code Composer Studio Linux版本下载,CCS开发环境

被windows的驱动兼容性搞得烦死了,我直接搞虚拟机用linux版本的ccs尝试一下。 下载: https://www.ti.com/tool/download/CCSTUDIO ubuntu22 虚拟机内,安装一些依赖: 安装libc6-i386库: 运行以下命令来安装libc6-i38…