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

news2024/10/7 6:47:49

最近各大高校纷纷翻拍 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.coloradmin.cn/o/1847015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决数据丢失问题的MacOS 数据恢复方法

每个人都经历过 Mac 硬盘或 USB 驱动器、数码相机、SD/存储卡等数据丢失的情况。我们中的一些人可能认为已删除或格式化的数据将永远丢失,因此就此作罢。对于 macOS 用户来说,当文件被删除时,垃圾箱已被清空,他们可能不知道如何恢…

spring-gateway配置说明

在开发过程中遇到的一些配置问题,记录下来以供参考 spring-gateway版本是2.2.9-release,使用的spring cloud dependence 是 Hoxton.SR12 在依赖eureka 服务发现并自动将发现服务器加入到router中的时候,需要指定对应的服务进行添加,根据文档…

算法训练与程序竞赛题目集合(L3)

目录 L3-001 凑零钱 输入格式: 输出格式: 输入样例 1: 输出样例 1: 输入样例 2: 输出样例 2: L3-002 特殊堆栈 输入格式: 输出格式: 输入样例: 输出样例&…

伦敦银趋势线的有效性怎么验证?

怎么才能画出一根能发挥作用的趋势线呢?这是很多投资者追求的目标。其实要趋势线能发挥作用,我们在画它的时候就要进行一些验证,将通过了验证的趋势线保留下来,那些没通过的就删除,这样得到能发挥作用的趋势线的概率就…

Springboot 共享车位系统小程序-计算机毕设 附源码93439

Springboot 共享车位系统小程序 摘 要 在信息飞速发展的今天,网络已成为人们重要的信息交流平台。每天都有大量的农产品需要通过网络发布,为此,本人开发了一个基于springboot共享车位系统小程序。 对于本共享车位系统的设计来说,…

【深度学习驱动流体力学】剖析流体力学可视化paraview原理

目录 1.paraview版本2.配置过程检查插件库文件配置 ParaView 环境变量启动 ParaView 并检查插件3.可视化测试插件功能3.加载数据进行可视化第一步: 导入案例第二步:查看当前目录未更新前的内容第三步:使用 blockMesh 命令生成腔体案例的网格第四步:运行仿真icoFoam第五步:使用 …

牛拜克拉丝的wordpress免费企业模板

wordpress免费企业模板 挺简洁实用的wordpress免费企业模板,黄色模板搭建公司网站。 演示 https://www.wpniu.com/themes/40.html

E84-晶圆载具交接自动化

E84是一种通讯协议,它的核心作用在于为通讯传感器/设备的开发提供基础架构。 E84协议详细阐述了晶圆载具(如FOUP/POD等)在工厂自动化物料搬运系统(AMHS)与机台装载端口(LP)之间,如何…

X86+FPGA, NXP+FPGA:工控稳“固”之选 赋能CPCI/VPX智能轨交新变革

工业IPC在目前大时代背景下面临机遇,但挑战同样也不少。在轨道交通领域,工控机必须具备高可靠性和稳定性,能够在复杂且严苛的工作环境中长时间无故障运行;需要满足严格的实时性和响应性能要求,确保能够迅速准确地处理传感器信号和…

4K高质量视频素材库,剪辑必备

找免费4K 高质量视频素材,就上这8个网站,剪辑必备,赶紧收藏吧! 1、baotu 【实拍视频】免费下载_实拍视频素材​ibaotu.com/shipin/7-5026-0-0-0-1.html?spmzhkolws​编辑 国内高质量素材网站,涵盖设计、新媒体、视频…

语言模型测试系列【10】

一个巧合,又测到了新的区别,以下是关于python代码生成的测试效果。 语言模型 文心一言讯飞星火通义千问2.5豆包360智脑百小应腾讯元宝KimiC知道商量智谱清言 这次的测试问题来源于**智谱AI开放平台**的介绍,正好有个python生成的效果说明…

qt 一个可以拖拽的矩形

1.概要 2.代码 2.1 mycotrl.h #ifndef MYCOTRL_H #define MYCOTRL_H#include <QWidget> #include <QMouseEvent>class MyCotrl: public QWidget {Q_OBJECT public://MyCotrl();MyCotrl(QWidget *parent nullptr); protected:void paintEvent(QPaintEvent *even…

Offset Explorer 连接SASL PLAIN鉴权的Kafka

1、填写Kafka信息 2、配置鉴权信息 Security 选择 SASL PLAINTEXT JAAS Config 配置账号密码 org.apache.kafka.common.security.plain.PlainLoginModule required username"账号"password"密码";

交叉注意力一脚踹进医学图像分割!新成果精度、效率表现SOTA

为解决传统方法的局限性&#xff0c;研究者们提出了将交叉注意力机制应用于医学图像分割。 交叉注意力机制能更有效地整合来自不同模态/尺度的特征&#xff0c;让模型同时捕捉全局和局部信息&#xff0c;加速学习并减少干扰。这样不仅可以提高分割的精度&#xff0c;还可以减少…

deepin 加入甲辰计划,共建 RISC-V 繁荣生态

内容来源&#xff1a;deepin&#xff08;深度&#xff09;社区 今日&#xff0c;deepin(深度)社区宣布正式加入甲辰计划&#xff0c;致力于在下一个丙辰年&#xff08;2036龙年&#xff09;之前&#xff0c;基于RISC-V实现从数据中心到桌面办公、从移动穿戴到智能物联网全信息产…

基于DPU的云原生裸金属网络解决方案

1. 方案背景和挑战 裸金属服务器是云上资源的重要部分&#xff0c;其网络需要与云上的虚拟机和容器互在同一个VPC下&#xff0c;并且能够像容器和虚拟机一样使用云的网络功能和能力。 传统的裸金属服务器使用开源的 OpenStack Ironic 组件&#xff0c;配合 OpenStack Neutron…

Go语言开发框架GoFly已集成数据可视化大屏开发功能,让开发者只专注业务开发,本文指导大家如何使用

前言 框架提供数据大屏开发基础&#xff0c;是考虑当前市场软件应用有一大部分是需要把业务数据做出大屏&#xff0c;很多政府项目对大屏需求特别高&#xff0c;还有生产企业项目也对大屏有需求&#xff0c;没有提供基础规范的后台框架&#xff0c;在开发大屏需要很多时间去基…

MySQL数据库初体验+数据库管理(其一)

【1】 操作系统介绍&#xff1a; Linux操作系统有 RedHat CentOS Debian Ubuntu OpenSUSE 信创标准 国产系统 &#xff1a; 华为&#xff08;欧拉&#xff09; 阿里&#xff08;龙蜥&#xff09; 腾讯 &#xff08;tencentOS&#xff09; 麒麟&#xf…

媒体访谈 | 广告变现痛点有新解,俄罗斯市场成大热门?

今年一季度&#xff0c;中国自主研发游戏在海外市场实际销售收入达到了40.75亿美元&#xff0c;环比和同比均实现了超过5%的增长&#xff0c;出海&#xff0c;仍是游戏产品近些年来最主要的发展模式之一。 当今的市场环境正经历一系列深刻变革&#xff0c;移动游戏广告市场呈现…

npm语义化版本和版本运算符

版本号组成 一个完整的版本号&#xff0c;由三部分组成&#xff1a;主版本号&#xff08;major&#xff09;、次版本号(minor)、修订版本号(patch)&#xff0c;简称X.Y.Z&#xff0c;具体含义&#xff1a; 主版本号&#xff08;major&#xff09;&#xff1a;项目&#xff08…