精华内容
下载资源
问答
  • python爬虫爬取b站弹幕
    千次阅读 多人点赞
    2021-01-24 11:33:37

    只用改网站就可以。
    非常方便。

    # -*- codeing = utf-8 -*-
    # @Time : 2021/1/23 18:40
    # @Author : 老七疯狂吸氧
    # @file bilibili.py
    # @Software:PyCharm
    
    import re
    import requests
    def main():
    
        url = "https://www.bilibili.com/video/BV1kh411y78a"    #此处个更换网址,只适用与哔哩哔哩的视频
    
        datalist = get_html(url)
        cid = saveurl(datalist)
        dmurl='https://comment.bilibili.com/'+cid+'.xml'
        datalist = get_Html(dmurl)
        list=datalist.content.decode("utf-8")
        savelist(list)
    def get_html(url):         #一次请求
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
        }         #请输入你个人的User-Agent
        response = requests.get(url, headers=headers)
        return response.text
    def get_Html(url):        #二次请求
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
        }         #请输入你个人的User-Agent
        response = requests.get(url, headers=headers)
        return response
    def saveurl(baseurl):     #获取cid
        findlink=re.compile(r'"cid":(.*?),"bvid":')
        cid = re.findall(findlink,baseurl)
        cid = list(cid)[1]
        return cid
    def savelist(list):
        danmu = re.compile(r'<d p=".*?">(.*?)</d>')
        File = open("B站弹幕.txt", "w", encoding="utf-8")
        data = re.findall(danmu,list)
        for i in data:
            File.writelines(i)
            File.writelines("\n")
        File.close()
    if __name__ =="__main__":
        main()
        print("爬取完毕")
    
    更多相关内容
  • 主要介绍了Python爬虫爬取Bilibili弹幕过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • python爬取B站弹幕

    2021-09-05 19:14:31
    文章目录 1.所需库 2.cid的获取 3.源代码 1.所需库 requests:用于发送http请求 BeautifulSoup:用于解析html文档,便于之后的到导航和查找 pandas:用于对数据的处理,创建数据电子表格 2.cid的获取: ...

    文章目录


    1.所需库
    2.cid的获取
    3.源代码

    1.所需库

    1. requests:用于发送http请求
    2. BeautifulSoup:用于解析html文档,便于之后的到导航和查找
    3. pandas:用于对数据的处理,创建数据电子表格
      2.cid的获取:
      点击F12在右端获取在这里插入图片描述

    3.源代码如下:

    import numpy as np
    from PIL import Image
    from bs4 import BeautifulSoup
    url="http://comment.bilibili.com/cid.xml"
    req = requests.get(url)
    html=req.content
    html_doc = str(html,"utf-8")
    #解析
    soup = BeautifulSoup(html_doc,'html.parser')
    results = soup.find_all('d')
    #x.text表示要放到contents中的值
    contents = [x.text for x in results]
    #保存结果
    dic ={"contents" : contents}
    #用字典创建了一个电子表格
    df = pd.DataFrame(dic)
    #把内容写到bili.csv中
    df["contents"].to_csv("hetongxue.csv",encoding="utf-8",index=False)
    
    展开全文
  • 运行程序,输入Bvid和爬取日期;程序运行完成后会在当前文件夹下生成一个csv格式文件。
  • 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万左右。
    在这里插入图片描述
    在这里插入图片描述

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

    展开全文
  •  今天我们的爬虫内容是bilibili视频弹幕爬取,并保存到本地为JSON格式,正常爬虫只需要发送请求,解析相应内容,而爬取bilibili的内容,视频弹幕并没在响应的html中,而是保存在一个响应的url中,以XML格式保存,...
  • 这篇文章主要介绍了Python爬虫爬取Bilibili弹幕过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先来思考一个问题,B站一个视频的弹幕最多会有多少? ...
  • python3爬取B站视频历史弹幕

    热门讨论 2021-07-29 17:51:50
    python爬取B站视频历史弹幕演示 演示 1.运行程序,输入Bvid和爬取日期。 2.程序运行完成后会在当前文件夹下生成一个csv格式文件。

    python爬取B站视频历史弹幕

    演示

    1.运行程序,输入Bvid和爬取日期。
    程序运行输入

    2.程序运行完成后会在当前文件夹下生成一个csv格式文件。
    程序运行结果
    百度网盘链接: https://pan.baidu.com/s/1jhLWjtWlenY4JIdP4w91FA
    提取码: hjm5

    完毕~


    由于本人不经常上CSDN,刚看到大家的问题 抱歉~

    根据大家的问题,通过检查代码运行状况,发现在解析弹幕ProtoBuf格式中会产生错误,所以更新一下了代码,在此贴一下代码供大家学习参考:)

    在爬取弹幕中需要用到两个py文件:Bztm_pb2.pyB站爬取弹幕.py(需放在同一个文件夹下)

    Bztm_pb2.py的作用是为解析弹幕seg.so文件提供支持,它的代码是通过Protoc生成的,代码太多了就不粘贴代码了 (下载链接: https://pan.baidu.com/s/1BSTp-96VlCi5XZApfZELjA 提取码: 2ess )

    B站爬取弹幕.py的作用就是下载弹幕文件->解析文件->保存为csv文件,代码如下:

    import requests
    import re
    from Bztm_pb2 import DmSegMobileReply
    import json
    from google.protobuf.json_format import MessageToJson
    import csv
    import os
    import datetime
    from tqdm import tqdm
    import time
    
    '获取弹幕api:https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=252900431&date=2021-05-20'
    orgin_url='https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid={}&date={}'
    
    
    #获取cid
    def get_cid(bvid):
        video_url = 'https://www.bilibili.com/video/' + bvid
        page = requests.get(video_url, headers=header).text
        cid = re.search(r'"cid":[0-9]+', page).group()[6:]
        return cid
    
    #生成日期序列
    def create_assist_date(datestart = None,dateend = None):
    	# 创建日期辅助表
    
    	if datestart is None:
    		datestart = '2016-01-01'
    	if dateend is None:
    		dateend = datetime.datetime.now().strftime('%Y-%m-%d')
    
    	# 转为日期格式
    	datestart=datetime.datetime.strptime(datestart,'%Y-%m-%d')
    	dateend=datetime.datetime.strptime(dateend,'%Y-%m-%d')
    	date_list = []
    	date_list.append(datestart.strftime('%Y-%m-%d'))
    	while datestart<dateend:
    		# 日期叠加一天
    	    datestart+=datetime.timedelta(days=+1)
    	    # 日期转字符串存入列表
    	    date_list.append(datestart.strftime('%Y-%m-%d'))
    	return date_list
    
    
    #获取日期输入
    def get_dates():
    	des=input('输入爬取弹幕的“开始日期 结束日期”:')
    	dates=des.split()
    	date_list=create_assist_date(dates[0],dates[-1])
    	return date_list
    
    #时间戳转换成日期
    def get_time(ctime):
        timeArray = time.localtime(int(ctime))
        otherStyleTime = time.strftime("%Y.%m.%d", timeArray)
        return str(otherStyleTime)
    
    #时间戳转换成时间
    def get_time2(t):
        t1 = float(t)/1000
        t2 = time.localtime(t1)
        t3 = time.strftime("%M:%S", t2)
        return t3
    
    if __name__=='__main__':
    	##第一个运行软件创建设置文件
    	f_path = os.getcwd()
    	fnames = os.listdir(f_path)
    
    	if 'cookie.init' not in fnames:
    		cookie= input('请输入cookie:')
    		with open(r'cookie.init', 'w+', encoding='utf8') as f:
    			f.writelines(cookie)
    			f.close()
    	else:
    		with open(r'cookie.init', 'r', encoding='utf8') as f:
    			cookie = f.readline()
    			f.close()
    	header = {
            'accept': '*/*',
    		'Cookie': cookie,
            'accept-encoding': 'gzip, deflate, br',
            'accept-language': 'zh-CN,zh;q=0.9',
            'origin': 'https://www.bilibili.com',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
        }
    	bvid=input('输入Bvid:')
    	cid = get_cid(bvid)
    	dates=get_dates()
    	fname = bvid + '_弹幕.csv'
    	with open(fname, 'w+', newline='', encoding='utf_8_sig') as f:
    		csv_writer = csv.writer(f)
    		csv_writer.writerow(["时间","弹幕", "发送时间"])
    		for ditem in tqdm(dates):
    			url=orgin_url.format(cid,ditem)
    			try:
    				html = requests.request(url=url, method='get', headers=header)
    			except:
    				print(ditem,':爬取获取数据失败')
    				continue
    			DM = DmSegMobileReply()
    			DM.ParseFromString(html.content)
    			data_json = json.loads(MessageToJson(DM))
    			for i in data_json['elems']:
    				try:
    					ctime = get_time(i['ctime'])
    					message = i['content']
    					ptime = get_time2(i['progress'])
    				except:
    					continue
    				csv_writer.writerow([ptime, message, ctime])
    			time.sleep(5)
    		f.close()
    
    

    运行效果如下:

    在这里插入图片描述
    在这里插入图片描述

    完整的代码下载如下:

    链接: https://pan.baidu.com/s/1AHOxKA8ymddwXuBE3b0m5A
    提取码: x774

    完毕~

    展开全文
  • 爬虫爬取b站弹幕遇到乱码问题

    千次阅读 2021-01-12 20:51:41
    今天在b站爬取弹幕的时候发现爬取弹幕是乱码。最后发现是编码问题。 综合整理如下: #首先准备request库和lxml库 import requests from lxml import etree #b站网址 url=...
  • 用宋浩老师的视频爬取弹幕数据,然后做成词云显示
  • python源码集锦-爬取bilibili弹幕消息
  • Python爬虫入门教程01:豆瓣Top电影爬取 Python爬虫入门教程02:小说爬取 Python爬虫入门教程03:二手房数据爬取 Python爬虫入门教程04:招聘信息爬取 PS:如有需要 Python学习资料 以及 解答 的小伙伴可以加点击...
  • python爬取b站弹幕并进行数据可视化

    千次阅读 多人点赞 2019-11-22 19:19:21
    python爬取b站弹幕并进行数据可视化 1.第一步,爬取b站弹幕 我们随便打开一个b视频 打开开发者模式,在network下搜索list,可以找到该视频的弹幕文件 打开之后是这个样子的 结构还是比较简单的,我们后续爬取...
  • 在进入本文之前,我很想给大家推荐b站这个视频,3080.2万播放,27.9万条弹幕。这个视频之火不是因为漂亮的小姐姐,也不是什么很傻,很逗人发笑的视频,而是因为那满满的正能量,以及对于年轻人的激励,我们要活成...
  • 视频地址:www.bilibili.com/video/BV19E…本身博主同时也是一名up主,虽然已经断更好久了,但是不妨碍我爬取弹幕信息来分析呀。 这次我选取的是自己唯一的爆款视频。就是下面这个。 很多人学习python,不知道从何...
  • 求教emmmmmm <p>1、源网页查看显示乱码(改过网页编码方式也不行) <p>2、代码输出也改过编码方式,也是乱码。 <p><img alt="" height="597" src=...
  • 免费资源网,https://freexyz.cn/最近央视新闻记者王冰冰以清除可爱和...本文以王冰冰视频弹幕为例,向大家介绍Python爬虫实现自动化爬取b站实时弹幕的过程。1、导入需要的库import jieba # 分词from wordcloud impo...
  • https://blog.csdn.net/skylibiao/article/details/119060357?spm=1001.2014.3001.5502
  • 闲的没事学着用Python做了一个爬弹幕的,然后可以生成词云,做着玩。。。想要就拿走吧。。。好麻烦啊,为什么CSDN摘要必须大于五十字
  • Python3爬取B站视频弹幕 本文通过8个步骤教你如何使用Python3爬取B站的视频弹幕,快往下看看吧。 需要准备的环境: 一个B账号,需要先登录,否则不能查看历史弹幕记录 联网的电脑和顺手的浏览器,我用的Chrome ...
  • 所以我就写了个爬虫弹幕爬下来,看看到底有多少个宝藏,然后顺便添加了一个词云的功能。 第三方库 界坝 词云 xml文件 用法 直接运行程序,输入网址和视频的oid,oid号应该是B站视频的唯一编码,按f12找到list.so...
  • 爬取直播间弹幕,生成词云图 一、环境准备: 安装相关第三方库 pip install jieba pip install wordcloud 二、数据准备: 爬取对象:2021年5月23号,RNG夺冠直播间的弹幕信息 爬取对象路径: 方式1、根据开发者工具...
  • Python应用实战代码-爬取综艺《哈哈哈哈哈》弹幕做情感分析
  • 提供python爬取B站历史弹幕详细思路,全部弹幕一览入怀,小伙真的做到了。
  • 一、分析网页 二、获取弹幕数据 三、绘制词云图 ... PS:如有需要Python学习...点击弹幕列表,查看历史弹幕,并选择任意一天的历史弹幕,此时就能找到存储该日期弹幕的ajax数据包,所有弹幕数据放在一个i标签里。 .

空空如也

空空如也

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

python爬虫爬取b站弹幕