效果

输入要爬取的视频的BV号即可爬取该视频的弹幕。

过程

基本思路

基本的思路很简单,还是老步骤:

1、构造爬取的url

2、解析返回的数据

3、使用json或Xpath或正则表达式提取数据

4、保存数据

寻找url地址

第一步

刚开始还是从网页版中寻找url地址,结果请求很多,找了半天也没有找到

第二步

于是我们可以访问一下手机版的页面,而根据常识,弹幕这种东西一般是通过ajax来请求的,所以我们过滤一下,只看异步请求。

此时请求就变得少了很多,但是依然没有找到我们需要的弹幕数据,此时才发现我们并没有点击播放视频。

第三步

弹幕是在视频播放的过程中播放的,理所当然只有当我们播放视频并且打开弹幕后才会请求弹幕的数据,我们点击播放。

点击播放后我们可以发现请求变多了,再次寻找我们发现 168881748.xml 请求的地址便是弹幕数据了。

第四步

到这里我们就想到了,这种地址是怎么请求的呢?不同的视频请求的地址肯定是不一样的,应该是js生成的吧!现在我们来搜索一下该文件名``168881748`

很显然这是构造出来的地址,我们点进去看一下

不出所料是js构成的请求地址,我们可以发现这便是页面的数据,我们进一步去验证一下,刷新页面,查看一下网页的数据。

果然在该页面的文档中我们找到了

现在的思路

现在思路就很清晰了

1、通过视频url获取弹幕文件url

2、爬取弹幕文件url

3、提取数据

代码实现

# coding=utf-8
import requests
from lxml import etree
import re
class BiliSpider:
def __init__(self,BV):
# 构造要爬取的视频url地址
self.BVurl = "https://m.bilibili.com/video/"+BV
self.headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Mobile Safari/537.36"} # 弹幕都是在一个url请求中,该url请求在视频url的js脚本中构造
def getXml_url(self):
# 获取该视频网页的内容
response = requests.get(self.BVurl, headers = self.headers)
html_str = response.content.decode()
# 使用正则找出该弹幕地址
# 格式为:https://comment.bilibili.com/168087953.xml
# 我们分隔出的是地址中的弹幕文件名,即 168087953
getWord_url = re.findall(" '//comment.bilibili.com/'+ (.*) +'.xml',", html_str)
getWord_url = getWord_url[0].replace("+","").replace(" ","")
# 组装成要请求的xml地址
xml_url = "https://comment.bilibili.com/{}.xml".format(getWord_url)
return xml_url # Xpath不能解析指明编码格式的字符串,所以此处我们不解码,还是二进制文本
def parse_url(self,url):
response = requests.get(url,headers = self.headers)
return response.content # 弹幕包含在xml中的<d></d>中,取出即可
def get_word_list(self,str):
html = etree.HTML(str)
word_list = html.xpath("//d/text()")
return word_list def run(self):
# 1.根据BV号获取弹幕的地址
start_url = self.getXml_url()
# 2.请求并解析数据
xml_str = self.parse_url(start_url)
word_list = self.get_word_list(xml_str)
# 3.打印
for word in word_list:
print(word) if __name__ == '__main__':
BVName = input("请输入要爬取的视频的BV号:")
spider = BiliSpider(BVName)
spider.run()

这里只打印了弹幕,并没有保存,可以根据自己的需求进行更改!

手把手教你爬取B站弹幕!的更多相关文章

  1. Java爬取B站弹幕 —— Python云图Wordcloud生成弹幕词云

    一 . Java爬取B站弹幕 弹幕的存储位置 如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号, ...

  2. 萌新学习Python爬取B站弹幕+R语言分词demo说明

    代码地址如下:http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样 ...

  3. 爬取B站弹幕并且制作词云

    目录 爬取弹幕 1. 从手机端口进入网页爬取找到接口 2.代码 制作词云 1.文件读取 2.代码 爬取弹幕 1. 从手机端口进入网页爬取找到接口 2.代码 import requests from l ...

  4. Python爬取b站任意up主所有视频弹幕

    爬取b站弹幕并不困难.要得到up主所有视频弹幕,我们首先进入up主视频页面,即https://space.bilibili.com/id号/video这个页面.按F12打开开发者菜单,刷新一下,在ne ...

  5. Python爬取B站耗子尾汁、不讲武德出处的视频弹幕

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前言 耗子喂汁是什么意思什么梗呢?可能很多人不知道,这个梗是出自马保国,经常上网的人可能听说过这个 ...

  6. 用Python爬取B站、腾讯视频、爱奇艺和芒果TV视频弹幕!

    众所周知,弹幕,即在网络上观看视频时弹出的评论性字幕.不知道大家看视频的时候会不会点开弹幕,于我而言,弹幕是视频内容的良好补充,是一个组织良好的评论序列.通过分析弹幕,我们可以快速洞察广大观众对于视频 ...

  7. Python爬取B站视频信息

    该文内容已失效,现已实现scrapy+scrapy-splash来爬取该网站视频及用户信息,由于B站的反爬封IP,以及网上的免费代理IP绝大部分失效,无法实现一个可靠的IP代理池,免费代理网站又是各种 ...

  8. 爬虫练习四:爬取b站番剧字幕

    由于个人经常在空闲时间在b站看些小视频欢乐一下,这次就想到了爬取b站视频的弹幕. 这里就以番剧<我的妹妹不可能那么可爱>第一季为例,抓取这一番剧每一话对应的弹幕. 1. 分析页面 这部番剧 ...

  9. Python 网络爬虫实战:爬取 B站《全职高手》20万条评论数据

    本周我们的目标是:B站(哔哩哔哩弹幕网 https://www.bilibili.com )视频评论数据. 我们都知道,B站有很多号称“镇站之宝”的视频,拥有着数量极其恐怖的评论和弹幕.所以这次我们的 ...

随机推荐

  1. 剑指Offer-Python(21-25)

    21.栈的压入和弹出序列 新建一个栈,将数组A压入栈中,当栈顶元素等于数组B时,就将其出栈,当循环结束时,判断栈是否为空,若为空则返回true. class Solution: def IsPopOr ...

  2. django环境安装操作整理!

    1. Django 下载地址:https://www.djangoproject.com/download/ 注意:目前 Django 1.6.x 以上版本已经完全兼容 Python 3.x. 2.安 ...

  3. Docker学习—Machine

    前言 前面<Docker学习-Compose>文中介绍了Compose的使用方式:接下来继续了解docker三剑客之一的 Machine: 一.Docker Machine简介 1.什么是 ...

  4. 5. Spark调优

    *以下内容由<Spark快速大数据分析>整理所得. 读书笔记的第五部分是讲的是Spark调优相关的知识点. 一.并行度调优 二.序列化格式优化 三.内存管理优化 四.Spark SQL性能 ...

  5. MySQL全面瓦解11:子查询和组合查询

    概述 子查询是SQL查询中的重要一块,是我们基于多表之间进行数据聚合和判断的一种手段,使得我们的处理复杂数据更加的便捷,这一节我们主要来了解一下子查询. 先做一下数据准备,这边建立三张表:班级.学生. ...

  6. python菜鸟教程学习3:基础语法

    菜鸟教程对应网址:https://www.runoob.com/python3/python3-basic-syntax.html 编码:python3用UTF-8编码,所有字符串都是unicode字 ...

  7. 新手避坑 -- 用 Jenkins +miniprogram-ci 自动构建微信小程序

    先看看效果: 要实现这样的效果,需要下面3步: 1.下载 node 依赖包 miniprogram-ci,编写预览和上传功能 2. 登录微信公众平台, 下载项目的privateKey+添加代码上传IP ...

  8. 07 . 前端工程化(ES6模块化和webpack打包)

    模块化规范 传统开发模式主要问题 /* 1. 命名冲突 2. 文件依赖 */ 通过模块化解决上述问题 /* 模块化就是把单独的一个功能封装在一个模块(文件)中,模块之间相互隔离, 但是可以通过特定的接 ...

  9. html 小米商城导航栏示例

    1.小米导航栏示例 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...

  10. Java编译程序和运行过程详解

    java整个编译以及运行的过程相当繁琐,我就举一个简单的例子说明: 编译原理简单过程:词法分析 --> 语法分析 --> 语义分析和中间代码生成 --> 优化 --> 目标代码 ...