精华内容
下载资源
问答
  • 主要介绍了Python爬虫 bilibili视频弹幕提取过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 我最近一直在研究西瓜弹幕提取的方案,之前的方案是利用网页版西瓜直播提取的弹幕。 不能提取礼物,和关注等信息。后来慢慢接触知道了如何使用协议。 首先我安装了一个西瓜视频app,通过fiddler抓包工具抓取了...

    我最近一直在研究西瓜弹幕提取的方案,之前的方案是利用网页版西瓜直播提取的弹幕。

    不能提取礼物,和关注等信息。后来慢慢接触知道了如何使用协议。

    首先我安装了一个西瓜视频app,通过fiddler抓包工具抓取了https的代码。

    需要注册的是要抓取手机的app https的包,必须在官网下载一个工具,重新生成一个证书cer,不这样做的话手机app是没有网络的。

    一切搞定之后,我尝试抓取西瓜直播弹幕的包。

            url = "https://webcast3-normal-c-lf.ixigua.com/webcast/room/" + str(rommid) + "/_fetch_message_polling/?webcast_sdk_version=1780&webcast_language=zh&webcast_locale=zh_CN_%23Hans&webcast_gps_access=1&current_network_quality_info=%7B%7D&iid=527406001831240&device_id=" + self.device_id +  \
                "&ac=wifi&mac_address="+self.mac_address+\
                "&channel=zhibo_wap&aid=32&app_name=video_article&version_code=924&version_name=9.2.4&device_platform=android&ab_version=668852%2C668853%2C668858%2C668851%2C668859%2C668856%2C2161636%2C668855%2C2229375%2C1477979%2C994679%2C668854%2C2220175&ssmix=a"+\
                "&device_type="+self.device_type+\
                    "&device_brand="+self.device_brand+\
                        "&language=zh&os_api=25&os_version=7.1.2&openudid="+self.uuid_str+\
                            "&manifest_version_code=524&resolution=590*720&dpi=160&update_version_code=92409&_rticket="+self._rticket+\
                            "&cdid_ts="+self.cdid_ts+\
                                "&tma_jssdk_version=1830001&rom_version=android_x86_64-userdebug+7.1.2+N2G48H+eng.lh.20191021.112421+test-keys&cdid="+self.cdid

    网址大约如上所示。

    上传的数据位

            post_data = "internal_ext=fetch_time%3A1606966469869%7Cstart_time%3A0%7Cfetch_id%3A6901868425828645213%7Cflag%3A0%7Cseq%3A16%7Cnext_cursor%3A1606966469869_6901868430123612514_1_1&live_id=3&parse_cnt=2&recv_cnt=2&cursor=1606966469869_6901868430123612514_1_1&last_rtt=59&identity=audience&resp_content_type=protobuf&user_id=0"
    

    其中有一个很关键的代码resp_content_type=protobuf

    这是什么意思呢?意思就是你接收的代码是通过protobuf 这个工具来解包的。不然你看到的就是一群乱码。根本不了解是什么意思。

    然后我通过百度学习protobuf的使用方法,方法很多,关于py的就比较少了。

    不过这些都不重要。重要的是,我后来在github发现了一个免费的西瓜直播弹幕开源项目

    https://github.com/q792602257/XiguaLiveDanmakuHelper

    当然你还是要知道protobuf 是如何工作的。

    直接通过protobuf 解包,之后的代码大概是这样子的。

    经过和大神沟通,他告诉我,要解2次包,第一次解包之后,在项目下面,还需要解包第二次。

    大神有写号的项目,我就直接拿来用了。并没有仔细去分析,如何解包。或者他的数据结构。

    因为这是protobuf 的特点。只要你知道了protobuf的数据结构,生成了一个文件XiguaUser.proto。那么你可以直接拿来用了。除非协议变了,你需要重新解包,维护这个文件XiguaUser.proto

    我写了一部分注释,大家可以稍微理解一下。

    syntax = "proto2";//协议版本,现在出了3
    
    message UserPack {
    	required User user = 1;//必要字段,user
    }
    // 头衔
    message Badge {
    	message FanClubText {//信息名称
    		required string text = 1;必要字段
    		optional string color = 2;//可选字段,有可能没有
    		required int32 level = 3;
    	}
    	repeated string url = 1;
    //	optional string localUrl = 2;
    	optional int32 height = 3;
    	optional int32 width = 4;
    	// 3 房管
    	// 6 贵族
    	// 7 粉丝团
    	optional int32 type = 6;
    	optional string clickTo = 7;
    	optional FanClubText fanClubText = 8;
    }
    message FansClubPack {
    	message FansClub {
    		required string title = 1 [default = ''];
    		required int32 level = 2 [default = 0];
    		optional int32 someEnum = 3;
    	}
    	required FansClub fansClub = 1;
    }
    // 用户信息
    message User {
    	// 头像
    	message Avatar {
    		required string url = 1;
    		optional string id = 2;
    	}
    	// 粉丝和粉
    	message Follow {
    		optional int32 following = 1 [default = 0];
    		optional int32 follower = 2 [default = 0];
    	}
    	// 花钱等级
    	message PayGrade {
    		required int32 current = 1;
    		required int32 level = 6;
    		optional int32 currentLevelNeed = 10;
    		optional int32 nextLevelNeed = 11;
    		optional string content = 13;
    		required Badge badge = 19;
    		optional int32 toNextLevelNeed = 21;
    	}
    	// 荣誉等级
    	message HonorLevel {
    		required Badge badge = 19;
    	}
    	// 贵族
    	message Noble {
    		message NobleBoarder {
    			repeated string urlList = 1;
    			required string uri = 2;
    			optional int32 height = 3;
    			optional int32 width = 4;
    		}
    		required string content = 4;
    		optional NobleBoarder boarder = 8;
    	}
    	required int64 id = 1;
    	required string nickname = 3;
    	required int32 gender = 4;
    	// 这个顺序可能有点迷,不是很清楚
    	required Avatar avatarThumb = 9;
    	optional Avatar avatarMedium = 10;
    	optional Avatar avatarLarge = 11;
    	repeated Badge badge = 21;
    	optional Follow follow = 22;
    	required PayGrade payGrade = 23;
    	required FansClubPack fansClub = 24;
    	required int32 totalPaid = 34;
    }

    我需要的字段内容不是很多,能够知道礼物信息,弹幕和关注就行了。

    如有需要可以自己分析一下。

    总之我根据大神提供的部分代码,帮他维护了一下github,现在程序能够执行播报弹幕和礼物了。

    也给大家想学习协议的朋友们提供一个思路。(大神的代码,我好多看不懂,我是用我自己理解的方案写的程序。)

    https://github.com/shuishen49/xiguadanmu

    因为大神公布了源代码,我就不公布我自己的源代码了。我编译好了,可以直接下载执行。是免费使用的。

    需要注意的是填入的房间号码必须是真实的房间号码,不是缩写。

    比如像是这样。

    https://live.ixigua.com/room/6905678071718742791/

    20位数字的房间号码,你可以通过西瓜视频直播,搜索自己的名字得到。

    如果有不懂的同学可以在下面留言或者加入讨论组。

    展开全文
  • 1.1腾讯视频弹幕提取并制作关键词云1:弹幕在哪里 1.2腾讯视频弹幕提取并制作关键词云2:scrapy弹幕的获取 1.3企鹅弹幕提取并制作关键词云3:自动爬取全集+sql数据库写入 1.4企鹅弹幕提取并制作关键词云4:jieba分词...

    -无业游民找工作莫得结果的第十四天,继续人间小苦瓜和关键词云的爱恨情仇
    快速指路:
    1.1腾讯视频弹幕提取并制作关键词云1:弹幕在哪里
    1.2腾讯视频弹幕提取并制作关键词云2:scrapy弹幕的获取
    1.3企鹅弹幕提取并制作关键词云3:自动爬取全集+sql数据库写入
    1.4企鹅弹幕提取并制作关键词云4:jieba分词+collections词频统计+wordcloud制作关键词云
    写完代码好几天了,但是这几天真的好累好懒。
    本篇用到的库如下:

    import jieba #jieba分词
    import collections #词频统计库
    import numpy
    import wordcloud #词云展示库
    from PIL import Image #图像处理库
    import matplotlib.pyplot as plt #图像处理库
    

    1.4.1jieba分词
    调用python中的jieba库对句子进行分词操作。jieba 是目前最好的 Python 中文分词组件,它有多重分词的模式,可以通过不同的需求和效果调用不同的函数。同时jieba还可以添加自定义库。比如我是用小欢喜的弹幕进行处理的,词典中我会提前将演员的名字,人物的名字,还有剧中可能会出现的词语等等。这个词典需要经过反复的测试,通过分词的效果来看是否要添加新的字。
    词典的格式:一行一个:

    小欢喜
    黄磊
    方圆
    海清
    童文洁
    陶虹
    宋倩
    王砚辉
    季胜利
    

    利用jieba分词:

     jieba.load_userdict("F:\danmu_process\dic_xiaohuanxi.txt") #载入自建jieba字典
     result_4=jieba.cut(result_2,cut_all=False)#jieba分词
    

    1.4.2collections统计
    在用jieba分词之后,就可以调用collections库来统计词语出现的次数了。
    我们会发现分词的结果存在着特殊字符或者我们不想要的字词等,在用collections统计的时候,我们可以添加一个list存储我们不想被统计的字词等:

    remove_words=[u'的',u'是',u'就',u'我',u'了',u'来',u'啊',u'这',u'吗',u'像',u'那',u'跟',u'呢',u'吧',u'都',
    			  u'你',u'也',u'还',u'呀','怎么','说','在','他','又','两',
    			  '.',' ',',','。','~','?','!','[',',',']','\\',':','...','…','~',
    			  '1','6',
    			  'xa0','😂','😭','👏'] #自定义去除字库
    for word in result_4:
    	if word not in remove_words: #如果觉得单字没有意义的话,可以再添加len(word)>1来只统计2个字以上的词语
    		 word_list.append(word)
    #统计词频率
    word_counts=collections.Counter(word_list)
    word_counts_top=word_counts.most_common(100)
    

    1.4.3 wordcloud词云生成
    接下来就是词云生成和展示的部分了:
    wordcloud生成词云,通过调用matplotlib进行图像处理。wordcloud还能根据自定义背景图案更改字的颜色。

     mask=numpy.array(Image.open("F:\\danmu_process\\background.jpg"))
     wc=wordcloud.WordCloud(
                font_path='C:\\Windows\\Fonts\\simhei.ttf',#设置字体格式
                mask=mask,#设置背景图
                max_words=75,#最多显示词数
                max_font_size=110, #字体最大值
                background_color='white',
                prefer_horizontal=0.9#默认就是0.9,可以不写。如果要全部横向显示,就写=1
            )
    
    #从字典生成词云
    wc.generate_from_frequencies(word_counts)
    #颜色方案建立
    image_colors=wordcloud.ImageColorGenerator(mask)
    #将词云颜色设置为背景图方案
    wc.recolor(color_func=image_colors)
    #显示词云
    plt.imshow(wc)
    #关闭坐标轴
    plt.axis('off')
    #显示
    plt.show()
    

    选择的背景图案:
    在这里插入图片描述1.4.4最后的效果展示:
    在这里插入图片描述1.4.6 巴拉巴拉
    弹幕爬取和弹幕词云的简单制作就告一段落了。发现写博客也算是复习了一波了。以前写的代码用完了也就完事了,到最后变成代码每年的量也挺多,但是回忆起来又觉得好像也没做啥。还是得努力找工作啊害。白白。

    展开全文
  • 1.1腾讯视频弹幕提取并制作关键词云1:弹幕在哪里 1.2企鹅视频弹幕提取并制作关键词云2:scrapy弹幕的获取 1.3企鹅弹幕提取并制作关键词云3:自动爬取全集+sql数据库写入 1.3 scrapy爬取弹幕 爬取弹幕的部分在这一...

    -无业游民找工作莫得结果的第七天,继续人间小苦瓜和关键词云的爱恨情仇
    快速指路:
    1.1腾讯视频弹幕提取并制作关键词云1:弹幕在哪里
    1.2腾讯视频弹幕提取并制作关键词云2:scrapy弹幕的获取
    1.3企鹅弹幕提取并制作关键词云3:自动爬取全集+sql数据库写入
    1.4企鹅弹幕提取并制作关键词云4:jieba分词+collections词频统计+wordcloud制作关键词云

    1.3 scrapy爬取弹幕
    爬取弹幕的部分在这一小节基本可以结束了。主要是对之前的代码进行修正和添加了SQL代码(真的是毕业之后就再也没用过数据库,语法都忘了好多。为了CDA的考试,就链接一下数据库吧。)
    1.3.1 连续爬取一个视频的弹幕
    如果需要爬取一集内的所有弹幕,就需要对timestamp进行一直叠加,直到返回的信息中“”count=0“”。
    使用yield+用真循环。(停止条件需要放在处理response的函数中。自行补充XXXXX中的网址)

            while True:
                url = "https://XXXXXXXXX&timestamp={}".format(timestamp)
                yield scrapy.Request(url,callback=self.parse)
                timestamp=timestamp+15
    

    yield:生成器
    生成器是一个不断产生值的函数;一般和for循环配合使用。生成器每产生一个值(yield),当前函数冻结,值被保留,等待下一次调用之后再产生新的值。
    {}.format(timestamp)
    用timestamp的值来填充{}内的值。

    1.3.2 如何停止爬虫
    因为当前爬虫停止的条件是需要根据response的内容来判断的,因此用真的条件中无法有判断停止。
    为此我找了很多办法,比如直接退出python程序等,但是效果都不好。在查找了多个资料资料之后,在巨人1的肩膀上发现了停止spider的办法。即在parse()函数中停止spider的代码如下:

    from scrapy.exceptions import CloseSpider
    def parse(self, response):
    	if count==0:
    		raise CloseSpider('close it')
    

    在这里只截取关于本爬虫使用的方法介绍,更多的办法可以查看Reference中巨人1的肩膀。
    特点:发送此信号的时候,实际上还有一些在列队中的url,需要完成才会停止。类似当运行的时候,使用ctrl c停止一样。

    1.3.3 写入数据库
    连接的数据库:sqlserver
    python连接数据库使用的库为:pymssql
    我目前为止直接去了四个值存入数据库:commentid,content,opername,uservip_degree

    import pymssql #导入库
    connect = pymssql.connect('localhost', 'sa', '**', 'danmu')  # 服务器名,账户,密码,数据库名
    cs1=connect.cursor() #获取cursor对象
    #因为需要根据response的内容进行补全valuse中的值,需要使用%s
    query='INSERT INTO danmu_IF (commentid,content,opername,uservip_degree) VALUES(%s,%s,%s,%s)'
    

    接下来的我们需要对json文件进行逐行读取,然后再加入数据库中,因此真正构建sql的insert语句需要放在json的for循环中。

    1.3.4 json类型循环逐行读取

    for danmu_1 in danmu["comments"]:
    	commentid=danmu_1["commentid"]
    	content=danmu_1["content"]
    	opername=danmu_1["opername"]
    	#valus值构成
    	values=(commentid,content,opername,uservip_degree)
    	#生成sql语句
    	cs1.execute(query,values)
    	#提交之前的操作,如果之前已经执行多次的execute,那么就都进行提交
    	connect.commit()
    

    1.3.5 关闭sql语句

     # 关闭cursor对象
     cs1.close()
     # 关闭connection对象
     conn.close()
    

    结果展示:
    在这里插入图片描述一共是截取到了33517个弹幕,出现的情况:
    1.运行过程中有发现sql数据库的报错,怀疑可能的原因是因为弹幕中存在着不可识别的字符。
    2.发现关闭spider的时间会稍稍比yield生成器生成的慢一些些。怀疑是因为线程的原因。

    不过,不论如何,企鹅弹幕爬取就先告一段落啦。接下来就是弹幕云的制作了,继续摸索吧。革命尚未成功,同志仍需努力啊哭唧唧。

    备注一下今天用到的sql语句,真的是本科毕业之后就再也没用过sql了,研究生的论文为了少配置环境直接用了文本存储信息,为了CDA拼了老命害。

    /*删除表中的所有信息,且不做单独操作*/
    TRUNCATE TABLE danmu_IF  
    /*返回top100的内容*/
    SELECT TOP (100) [commentid]
          ,[content]
          ,[opername]
          ,[uservip_degree]
      FROM [danmu].[dbo].[danmu_IF] 
    

    Reference:
    巨人1的肩膀

    展开全文
  • 获取弹幕的url是以 .xml 结尾2.弹幕url的所需参数在视频url响应的 javascript 中先看代码import requestsfrom lxml import etreeimport re# 使用手机UAheaders = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone ...

    两个重要点

    1.获取弹幕的url是以 .xml 结尾

    2.弹幕url的所需参数在视频url响应的 javascript 中

    先看代码

    import requests

    from lxml import etree

    import re

    # 使用手机UA

    headers = {

    "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"

    }

    # 视频url

    video_url = "https://m.bilibili.com/video/av37834086.html"

    html = requests.get(url=video_url, headers=headers).content.decode('utf-8')

    # 获取弹幕url的参数

    cid = re.findall(r"comment: '//comment.bilibili.com/' \+ (.*?) \+ '.xml',", html)

    url = "https://comment.bilibili.com/" + cid[0] + ".xml"

    print(url)

    response = requests.get(url, headers=headers)

    html = response.content

    xml = etree.HTML(html)

    # 提取数据

    str_list = xml.xpath("//d/text()")

    # 写入文件

    with open('bibi_xuxubaobao.txt', 'w', encoding='utf-8') as f:

    for line in str_list:

    f.write(line)

    f.write('\n')

    先找到弹幕的url,以.xml结尾,所以先找到这串数字所在的位置,并获取这串数字发起第二次请求

    201973193056181.png?201963193129

    而这串数字就在 第一次请求的响应的JavaScript中,可以通过 re 正则表达式进行提取

    201973193056182.png?201963193129

    接下来的工作就是获取弹幕url返回的所有弹幕数据,然后对响应进行数据处理。

    代码示例中使用的是 lxml 进行获取。接着就是保存到个人本地文件中了

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • C# B站的弹幕提取

    2019-09-24 14:15:56
    要知道B站的弹幕位置 如果只考虑视频,B站的链接格式为:https://www.bilibili.com/video/av34042815。把av后面的数字看做是唯一标记即可。 既然能够把弹幕加载出来,那说明一定有相关的弹幕接口。这个时候需要...
  • -1.1 弹幕的获取 我用google浏览器打开了腾讯视频,然后选择了电视剧《小欢喜》第一集作为试验品。(对不起了TnT) 保持视频在后方播放的情况下,右键点开“检查”元素,选中“network”,command+f打开查找,输入一...
  • -无业游民找工作莫得结果的第四天,继续人间小苦瓜和关键词云的爱恨情仇 -1.2 scrapy爬取弹幕
  • 1.获取弹幕的url是以.xml结尾 2.弹幕url的所需参数在视频url响应的javascript中 先看代码 import requests from lxml import etree import re # 使用手机UA headers = { "User-Agent": "Mozilla/5.0 ...
  • 获取弹幕的url是以 .xml 结尾2.弹幕url的所需参数在视频url响应的 javascript 中先看代码import requestsfrom lxml import etreeimport re# 使用手机UAheaders = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone ...
  • 获取弹幕的url是以 .xml 结尾2.弹幕url的所需参数在视频url响应的 javascript 中先看代码importrequestsfrom lxml importetreeimportre#使用手机UAheaders ={"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_...
  • 微信收集消息 把发送到微信公众号的消息保存到数据库,并提取其中的弹幕,提供弹幕查询
  • 需要先登录,否则不能查看历史记录点击历史弹幕,有两个请求 包括弹幕id,返回的是所有的有弹幕的日期,格式为json 将timestamp提取出来拼接弹幕url,点击指定日期,显示弹幕的时候有dmroll请求,获取弹幕信息 返回xml格式...
  • 调用斗鱼API爬取直播间弹幕信息(用户昵称及弹幕内容)查看《斗鱼弹幕服务器第三方接入协议v1.4.1》,了解斗鱼API的使用方法,即如何连接斗鱼弹幕服务器、维持连接及获取弹幕信息Python调用斗鱼API爬取直播间弹幕...
  • B站弹幕提取 首先,通过b站网址,查看到《请回答1988》木鱼水心弹幕最多的一集,其URL如下: https://www.bilibili.com/video/BV1g7411d7v7?from=search&seid=4258323448425596581 通过b站的如下api接口,获取...
  • B站的视频弹幕由三层关键词可以锁定,第一层是检索的关键词,第二层是每个视频的bvid,第三曾是每个视频的oid,相关的获取API网上都有。 爬虫使用的是request,构建词云使用的wordCloud,中间还嵌套使用了正则、数据...
  • Android精选源码 一个样式众多功能多的标签布局源码 ...视频如何发射弹幕的源码 使用RecyclerView编写画廊效果 安卓巴士博客非官方客户端 颜色选择器,支持从图片中提取颜色 material design风...
  • 最近发现词云图挺有意思的,正好在家闲来无事,就尝试做了一下B站视频弹幕的词云,顺便重拾一下爬虫技能。寻找请求首先用Chrome随便打开一个视频开始抓包,猜测弹幕信息是通过Ajax请求得到的,选中XHR,很轻松就可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,890
精华内容 1,156
关键字:

弹幕提取