精华内容
下载资源
问答
  • 爬取B站弹幕
    千次阅读
    2019-01-18 16:59:51

    最近几天学习爬虫,便爬取了B站的弹幕,本篇博文记录的是爬取弹幕的方法一,近期会更新方法二。

    下面是流程:

    1.随意打开一个B站视频,按F12,点开network按键,在左上方的输入区输入 list 便可找到相应的弹幕数据包。

     点开这个包是这个形式的网站

    这里面就有明文的弹幕,但通过requests获得的response是经过utf-8编码加密过的,想要获得弹幕内容还要解密。

    下面附代码:

    from bs4 import BeautifulSoup
    import requests
    import urllib
    import re
    
    
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
        }
    
    response = requests.get("https://api.bilibili.com/x/v1/dm/list.so?oid=29453153", headers=headers)
    #print(response.text)
    html_doc = response.content.decode('utf-8')
    #soup = BeautifulSoup(html_doc,'lxml')
    format = re.compile("<d.*?>(.*?)</d>")
    DanMu = format.findall(html_doc)
    print(DanMu)
    for i in DanMu:
        print(i)

     

    更多相关内容
  • 本篇文章给大家讲解一下如何用python3写出爬取B站视频弹幕的功能,有兴趣的读者们参考学习下吧。
  • 1.打开"bilibili_barrage_spiderv2.0.exe" 2.按要求操作 3.等待完毕提示 4.可在input文件夹中查看弹幕以及词云
  • 用Python爬取B站弹幕并做成词云 一、获取视频的cid号 1.进入想爬的视频,打开浏览器设置里的“开发者工具”: 进入Search后输入cid获得视频的cid号。 2.爬视频的弹幕 #爬数据正文 def get_data(cid): # 分析网页,...

    用Python爬取B站弹幕并做成词云

    一、获取视频的cid号
    1.进入想爬的视频,打开浏览器设置里的“开发者工具”:
    查找cid
    进入NetWork后等待requests刷出,数据够了后可随意点击一个数据查看其preview和其URL,
    然后进入Search后输入cid获得视频的cid号。

    2.爬视频的弹幕

    #爬数据正文
    def get_data(cid):
        # 分析网页,并获取网页文件
        url = 'https://comment.bilibili.com/{}.xml'.format(cid)   #B站弹幕数据存放在https://comment.bilibili.com/cid.xml中,其中cid是视频的cid号
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36(KHTML, likeGecko) Chrome/80.0.3987.163Safari/537.36"
        }
        response = requests.get(url,headers = headers).content.decode('utf-8')   
        return response
    def parse_html(response):
        # 解读网页文件,获取关键信息
        # soup = bs4.BeautifulSoup(response)
        # lst = [soup.find_all(name='d')]
        # danmuku = [i.text for i in lst]
     
        pattern = re.compile(r'<d p=".*?">(.*?)</d>')
        danmuku = re.findall(pattern,response)
        #print(danmuku)  #打印弹幕数据
        return danmuku
    def save_data(danmuku,cid):
        # 保存数据
        Dict = {
            'danmuku' : danmuku
        }
        pd_data = pd.DataFrame(Dict)
        cid = str(cid)
        name = cid + '弹幕文件.txt'
        path = 'C:/Users/priesty/Desktop/弹幕数据/{}'.format(name)
        pd_data.to_csv(path,index = False,header=False,mode='w',encoding='utf-8-sig')
     
    def data_preprocess(danmuku,cid):
        cid = str(cid)
        name = cid + '弹幕文件.txt'
        path = 'C:/Users/priesty/Desktop/弹幕数据/{}'.format(name)
        with open(path ,mode='r',encoding='utf-8') as f:
            # 加载用户自定义字典
            jieba.load_userdict (r'C:/Users/priesty/Desktop/弹幕数据/自定义词表.txt')
            reader = f.read().replace('\n','')
            # 加载停用词词表
            stopwords = [line.strip() for line in open(r'C:/Users/priesty/Desktop/弹幕数据/停用词表.txt',encoding ='utf8').readlines()]  #原代码为gbk,改为了utf8
            # 去标点,去数字,去空白
            pun_num = string.punctuation + string.digits
            table = str.maketrans('','',pun_num)
            reader = reader.translate(table)
            seg_list = jieba.cut(reader,cut_all=False)
            sentence = ''
            for word in seg_list:
                if word not in stopwords and word.isspace() == False:
                    sentence += word
                    sentence += ','
            sentence = sentence[:-1]
            return sentence
     
    def count_words(txt,cid):
        cid = str(cid)
        name = cid + '弹幕词汇数统计.txt'
        path = 'C:/Users/priesty/Desktop/弹幕数据/{}'.format(name)
        aDict = {}
        words = txt.split(',')
        for word in words:
            aDict[word] = aDict.get(word,0) + 1
        pd_count = pd.DataFrame(aDict,index=['times']).T.sort_values('times',ascending=False)
        pd_count.to_csv(path)
     
    if __name__ == "__main__":
     
        cid = int(input('请输入你想查询的视频CID号:'))
        response = get_data(cid)              #这两句可改为一句response = get_data(348133155)
        danmuku = parse_html(response)
        save_data(danmuku,cid)
        sentence = data_preprocess(danmuku,cid)
        count_words(sentence,cid)
    

    原代码来自:https://blog.csdn.net/paxiaochong001/article/details/116937710

    ps:1.“自定义词表”和“停用词表”内容可以随便添加
    2.B站弹幕数据存放在https://comment.bilibili.com/cid.xml中,其中cid是视频的cid号
    3.路径的斜杠别用反了

    3.制作词云
    安装jieba、wordcloud、request库(后两个基本上新版自带)

    #词云正文
    #背景图
    bg=np.array(Image.open("C:/Users/priesty/Desktop/弹幕数据/1.png"))
    
    #获取当前的项目文件加的路径
    d=path.dirname('__file__')    #file要加引号
    #d=os.path.abspath('')
    
    #读取停用词表
    stopwords_path='C:/Users/priesty/Desktop/弹幕数据/停用词表.txt'
    #添加需要自定以的分词
    jieba.add_word("晚唐")
    jieba.add_word("武周")
    
    #读取要分析的文本
    text_path="C:/Users/priesty/Desktop/弹幕数据/348133155弹幕文件.txt"  #文本太大读取不出来
    #读取要分析的文本,读取格式
    text=open(path.join(d,text_path),encoding="utf8").read()
    #定义个函数式用于分词
    def jiebaclearText(text):
        #定义一个空的列表,将去除的停用词的分词保存
        mywordList=[]
        #进行分词
        seg_list=jieba.cut(text,cut_all=False)
        #将一个generator的内容用/连接
        listStr='/'.join(seg_list)
        #打开停用词表
        f_stop=open(stopwords_path,encoding="utf8")
        #读取
        try:
            f_stop_text=f_stop.read()
        finally:
            f_stop.close()#关闭资源
        #将停用词格式化,用\n分开,返回一个列表
        f_stop_seg_list=f_stop_text.split("\n")
        #对默认模式分词的进行遍历,去除停用词
        for myword in listStr.split('/'):
            #去除停用词
            if not(myword.split()) in f_stop_seg_list and len(myword.strip())>1:
                mywordList.append(myword)
        return ' '.join(mywordList)
    text1=jiebaclearText(text)
    #生成
    wc=WordCloud(
        background_color="white", 
        max_words=200,
        mask=bg,            #设置图片的背景
        max_font_size=60,
        random_state=42,
        font_path='C:/Windows/Fonts/simkai.ttf'   #中文处理,用系统自带的字体
        ).generate(text1)
    #为图片设置字体
    my_font=fm.FontProperties(fname='C:/Windows/Fonts/simkai.ttf')
    #产生背景图片,基于彩色图像的颜色生成器
    image_colors=ImageColorGenerator(bg)
    #开始画图
    plt.imshow(wc.recolor(color_func=image_colors))
    #为云图去掉坐标轴
    plt.axis("off")
    #画云图,显示
    plt.figure()
    #为背景图去掉坐标轴
    plt.axis("off")
    plt.imshow(bg,cmap=plt.cm.gray)
    
    #保存云图
    wc.to_file("C:/Users/priesty/Desktop/弹幕数据/2.png")
    

    原代码来自:https://piqiandong.blog.csdn.net/article/details/79558589
    则词云图片为:
    词云
    4.整个原代码

    #爬数据前缀
    import requests
    import re
    import pandas as pd
    import string
    import jieba
    
    #词云前缀
    from os import path  #用来获取文档的路径
    from PIL import Image
    import numpy as  np
    import matplotlib.pyplot as plt
    #词云生成工具
    from wordcloud import WordCloud,ImageColorGenerator
    #需要对中文进行处理
    import matplotlib.font_manager as fm
    
    #爬数据正文
    def get_data(cid):
        # 分析网页,并获取网页文件
        url = 'https://comment.bilibili.com/{}.xml'.format(cid)   #B站弹幕数据存放在https://comment.bilibili.com/cid.xml中,其中cid是视频的cid号
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36(KHTML, likeGecko) Chrome/80.0.3987.163Safari/537.36"
        }
        response = requests.get(url,headers = headers).content.decode('utf-8')   
        return response
    def parse_html(response):
        # 解读网页文件,获取关键信息
        # soup = bs4.BeautifulSoup(response)
        # lst = [soup.find_all(name='d')]
        # danmuku = [i.text for i in lst]
     
        pattern = re.compile(r'<d p=".*?">(.*?)</d>')
        danmuku = re.findall(pattern,response)
        #print(danmuku)  #打印弹幕数据
        return danmuku
    def save_data(danmuku,cid):
        # 保存数据
        Dict = {
            'danmuku' : danmuku
        }
        pd_data = pd.DataFrame(Dict)
        cid = str(cid)
        name = cid + '弹幕文件.txt'
        path = 'C:/Users/priesty/Desktop/弹幕数据/{}'.format(name)
        pd_data.to_csv(path,index = False,header=False,mode='w',encoding='utf-8-sig')
     
    def data_preprocess(danmuku,cid):
        cid = str(cid)
        name = cid + '弹幕文件.txt'
        path = 'C:/Users/priesty/Desktop/弹幕数据/{}'.format(name)
        with open(path ,mode='r',encoding='utf-8') as f:
            # 加载用户自定义字典
            jieba.load_userdict (r'C:/Users/priesty/Desktop/弹幕数据/自定义词表.txt')
            reader = f.read().replace('\n','')
            # 加载停用词词表
            stopwords = [line.strip() for line in open(r'C:/Users/priesty/Desktop/弹幕数据/停用词表.txt',encoding ='utf8').readlines()]#原代码为gbk,改为了utf8
            # 去标点,去数字,去空白
            pun_num = string.punctuation + string.digits
            table = str.maketrans('','',pun_num)
            reader = reader.translate(table)
            seg_list = jieba.cut(reader,cut_all=False)
            sentence = ''
            for word in seg_list:
                if word not in stopwords and word.isspace() == False:
                    sentence += word
                    sentence += ','
            sentence = sentence[:-1]
            return sentence
     
    def count_words(txt,cid):
        cid = str(cid)
        name = cid + '弹幕词汇数统计.txt'
        path = 'C:/Users/priesty/Desktop/弹幕数据/{}'.format(name)
        aDict = {}
        words = txt.split(',')
        for word in words:
            aDict[word] = aDict.get(word,0) + 1
        pd_count = pd.DataFrame(aDict,index=['times']).T.sort_values('times',ascending=False)
        pd_count.to_csv(path)
     
    if __name__ == "__main__":
     
        cid = int(input('请输入你想查询的视频CID号:'))
        response = get_data(cid)              #这两句可改为一句response = get_data(348133155)
        danmuku = parse_html(response)
        save_data(danmuku,cid)
        sentence = data_preprocess(danmuku,cid)
        count_words(sentence,cid)
    
        
    
    #词云正文
    #背景图
    bg=np.array(Image.open("C:/Users/priesty/Desktop/弹幕数据/1.png"))
    
    #获取当前的项目文件加的路径
    d=path.dirname('__file__')    #file要加引号
    #d=os.path.abspath('')
    
    #读取停用词表
    stopwords_path='C:/Users/priesty/Desktop/弹幕数据/停用词表.txt'
    #添加需要自定以的分词
    jieba.add_word("晚唐")
    jieba.add_word("武周")
    
    #读取要分析的文本
    text_path="C:/Users/priesty/Desktop/弹幕数据/348133155弹幕文件.txt"  #文本太大读取不出来
    #读取要分析的文本,读取格式
    text=open(path.join(d,text_path),encoding="utf8").read()
    #定义个函数式用于分词
    def jiebaclearText(text):
        #定义一个空的列表,将去除的停用词的分词保存
        mywordList=[]
        #进行分词
        seg_list=jieba.cut(text,cut_all=False)
        #将一个generator的内容用/连接
        listStr='/'.join(seg_list)
        #打开停用词表
        f_stop=open(stopwords_path,encoding="utf8")
        #读取
        try:
            f_stop_text=f_stop.read()
        finally:
            f_stop.close()#关闭资源
        #将停用词格式化,用\n分开,返回一个列表
        f_stop_seg_list=f_stop_text.split("\n")
        #对默认模式分词的进行遍历,去除停用词
        for myword in listStr.split('/'):
            #去除停用词
            if not(myword.split()) in f_stop_seg_list and len(myword.strip())>1:
                mywordList.append(myword)
        return ' '.join(mywordList)
    text1=jiebaclearText(text)
    #生成
    wc=WordCloud(
        background_color="white", 
        max_words=200,
        mask=bg,            #设置图片的背景
        max_font_size=60,
        random_state=42,
        font_path='C:/Windows/Fonts/simkai.ttf'   #中文处理,用系统自带的字体
        ).generate(text1)
    #为图片设置字体
    my_font=fm.FontProperties(fname='C:/Windows/Fonts/simkai.ttf')
    #产生背景图片,基于彩色图像的颜色生成器
    image_colors=ImageColorGenerator(bg)
    #开始画图
    plt.imshow(wc.recolor(color_func=image_colors))
    #为云图去掉坐标轴
    plt.axis("off")
    #画云图,显示
    plt.figure()
    #为背景图去掉坐标轴
    plt.axis("off")
    plt.imshow(bg,cmap=plt.cm.gray)
    
    #保存云图
    wc.to_file("C:/Users/priesty/Desktop/弹幕数据/2.png")
    

    结果图:在这里插入图片描述
    在这里插入图片描述

    参考文章:https://blog.csdn.net/paxiaochong001/article/details/116937710
    https://piqiandong.blog.csdn.net/article/details/79558589

    展开全文
  • python按日期爬取b站弹幕 2.0版

    千次阅读 2021-01-07 14:36:54
    [分析爬取b站视频弹幕](https://blog.csdn.net/HandsomeFishman/article/details/112171386) 代码 直接附上完整代码: import requests from lxml import etree import pandas as pd from wordcloud import ...
    上次的b站爬取需要手动输入日期等信息,这次直接在程序内根据时间差进行爬取,直接放上完整代码。

    代码

    上次的分析链接在此:b站弹幕爬取分析
    直接附上完整代码:


    
    import requests
    from lxml import etree
    import pandas as pd
    from wordcloud import WordCloud
    import jieba
    import datetime
    
    
    class BarrageSpider:
        def __init__(self, bv):
            # 需要一个bv号,在接下来的代码中进行替换操作
            self.bv = bv
            self.video_name = None
            # 不需要登录的弹幕接口地址 只能爬取部分弹幕
            self.barrage_url = 'https://comment.bilibili.com/{}.xml'
            # 需要登陆的弹幕接口地址 根据日期进行分类 需要循环爬取 最后归总数据
            self.date_url = 'https://api.bilibili.com/x/v2/dm/history?type=1&oid={}&date={}'  # 2021-01-01
            # 点击按钮弹出日历的数据接口,这里我们用来作索引
            self.index_url = 'https://api.bilibili.com/x/v2/dm/history/index?type=1&oid={}&month={}'  # 2021-01
            # 在抓包工具中找的一个简洁的请求,里面有我们需要的oid或者是cid
            self.bv_url = 'https://api.bilibili.com/x/player/pagelist?bvid=' + bv + '&jsonp=jsonp'
            # 视频时间获取
            self.video_url = 'https://www.bilibili.com/video/{}'.format(bv)
            # 不需要登录接口的伪装头
            self.comment = {
                'referer': 'https://www.bilibili.com/',
                'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                              'Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66 '
            }
            # 需要登录的伪装头 因为需要登录 ip代理已经没有意义了 这里就不再使用IP代理
            self.date_headers = {
                "referer": "https://www.bilibili.com/",
                "origin": "https://www.bilibili.com",
                "cookie": "你的cookie 爬很久远的视频 会被封ip 后面接收到的都是空结果",
                "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                              "Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66 "
            }
    
        # 从接口返回的json中获取到我们的cid 注: cid = oid
        def get_cid(self):
            # 定位到数据data中下面的cid
            return requests.get(url=self.bv_url, headers=self.comment).json()['data'][0]['cid']
    
        def get_video_time(self):
            time_data = requests.get(url=self.video_url, headers=self.comment).text
            video_page = etree.HTML(time_data)
            v_time = video_page.xpath('//div[@class="video-data"]/span[3]/text()')[0].split(' ')[0]
            self.video_name = video_page.xpath('//h1[@class="video-title"]/span/text()')[0]
            return v_time
    
        # 解析不需要登录的接口 返回类型是xml文件
        def parse_url(self):
            # 获取指定视频的cid/oid
            cid = self.get_cid()
            # 对页面进行伪装请求,这里注意不要转换成text,使用二进制
            response = requests.get(url=self.barrage_url.format(cid), headers=self.comment).content
            # etree解析
            data = etree.HTML(response)
            # 定位到所有的d元素
            barrage_list = data.xpath('//d')
            for barrage in barrage_list:
                # 获取d元素的p属性值
                info = barrage.xpath('./@p')[0].split(',')
                # 获取弹幕内容
                content = barrage.xpath('./text()')[0]
                item = {'出现时间': info[0], '弹幕模式': info[1], '字体大小': info[2], '颜色': info[3], '发送时间': info[4], '弹幕池': info[5],
                        '用户ID': info[6], 'rowID': info[7], '内容': content}
                # 因为这只是一部分弹幕 所以就没有进行持久化存储 没有必要
                print(item)
    
        # 循环爬取所有弹幕 需要传入month的数据 根据视频发布的日期到现在的所有月份
        def parse_date_url(self, month):
            print('正在爬取{}月份的数据'.format(month))
            # 存放爬到的数据
            result = []
            # 获取视频的oid
            oid = self.get_cid()
            # 获取日期索引
            date_by_month = requests.get(url=self.index_url.format(oid, month), headers=self.date_headers).json().get(
                'data')
            # 根据日期索引循环请求
            if date_by_month:
                for day in date_by_month:
                    print('{}月份数据下的{}'.format(month, day))
                    # 注意还是二进制文件
                    date_page = requests.get(url=self.date_url.format(oid, day), headers=self.date_headers).content
                    date_data = etree.HTML(date_page)
                    # 解析到到所有的d元素
                    barrage_list = date_data.xpath('//d')
                    # 循环解析数据
                    for barrage in barrage_list:
                        # 获取d元素的p属性值
                        things = barrage.xpath('./@p')[0].split(',')
                        # 获取弹幕内容 并去掉所有空格
                        content = barrage.xpath('./text()')[0].replace(" ", "")
                        item = {'出现时间': things[0], '弹幕模式': things[1], '字体大小': things[2], '颜色': things[3], '发送时间': things[4],
                                '弹幕池': things[5],
                                '用户ID': things[6], 'rowID': things[7], '内容': content}
                        result.append(item)
            # 返回封装好的数据
            return result
    
        # 根据现在的时间遍历所有的月份信息
        def parse_month(self):
            start_day = datetime.datetime.strptime(self.get_video_time(), '%Y-%m-%d')
            end_day = datetime.date.today()
            months = (end_day.year - start_day.year) * 12 + end_day.month - start_day.month
            m_list = []
            for mon in range(start_day.month - 1, start_day.month + months):
                if (mon % 12 + 1) < 10:
                    m_list.append('{}-0{}'.format(start_day.year + mon // 12, mon % 12 + 1))
                else:
                    m_list.append('{}-{}'.format(start_day.year + mon // 12, mon % 12 + 1))
            return m_list
    
        # 舍友指导下的一行代码生成词云 编译器自动格式化了 本质还是一行代码
        def wordCloud(self):
            WordCloud(font_path="C:/Windows/Fonts/simfang.ttf", background_color='white', scale=16).generate(" ".join(
                [c for c in jieba.cut("".join(str((pd.read_csv('{}弹幕池数据集.csv'.format(self.video_name))['内容']).tolist()))) if
                 len(c) > 1])).to_file(
                "{}词云.png".format(self.video_name))
    
    
    if __name__ == '__main__':
        # 输入指定的视频bv号
        bv_id = input('输入视频对应的bv号:')
        # new一个对象
        spider = BarrageSpider(bv_id)
        spider.parse_month()
        # 请求今年1月和去年12月的数据 并合并数据
        word_data = []
        months = spider.parse_month()
        # 循环遍历爬取
        for month in months:
            word = spider.parse_date_url(month)
            word_data.extend(word)
        # 数据格式化处理 并输出csv格式文件
        data = pd.DataFrame(word_data)
        data.drop_duplicates(subset=['rowID'], keep='first')
        # 字符集编码需要为utf-8-sig 不然会乱码
        data.to_csv('{}弹幕池数据集.csv'.format(spider.video_name), index=False, encoding='utf-8-sig')
        # # 生成词云
        spider.wordCloud()
    
    

    运行结果

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这里只有十八万行…是因为刚开始测试的时候忘记在月份前加0。代码里已经更正。
    更正后 爬取了骚猪的视频:
    在这里插入图片描述
    视频上显示16万弹幕,实际则有67万,而且爬到19年后,获取的都为空数据,预测实际弹幕有100万左右。
    在这里插入图片描述
    在这里插入图片描述

    可以通过多账号的方式爬取完整弹幕,这里就不做了。

    展开全文
  • 所以我就写了个爬虫把弹幕爬下来,看看到底有多少个宝藏,然后顺便添加了一个词云的功能。 第三方库 界坝 词云 xml文件 用法 直接运行程序,输入网址和视频的oid,oid号应该是B站视频的唯一编码,按f12找到list.so...
  • 效果输入要爬取的视频的BV号即可爬取该视频的弹幕。过程基本思路基本的思路很简单,还是老步骤:1、构造爬取的url2、解析返回的数据3、使用json或Xpath或正则表达式提取数据4、保存数据寻找url地址第一步刚开始还是...

    效果

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

    20200325153353951203.png

    过程

    基本思路

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

    1、构造爬取的url

    2、解析返回的数据

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

    4、保存数据

    寻找url地址

    第一步

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

    20200325153354220717.png

    第二步

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

    20200325153354613270.png

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

    第三步

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

    20200325153354950163.png

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

    20200325153355099567.png

    第四步

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

    20200325153356359252.png

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

    20200325153356461785.png

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

    20200325153356568223.png

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

    20200325153356872891.png

    现在的思路

    现在思路就很清晰了

    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中的中,取出即可

    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()

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

    原文:https://www.cnblogs.com/wuren-best/p/12566297.html

    展开全文
  • https://blog.csdn.net/skylibiao/article/details/119060357?spm=1001.2014.3001.5502
  • python爬取b站弹幕并进行数据可视化

    千次阅读 多人点赞 2019-11-22 19:19:21
    python爬取b站弹幕并进行数据可视化 1.第一步,爬取b站弹幕 我们随便打开一个b视频 打开开发者模式,在network下搜索list,可以找到该视频的弹幕文件 打开之后是这个样子的 结构还是比较简单的,我们后续爬取...
  • 前几天突发奇想要爬取B站弹幕,于是简单在网上找到了B弹幕API,关于如何获取B的接口这里不再赘述,本文主要集中解决我在此开发过程中所遇到的难题。(采用okhttp) 开始的时候,我是想直接爬取B站弹幕...
  • 用宋浩老师的视频爬取弹幕数据,然后做成词云显示
  • 此资源为对B站的视频弹幕进行爬取,并对弹幕内容进行处理后,使用词云图的可视化技术进行可视化的完整案例,有什么问题欢迎提问。
  • 闲的没事学着用Python做了一个爬弹幕的,然后可以生成词云,做着玩。。。想要就拿走吧。。。好麻烦啊,为什么CSDN摘要必须大于五十字
  • 求教emmmmmm <p>1、源网页查看显示乱码(改过网页编码方式也不行) <p>2、代码输出也改过编码方式,也是乱码。 <p><img alt="" height="597" src=...
  • 爬虫爬取b站弹幕遇到乱码问题

    千次阅读 2021-01-12 20:51:41
    今天在b站爬取弹幕的时候发现爬取弹幕是乱码。最后发现是编码问题。 综合整理如下: #首先准备request库和lxml库 import requests from lxml import etree #b站网址 url=...
  • 作者:叶庭云,... 一、分析网页 二、获取弹幕数据 三、绘制词云图 ... ... ...点击弹幕列表,查看历史弹幕,并选择任意一天的历史弹幕,此时就能找到存储该日期弹幕的ajax数据包,所有弹幕数据放在一个i标签里。 .
  • 在学习过程中,可以发现,对于xml类型的响应,了解到的方式lxml和bs解析器。 frombs4importBeautifulSoup #主要使用BeautifulSoup类 事实上可以认为:HTML文档和标签树,... Beautiful Soup库解析器: ...
  • 爬取b站弹幕

    千次阅读 2020-02-08 21:59:18
    爬取b站弹幕 前段时间爬取了b弹幕,现在记录一下心得体会 前期准备 HTML解析 找到弹幕所在的json响应文件,发现里面有1000多条实时弹幕 分析参数: 只有视频的主键标识 oid 变法找到 oid 抓取下来(我是想着...
  • 大家好,我是天空之城,今天给大家带来,爬取B站弹幕制作词云图。 以下内容部分来自公众号数据分析与统计学之美,号主是大牛,有需要的加他。 首先打开一个b视频https://www.bilibili.com/video/BV1PK4y1b7dt?t=1...
  • all_text.append(i) #得到弹幕内容 f = open('danmu_info.csv', 'w', encoding='utf-8') csv_writer = csv.writer(f) csv_writer.writerow(["时间", "弹幕模式", "字号大小", "颜色", "Unix格式时间戳", "弹幕种类",...
  • Python3爬取B站视频弹幕 本文通过8个步骤教你如何使用Python3爬取B站的视频弹幕,快往下看看吧。 需要准备的环境: 一个B账号,需要先登录,否则不能查看历史弹幕记录 联网的电脑和顺手的浏览器,我用的Chrome ...
  • python爬取B站弹幕

    2021-09-05 19:14:31
    文章目录 1.所需库 2.cid的获取 3.源代码 1.所需库 requests:用于发送http请求 BeautifulSoup:用于解析html文档,便于之后的到导航和查找 pandas:用于对数据的处理,创建数据电子表格 2.cid的获取: ...
  • 网上看到的爬取教程接口大都失效了,这次自己整一下,就当学习笔记了自己在寻找弹幕的时候耗了很长时间,老想在视频上找到弹幕的加载地址……其实弹幕就在右边1.png其实好多实现还是利用原来的代码如下:from ...
  • 先来思考一个问题,B站一个视频的弹幕最多会有多少? 比较多的会有2000条吧,这么多数据,B站肯定是不会直接把弹幕和这个视频绑在一起的。 也就是说,有一个视频地址为https://www.bilibili.com/video/av67946325,...
  • 通过这次B站弹幕爬取分析,我现在可以肯定的是《爱5》依然会有很多人看。只要片方挥舞着“十年怀旧,挥别青春”的大旗便会无往不利,这也是他们的底气所在。   其实我理解大家只是想要一个结局。   但《爱5》...
  • 这篇文章我们将借助b的api来爬取B站视频的弹幕 相关文章请看 从零开始的爬虫生涯(二):爬取小姐姐的照片② 从零开始的爬虫生涯(三):爬取小姐姐的照片③ 需要爬取的页面展示 思路分析 1.页面源码分析 首先...
  • 爬取B站弹幕做折线图

    2021-08-07 21:35:58
    爬取B站弹幕做折线图 由于网站更新较快,仅供参考学习 pip install +“库名” (安装库) # 1. 分析网页,找到弹幕所在网页位置; # 2. 向网页发送请求,获取网页代码; # 3. 解析网页,提取弹幕发布时间; # 4. 将...
  • 琵琶的小姐姐是我学python的动力啊啊啊
  • 如何爬取B站弹幕

    2020-11-22 17:35:36
    前言主要记录自己完成爬虫的思路:从how to do到what to do这是一个拿 python 练手的项目,虽说是入门级,... 弹幕究竟是什么玩意首先,让我们看看B站客户端是如何接收到弹幕的这就需要让我们看看网页的源代码了随便...

空空如也

空空如也

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

爬取b站弹幕