精华内容
下载资源
问答
  • 写在前面今天和朋友唠嗑,说...于是就想着用python来试试爬取B站弹幕和三连了代码不废话了,先上代码:# 爬取B站弹幕import requestsimport timeimport jsonfrom lxml import etree# 放入要爬的url# 弹幕apiurl_b = ...

    写在前面

    今天和朋友唠嗑,说着说着说到了爬取B站弹幕和三连的事情。于是就想着用python来试试爬取B站的弹幕和三连了

    代码

    不废话了,先上代码:

    # 爬取B站弹幕

    import requests

    import time

    import json

    from lxml import etree

    # 放入要爬的url

    # 弹幕api

    url_b = "https://api.bilibili.com/x/v1/dm/list.so?oid=186339235"

    # 三连api

    url_state = "https://api.bilibili.com/x/web-interface/archive/stat?aid=925611776"

    # 设置header

    header = {"user-agent": "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) "

    + "AppleWebKit/537.36 (KHTML, like Gecko)"

    + " Chrome/80.0.3987.116 Mobile Safari/537.36"}

    # 获取信息

    try:

    # 延时操作,防止爬的太快

    time.sleep(0.5)

    response = requests.get(url_b, headers=header)

    except Exception as e:

    print(e)

    else:

    if response.status_code == 200:

    # 下载xml文件

    with open("bilibili.xml", 'wb') as f:

    f.write(response.content)

    # 解析网页

    time.sleep(1)

    # 文件路径,html解析器

    html = etree.parse('bilibili.xml', etree.HTMLParser())

    # xpath解析,获取当前所有的d标签

    results = html.xpath('//d//text()')

    i = 0

    sum_self = 0

    for result in results:

    sum_self = sum_self + 1

    if result.find("飞"):

    i = i+1

    print("总数为: %d 包含飞字的弹幕为:%d" % (sum_self, i))

    data_get = requests.get(url_state, headers=header)

    data_san = json.loads(data_get.content.decode())

    print("硬币为:%d" % data_san['data']['coin'])

    print("转发为: %d" % data_san['data']['share'])

    print("点赞为:%d" % data_san['data']['like'])

    这里关于找api的操作,可以自行用火狐或者谷歌的开发者模式去寻找。

    在这里由于B站的弹幕是用xml存的,且最大弹幕量是1000,即只爬了一千条弹幕。

    思路分析

    首先找一个B站视频,然后寻找弹幕和三连的API:

    1805770-20200520095606519-310273807.png

    首先发现了这个,阅读英文后发现明显就是三连的英文。

    就是简单的json格式,关于json格式的处理已经练习过嘞

    然后找弹幕,发现是xml文件:

    1805770-20200520095729656-1688094931.png

    观察结构可以发现弹幕都是在d标签里的。上次爬取论文的时候也用了类似的操作,我们直接读取d标签的内容即可。

    这里我们就用xpath来很方便的找到。关于xpath的语法等有空再开个博客写一写。

    结果

    1805770-20200520095833613-1968952181.png

    可以看到爬取B站弹幕和三连非常方便,也体会到了python在某些领域的优势。

    展开全文
  • 一、写在前面之前在简书首页看到了Python爬虫的介绍,于是就想着...关于环境的安装及调试过程中遇到的问题记录请移步二、Python爬取B站弹幕环境说明步骤说明安装python3.6安装scrapy1.4建立scrapy demo跑通demo遇到...

    一、写在前面

    之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样一个简单的尝试,从搭建环境到跑通demo,不懂语法,不知含义,装好环境,查到API,跑通Demo,就是目标!纯零基础萌新!

    关于环境的安装及调试过程中遇到的问题记录请移步

    二、Python爬取B站弹幕

    环境说明

    步骤说明

    安装python3.6

    安装scrapy1.4

    建立scrapy demo

    跑通demo遇到问题、解决问题

    更改demo为B站弹幕爬取demo

    我这边是按照参考文档中 scrapy爬虫框架入门实例这个demo来做的,这个文章里面无论是介绍还是scrapy的入门都非常详细,建议大家按照- 这个来入门,但是由于慕课网的结构样式以及更改了,所以demo是跑不起来的,因此我换成了爬取B站的弹幕demo。截止2017年9月2日亲测可跑通。

    Demo说明

    1. 安装scrapy成功之后建立项目scrapytest

    scrapy startproject scrapytest

    2. demo目录

    本demo目录仅保留当前demo可用的文件,且文件名字不同于scrapy自动生成的文件名字,对于未涉及到的文件进行了删除

    │ scrapy.cfg//项目的配置文件

    └─scrapytest

    │ CourseItems.py//定义一个容器保存要爬取的数据

    │ MyPipelines.py//项目中的pipelines文件.

    │ settings.py//项目中的设置文件.

    ├─spiders

    │ │ data.json//爬取数据生成的文件

    │ └─ Myspider.py//爬虫主代码

    3. demo代码

    创建CourseItems.py文件

    定义一个容器保存要爬取的数据。为了定义常用的输出数据,Scrapy提供了Item类。Item对象是种简单的容器,保存了爬取到得数据。 其提供了 类似于词典(dictionary-like)的API以及用于声明可用字段的简单语法。由于最后输出的只要弹幕的内容,所以容器中只定义了弹幕的内容

    #引入文件

    import scrapy

    class CourseItem(scrapy.Item):

    #弹幕内容

    content = scrapy.Field()

    编写爬取代码Myspider.py

    bilibili的弹幕是在xml文件里,每个视频都有其对应的cid和aid,我们取到cid中的数字放入http://comment.bilibili.com/+cid+.xml,即可得到该视频对应的cid。

    cid取法:cid在源码中是没有找到的,目前我的做法是在页面上F12,然后查找cid,该cid即为弹幕页的标识,如果有可以通过代码查到的方法,还请告知。目前例子中的cid有1000多条弹幕,建议大家换个少的进行测试。

    1240

    弹幕的xml文件结构非常简单,所以通过Xpath简单解析即可

    1240

    import scrapy

    #引入容器

    from scrapytest.CourseItems import CourseItem

    class Myspider(scrapy.Spider):

    #设置name

    name = "Myspider" //启动项目时所用name

    #设定域名

    allowed_domains = ["bilibili.com"]

    #填写爬取地址

    start_urls = ["http://comment.bilibili.com/2015358.xml"]

    #编写爬取方法

    def parse(self, response):

    #实例一个容器保存爬取的信息

    item = CourseItem()

    #这部分是爬取部分,使用xpath的方式选择信息,具体方法根据网页结构而定

    #直接爬取弹幕内容

    str0 = ''

    for box in response.xpath('/i/d/text()'):

    #获取每一条弹幕内容

    str0 += box.extract()+',';

    #返回信息

    item['content'] = str0;//最后输出的结构是值:字符串的结构,详细见输出图

    yield item

    编写MyPipelines.py处理数据

    当成功获取信息后,要进行信息的验证、储存等工作,这里只进行简单的将数据存储在json中的操作。

    #引入文件

    from scrapy.exceptions import DropItem

    import json

    class MyPipeline(object):

    def __init__(self):

    #打开文件

    self.file = open('data.json', 'w', encoding='utf-8')

    #该方法用于处理数据

    def process_item(self, item, spider):

    #读取item中的数据

    line = json.dumps(dict(item), ensure_ascii=False) + "\n"

    #写入文件

    self.file.write(line)

    #返回item

    return item

    #该方法在spider被开启时被调用。

    def open_spider(self, spider):

    pass

    #该方法在spider被关闭时被调用。

    def close_spider(self, spider):

    pass

    注册Pipeline

    找到settings.py文件,这个文件时爬虫的配置文件,在其中添加

    ITEM_PIPELINES = {

    'scrapytest.MyPipelines.MyPipeline': 300,

    }

    上面的代码用于注册Pipeline,其中scrapytest.MyPipelines.MyPipeline为你要注册的类,右侧的’300’为该Pipeline的优先级,范围1~1000,越小越先执行。(ps:这个并没有详细了解)

    4. 运行demo

    在Myspider.py的同级下执行cmd控制台,运行一下命令。

    scrapy crawl MySpider

    5. 运行结果

    这是一个json的文件,json文件的输出结构更改在Myspider.py中,我改成这种通过逗号来连接每一条弹幕时是为了之后方便分词。大家也可以把代码改了改成另一种展示方式

    1240

    (便于分词的展示方式)

    1240

    (另一种方式)

    到此python爬取B站弹幕demo结束,接下来我们通过拿到的json文件去R语言中进行分词。

    三、R语言分词实例

    环境说明

    步骤说明

    安装R、Rstudio、jiebaR、rJSON

    引入JSON文件

    分词处理

    停止词处理

    过滤数字及字母

    产生数据

    调用wordcloud2绘制词云

    关于jiebaR分词基本是按照R语言中文分司包jiabaR这个博客的demo来进行的。该博文中对于jiebaR的各种函数介绍的非常全面,因此下面demo将不对代码内容进行详细介绍。demo中的各种路径请自行更改。

    demo说明

    只有一个jiebaR.R文件即完成了分词和绘制词云,代码如下:

    #调入分词的库

    library("jiebaR")

    library("rjson")

    #这里读取的`python`爬取的`json`文件,拿道了对象中`content`键的值,该值是一长串字符串,在爬虫输出的时候通过逗号来连接字符串,因此分词时是通过逗号进行的分词

    myfile<-fromJSON(file = "F:/gitlab/py/scrapytest/scrapytest/spiders/data.json")$content

    #预处理,这步可以将读入的文本转换为可以分词的字符,本demo通过逗号进行分词

    myfile.res<-myfile[myfile!=","]

    #调用分词引擎worker函数 stop_word为停止词设置

    wk = worker(stop_word ='F:/R/stopw.txt')

    #segment为分词结果

    segment = wk[myfile.res]

    #对于分词结果进行正则过滤,去掉数字及字母

    segment = gsub("[a-zA-Z\\/\\.0-9]+","",segment)

    #计算词频,该data即为传入词云的数据

    data <- freq(segment)

    #引入wordcloud2,在引入之前请先安装

    library(wordcloud2)

    #调用wordcloud2函数绘制词云,该函数参数在github已有介绍

    wordcloud2(data,size = 1, fontFamily = "微软雅黑",color = "random-light"")

    1240

    (计算词频后的结果)

    1240

    (我一开始万万没有想到我分出来会这么丑)

    问题说明

    1.计算词频

    由于弹幕的条数比较多,分词过滤后的词频很多,没有细查找如何再进一步的排序过滤筛选词,所以导致词云的结果并不是很好

    2. 关键词提取

    个人认为通过关键字提取出的词云会更好一旦,jiabaR提供了关键字提取的方法及提取的结果,结果上面是词语出现频率。

    #提取150个关键字

    keys = worker("keywords",topn=150)

    #关键字结果

    re = vector_keywords(segment,keys)

    1240

    (提取出的关键字结果)

    从图上可以看出这个关键词比较适合用来做词云,但是这里遇到了问题,关键字的结果时vector类型,并不能直接作为wordcloud的参数,从测试结果上来看wordcloud的参数接收data.frame类型,且要有词的内容和词频,当我通过如下代码将vector类型转换为data.frame时,并将结果输出到了csv的文件后发现,输出的内容并没有词频。没有词频就无法通过wordcloud来进行绘制!!!,求指教如何将关键词放入wordcloud进行绘制!!!

    #re为调用vector_keywords产生的结果

    data.frame(re);

    #将结果输出到文件中

    write.csv(data.frame(re),"F:/R/2345.csv",row.names = T)

    1240

    (通过调用关键词函数vector_keywords产生的结果)

    3. 提出出的词语如何能文字更多

    在做词库处理时,我这边用了搜狗的词库替换了jiabaR的原来词库,因此可以出现类似于神罗天征这样的四字词语,在原来的词库里,连宇智波都是被分开的!但是如何把很短的一句话也提取出来呢,从最开始的弹幕可以看到,原文件中是有大量的重复的一句话,除了自己在搜狗词包之外设置固定的词语短句,不知道还有没有别的方法,欢迎指导。

    最后的那个图被我做的太丑了,简直影响观看,我如果一开始能预料到分出来会这么丑……我万万不会去分的,而且现在做云文字的网站都自带分词好像是,所以……所以我也不知道我这是在干嘛……。如有错误还请指教!

    四、代码结构截图

    项目代码结构截图

    hXcFOA6Dqfz63ep1ME4.png

    spiders文件夹截图

    FAHLhstyyj02Mssih7a.png

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

    注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

    展开全文
  • 【kimol君的无聊小发明】—用python爬取B站弹幕(无数量限制)前言一、弹幕抓取(有数量限制)二、弹幕抓取(无数量限制)写在最后 前言 某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~ 当我打开文件夹以...

    【kimol君的无聊小发明】—用python爬取B站弹幕(无数量限制)

    前言

    某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~
    当我打开文件夹以回顾往事之余,惊现许多看似杂乱的无聊代码。我拍腿正坐,一个想法油然而生:“生活已然很无聊,不如再无聊些叭”。
    于是,我决定开一个专题,便称之为kimol君的无聊小发明
    妙…啊~~~

    想必小破站大家都很熟悉叭,里面充满了各种神奇的视频,其中的弹幕成为了许多人的快乐源泉。关于它的爬虫也有很多,但大部分都受限于弹幕池的数量,只能爬取到其中很少一部分的弹幕。

    那么,有没有办法可以爬取到B站更多的弹幕呢?

    一、弹幕抓取(有数量限制)

    首先,我们需要找到B站视频弹幕的接口,通过浏览器的F12调试工具抓包可以发现,其接口为:

    https://api.bilibili.com/x/v1/dm/list.so?oid={oid/cid}
    

    其实,除了这个接口之外,还有另外一个接口同样是可以获取到弹幕的:

    https://comment.bilibili.com/{oid/cid}.xml
    

    其中oidcid是iB站给每个视频分配的一个id号,但是通常我们在浏览器地址看到的是bvid,因此需要做个转换:
    在这里插入图片描述
    这里相关的接口有很多,可以定义如下函数:

    def get_cid(bvid):
        '''
        通过视频的bvid获得视频的cid
        输入:视频的bvid
        输出:视频的cid
        '''
        url = 'https://api.bilibili.com/x/player/pagelist?bvid=%s&jsonp=jsonp'%bvid
        res = requests.get(url)
        data = res.json()
        return data['data'][0]['cid']
    

    有了cid之后,我们便可以通过刚才发现的弹幕接口爬取弹幕了,代码如下:

    oid = get_cid(bvid) # 这里的cid和oid是一样的
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=%d'%oid
    res = requests.get(url)
    res.encoding = 'utf-8'
    text = res.text
    

    注意:这里需要指定res的编码方式为utf-8,否则会出现乱码现象。

    我们得到的请求为一个xml文件,其格式大致如下:
    在这里插入图片描述
    因此,需要将其中的信息提取出来,p标签对应的字段分别为:

    位置 含义
    第1个 弹幕在视频中的出现时间
    第2个 弹幕的模式
    第3个 弹幕字体大小
    第4个 弹幕颜色的十进制代码
    第5个 弹幕发送时间
    第6个 弹幕池
    第7个 用户ID(经过CRC32校验后)
    第8个 rowID,可认为是标识弹幕的ID

    那么,利用正则可以它们都提前出来:

    def parse_dm(text):
        '''
        解析视频弹幕
        输入:视频弹幕的原数据
        输出:弹幕的解析结果
        '''
        result = [] # 用于存储解析结果
        data = re.findall('<d p="(.*?)">(.*?)</d>',text)
        for d in data:
            item = {} # 每条弹幕数据
            dm = d[0].split(',') # 弹幕的相关详细,如出现时间,用户等
            item['出现时间'] = float(dm[0])
            item['模式'] = int(dm[1])
            item['字号'] = int(dm[2])
            item['颜色'] = int(dm[3])
            item['评论时间'] = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(int(dm[4])))
            item['弹幕池'] = int(dm[5])
            item['用户ID'] = dm[6] # 并非真实用户ID,而是CRC32检验后的十六进制结果
            item['rowID'] = dm[7] # 弹幕在数据库中的ID,用于“历史弹幕”功能
            item['弹幕内容'] = d[1]
            result.append(item)    
        return result
    

    通过解析requests的请求,便能得到相应的弹幕:

    dms = parse_dm(text) # 解析弹幕
    

    但是,这里受到弹幕池的限制,每次只能抓取一小部分,当弹幕数量很多时,显然这个办法行不通。

    那么,我们得另寻它路了~

    二、弹幕抓取(无数量限制)

    通过分析,我们可以找到另外一个接口,用于获取每天的弹幕历史数据:

    https://api.bilibili.com/x/v2/dm/history?type=1&oid={oid/cid}&date=xx-xx
    

    date为日期,通过遍历日期便可获得更多的弹幕。需要注意的是,这个接口需要登陆,因此在请求的时候必须得加入cookies,可以定义如下函数:

    def get_history(bvid,date): 
        '''
        获取视频历史弹幕
        输入:视频bvid,日期
        输出:视频某一日期开始的弹幕
        '''
        oid = get_cid(bvid)
        url = 'https://api.bilibili.com/x/v2/dm/history?type=1&oid=%d&date=%s'%(oid,date)
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0',
                   'Accept': '*/*',
                   'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
                   'Origin': 'https://www.bilibili.com',
                   'Connection': 'keep-alive',
                   'Referer': 'https://www.bilibili.com/video/BV1k54y1U79J',
                   'TE': 'Trailers'}
        # 此接口需要登陆,因此需要cookies
        cookies = {}
        res = requests.get(url,headers=headers,cookies=cookies)
        res.encoding = 'utf-8'
        text = res.text
        dms = parse_dm(text) # 解析弹幕
        return dms
    

    想要获得更多的弹幕,遍历每一天的弹幕数据即可,但是这样存在两个问题:效率太低数据重复。因为,每次获取通常可以得到跨越几天的数据,所以我们无需每天都去访问,而是根据结果逐步往前推即可:

    def get_dms(bvid):
        '''
        获取视频弹幕(此方法获取的弹幕数量更多)
        输入:视频的bvid
        输出:视频的弹幕
        '''
        print('视频解析中...')
        info = get_info(bvid)
        print('视频解析完成!')
        print('【视频标题】: %s\n【视频播放量】:%d\n【弹幕数量】:  %d\n【上传日期】:  %s'%(info[0],info[1],info[2],info[3]))
        dms = get_dm(bvid) # 存储弹幕
        if len(dms) >= info[2]: # 如果弹幕数量已抓满
            return dms
        else:
            dms = []
            date = time.strftime('%Y-%m-%d',time.localtime(time.time())) # 从今天开始
            while True:
                dm = get_history(bvid,date)
                dms.extend(dm)
                print('"%s"弹幕爬取完成!(%d条)'%(date,len(dm)))
                if len(dm) == 0: # 如果为空
                    break
                end = dm[-1]['评论时间'].split()[0] # 取最后一条弹幕的日期
                if end == date: # 如果最后一条仍为当天,则往下推一天
                    end = (datetime.datetime.strptime(end,'%Y-%m-%d')-datetime.timedelta(days=1)).strftime('%Y-%m-%d')
                if end == info[3]: # 如果已经到达上传那天
                    break
                else:
                    date = end
            dm = get_history(bvid,info[3]) # 避免忽略上传那天的部分数据
            dms.extend(dm)
            print('弹幕爬取完成!(共%d条)'%len(dms))
            print('数据去重中...')
            dms = del_repeat(dms,'rowID') # 按rowID给弹幕去重
            print('数据去重完成!(共%d条)'%len(dms))
            return dms
    

    运行主函数:

    if __name__ == '__main__':
        dms = get_dms('BV1HJ411L7DP')
        dms = pd.DataFrame(dms)
        dms.to_csv('一路向北.csv',index=False)
    

    爬取过程如下:
    在这里插入图片描述
    可以看到,一共11471条弹幕,我们获取到了11000条,占比已经很高了,而且csv文件已经安静地躺在了我的电脑中,打开它:
    在这里插入图片描述
    至此,大功告成,舒坦了~~

    写在最后

    最后,感谢各位大大的耐心阅读,咋们下次再会~

    如果需要完整代码可以关注下方公众号,后台回复“B站弹幕”即可获取,kimol君期待着您的光临~
    在这里插入图片描述

    创作不易,大侠请留步… 动起可爱的双手,来个赞再走呗 (๑◕ܫ←๑)

    展开全文
  • Python爬取B站弹幕方法介绍

    千次阅读 多人点赞 2020-08-04 21:47:46
    文章目录Python爬取B站弹幕方法介绍前言寻找弹幕数据编写爬虫B站弹幕数量新技术介绍参考文章 前言 最近同学要做东西,需要用 B 的视频对应的弹幕数据做分析,于是请我帮忙爬取 B 视频的弹幕数据。 对于爬虫而言...

    Python爬取B站弹幕方法介绍

    前言

    最近同学要做东西,需要用 B 站的视频对应的弹幕数据做分析,于是请我帮忙爬取 B 站视频的弹幕数据。

    对于爬虫而言,我们需要找到对应数据所在的接口,找到接口,就可以找到对应的数据。这个时候我们只需要简单的调用 Python 库进行爬取,输出到文件即可。

    目前针对 B 站弹幕爬取有两种方法

    • 方法一,找到接口数据,编码爬取
    • 方法二,找到 BV号,调用API

    这篇博客分别对两种方法进行了整合介绍,并给出了详细的操作流程。

    寻找弹幕数据

    其实 B 站是提供了弹幕接口的,B站把视频对应的弹幕数据全部放在 xml 文件中,获取的接口是

    1、https://comment.bilibili.com/视频的cid.xml
    2、https://api.bilibili.com/x/v1/dm/list.so?oid=视频的cid
    

    两个接口目前都是可以正常使用的,第一个接口是老版本,第二个接口是新版本。

    这里我们使用老版本接口,以视频“刺客伍六七”为例子来演示,获取视频对应的 cid,使用的是谷歌浏览器。

    • 第一步,到 B站打开对应视频,比如“刺客伍六七”,进入视频播放页面(先不要点击播放)

    b1

    • 第二步,按 F12 键,打开浏览器的控制台,转到 NetWork 部分

    b2

    • 第三步,点击播放,注意观察 NetWork 下面加载的文件,当看到名为 heartbeatxhr 文件时,点击暂停。

    heartbeat 的里面记录了该视频的一些特有信息,比如 aid、cid、BVid 等等。一个的视频特有信息都是固定的,比如一个视频只有一个 cid。

    b3

    • 第四步,点击任意一个 heartbeat 文件,在 Headers 标签页中往下翻,就可以找到 cid 了。

    可以看到,刺客伍六七第一集的 cid 为 47506569。

    b4

    • 第五步,将 cid 与对应的接口进行拼接,输入在浏览器的地址栏进行查看

    这一步是为了熟悉对应弹幕数据的网页结构,方便之后的编码工作进行数据的提取。如果使用熟练的话则可以跳过此步。

    b5

    编写爬虫

    既然我们已经可以找到了弹幕数据所在的的地方,直接进行爬取即可。大致可以分为以下几步:

    1. 获取整个页面
    2. 提取弹幕数据
    3. 简单的数据预处理
    4. 输出到文件

    爬虫编写完成后,每次我们只需要修改文件名和 cid 就可以继续爬取弹幕数据保存到文件中了。

    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    import re
    
    # 弹幕保存文件
    file_name = '刺客伍六七第一集.csv'
    
    # 获取页面
    cid = 47506569
    url = "https://comment.bilibili.com/" + str(cid) + ".xml"
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
        }
    request = requests.get(url=url, headers=headers)
    request.encoding = 'utf-8'
    
    # 提取弹幕
    soup = BeautifulSoup(request.text, 'lxml')
    results = soup.find_all('d')
    
    # 数据处理
    data = [data.text for data in results]
    # 正则去掉多余的空格和换行
    for i in data:
        i = re.sub('\s+', '', i)
    
    # 查看数量
    print("弹幕数量为:{}".format(len(data)))
    
    # 输出到文件
    df = pd.DataFrame(data)
    df.to_csv(file_name, index=False, header=None, encoding="utf_8_sig")
    print("写入文件成功")
    

    代码说明:

    1. B站目前还没有针对爬虫设置特别的反爬措施,因此可以直接爬取
    2. 弹幕数据绝大部分都是中文,一定要使用 utf-8 编码
    3. xml 文件中弹幕数据都在 d 标签内,使用 BeautifulSoup 来提取所有的 d 标签,再获取标签内的数据
    4. 弹幕数据可能会有多余的空格和换行,使用正则表达式进行处理
    5. 使用 Dataframe 将数据输出到 csv 文件中。参数 index=False 不将索引序列保存到文本、header=None 不保存列名。

    爬虫写入文件的结果如下图:

    b6

    B站弹幕数量

    这里不得不提一下 B 站的弹幕数量规则:

    B站的弹幕池是有上限的,弹幕的具体数量和视频的长度有所联系。一般来讲,一部十分钟内的视频弹幕数量上限为 1000,一部25分钟的视频为 3000,40分钟左右的为 6000,时间更长的话会破万。

    如果大家发的弹幕数量太多了,超过弹幕池的数量上限怎么办?

    B 站的做法是按照时间顺序用将以前的弹幕剔除掉,然后放入新的弹幕,这样就将该视频的弹幕数量始终维持在一个等级上,而且用户看到的还是最新的弹幕

    比如这里,“刺客伍六七”第一集的时长是16分半,弹幕数量 3000。

    新技术介绍

    今年,也就是 2020 年,B站某位大佬在 github 上分享了自己的开源项目,也就是 bilibili 的 API 调用库。

    GitHub 地址为:https://github.com/Passkou/bilibili_api

    b7

    通过这个 API 调用模块,可以实现获取视频的评论、弹幕、播放量等信息,还可以实现投币、点赞、发送弹幕等一系列的用户功能。

    比起我们上面所介绍的方式,用这个 API 来获取视频的弹幕就更为简单了。我们只需要传入视频的 BVid,调用弹幕 API 即可获取该视频的弹幕。(Bvid 的获取和 cid 同理)

    在使用这个 API 之前,我们需要先用 pip 把这个库安装上

    pip install bilibili_api
    

    可以看到,调用 API 简直不要太方便。而且 API 还有人维护和更新,拿来即可用。

    from bilibili_api import video
    import re
    import pandas as pd
    
    # BVid、fileName
    BVid = "BV1oW41157Na"
    file_name = '刺客伍六七第一集.csv'
    
    # 获取弹幕
    my_video = video.VideoInfo(bvid=BVid)
    danmu = my_video.get_danmaku()
    
    # 数据处理
    data = [data.text for data in danmu]
    for i in data:
        i = re.sub('\s+', '', i)
    
    # 查看数量
    print("弹幕数量为:{}".format(len(data)))
    
    # 输出到文件
    df = pd.DataFrame(data)
    df.to_csv(file_name, index=False, header=None, encoding="utf_8_sig")
    print("写入文件成功")
    

    参考文章

    python爬虫:bilibili弹幕爬取

    bilibili弹幕获取api

    pandas-DataFrame格式化保存到txt

    bilibili 弹幕会被限制数量吗

    bilibili-API

    展开全文
  • 前言主要记录自己完成爬虫的思路:从how to do到what to do这是一个拿 python 练手的项目,虽说是入门级,... 弹幕究竟是什么玩意首先,让我们看看B站客户端是如何接收到弹幕的这就需要让我们看看网页的源代码了随便...
  • 先Po效果图,这是去年9月某期逗鱼时刻的弹幕词频分析,就是吾王巨经典的“我给XXX做牛做马”体刚刚兴起的那阵做的词云。这个程序在我去年9月份左右的时候就写好了,时隔半年威力依旧不减当年,现在回头看这段代码...
  • 分析网页视频地址:https://www.bilibili.com/video/BV19E411W7BE本身博主同时也是一名up主,虽然已经断更好久了,但是不妨碍我爬取弹幕信息来分析呀。这次我选取的是自己唯一的爆款视频。就是下面这个。希望大家...
  • 目录SRE实战 互联网时代...爬取弹幕1. 从手机端口进入网页爬取找到接口2.代码import requestsfrom lxml import etreeimport numpy as npurl='https://api.bilibili.com/x/v1/dm/list.so?oid=198835779'headers= {...
  • 参考代码如下,将弹幕按照日期保存为单个文件...因为太多了...importrequestsimportreimporttime""" 爬取哔哩哔哩视频弹幕信息"""# 2043618 是视频的弹幕标号,这个地址会返回时间列表# ......
  • 我们会发现,弹幕列表一栏对应的网页结构并不是我们想抓取的弹幕文件,那么弹幕文件在哪那?很简单,由于弹幕是滚动播放的,所以有一个快速找到弹幕文件的方法。在开发者工具中点击network。重新...
  • python爬取b站弹幕并进行数据可视化

    千次阅读 多人点赞 2019-11-22 19:19:21
    python爬取b站弹幕并进行数据可视化 1.第一步,爬取b站弹幕 我们随便打开一个b视频 打开开发者模式,在network下搜索list,可以找到该视频的弹幕文件 打开之后是这个样子的 结构还是比较简单的,我们后续爬取...
  • 一个B站账号,需要先登录,否则不能查看历史弹幕记录联网的电脑和顺手的浏览器,我用的ChromePython3环境以及request模块,安装使用命令,换源比较快:pip3 install request -i http://pypi.douban.com/simple爬取步骤:...
  • 一个B站账号,需要先登录,否则不能查看历史弹幕记录联网的电脑和顺手的浏览器,我用的ChromePython3环境以及request模块,安装使用命令,换源比较快:pip3 install request -i http://pypi.douban.com/simple爬取步骤:...
  • Python爬取B站弹幕数据并获取弹幕数量最多数据网站分析最终代码 我们以郑老师申论课为例子进行分析 网站分析 郑老师的申论课的网址为 https://www.bilibili.com/video/BV1W7411t7fy 我们爬取106节课程并存储弹幕到...
  • 使用Python爬取B站弹幕

    2019-09-15 11:58:51
    爬取B站弹幕说着简单实现难,你不仅仅要找到弹幕视频的api接口 还要掌握一系列的表达式及编程语法 但是 我并不慌,身为一名没多少进ICU的996患者(误) 让我们开始coding吧! 使用语言:...
  • Python爬取B站弹幕并做成词云 一、获取视频的cid号 1.进入想爬的视频,打开浏览器设置里的“开发者工具”: 进入Search后输入cid获得视频的cid号。 2.爬视频的弹幕 #爬数据正文 def get_data(cid): # 分析网页,...
  • 最近有朋友在群上面说做个b站某视频的弹幕统计列表,筛选出弹幕最多的那条!那么如何解决这个问题呢?首先肯定是要获取弹幕的列表吧,然后再进行分析吧。筛选出弹幕最多的那条,这个好办用collections可以解决,那么...
  • B 的评论是弹幕的形式,想要知道 B 用户的评价,就是要对弹幕做一次分析。接下来的事情就简单了,打开 B ,分析一波请求,然后把弹幕的数据抓取下来,最后做个简单的分析。整个事情就是这么的朴实无华。分析的...
  • 感谢原理概念cid: 爬取弹幕需要的id号,可以由BV号通过API接口获得步骤BV转cid浏览器输入:https://api.bilibili.com/x/player/pagelist?bvid=BV1x54y1e7zf&jsonp=jsonpcid=226204073由cid得到当日条数小于1000的...
  • 前言关于这个小项目的由来。最开始是想要利用b站弹幕进行...开码一丶利用 POST 方式获取 B 直播弹幕参考:【pythonb站直播弹幕获取首先,随便打开一个b站的直播页面,按F12打开控制台,点进“网络(Network...
  • 一、写在前面之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样一个简单的尝试,从搭建环境到跑通...关于环境的安装及调试过程中遇到的问题记录请移步二、Python爬取B站弹幕环境
  • Python爬取B站弹幕的思路和流程

    万次阅读 热门讨论 2018-07-30 17:42:17
    做nlp项目,除了各大电商评论和微博数据,弹幕分析对于舆论和该视频的推广都是有帮助的,下面主要说说这么从B站爬取弹幕。 过程很简单,我们来看看: 1. 首先,bilibili的弹幕是在xml文件里,每个视频都有其对应的...
  • 作者:栗科技一、爬取介绍利用Chrome浏览器抓包可知,B站弹幕文件以XML文档式进行储存,如下所示(共三千条实时弹幕)其URL为:http://comment.bilibili.com/183362119.xml数字183362119则代表该视频专属ID,通过...
  • 程序源代码:(需要看python爬取B站弹幕并制作词云图(2021年-6月)【上】) #!/usr/bin/python #coding:utf-8 import requests import string import jieba import pandas as pd import numpy as np from PIL import ...
  • 前几天我做了B站《后浪》视频的弹幕分析,感兴趣的朋友可以去B站看一下现在我将在制作这个视频...一、先尝试爬取1000条为什么只有1000条,因为B站视频限制了弹幕显示数量,也就是一个视频一天最多显示弹幕数量是1...
  • 思路: 待续 效果: 代码: # -*- coding: utf-8 -*- # @Time : 2019/9/13 20:45 # @Author : Zhao HL # @File : jackMa.py ''' cid获取方法: heartbeat-->Form Data-->...import xml.sax...

空空如也

空空如也

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

python爬取b站弹幕

python 订阅