作者 | 周萝卜

来源 | 萝卜大杂烩

最近想爬下B站的弹幕和评论,发现网上找到的教程基本都失效了,毕竟爬虫和反爬是属于魔高一尺、道高一丈的双方,程序员小哥哥们在网络的两端斗智斗勇,也是精彩纷呈。

当然了,对于爬虫这一方,爬取网站数据,一般目的都是比较明确的,比如我这里就是为了冰冰,废话不多说,开干!

获取弹幕数据

这里先声明一点,虽然网络上的整体教程都失效了,但是有一些步骤还是可以参考的,比如我们可以知道,对于弹幕数据,我们是可以通过如下的一个接口来获取的

https://comment.bilibili.com/xxxx.xml

在浏览器打开可以看到如下:

数据还是非常干净的,那么下一步就是看如何获取这个 xml 的 url 地址了,也就是如何获取 324768988 ID

接下来我们搜索整个网页的源码,可以发现如下情况

也就是说,我们需要的 ID 是可以在 script 当中获取的,下面就来编写一个提取 script 内容的函数

def getHTML_content(self):# 获取该视频网页的内容response = requests.get(self.BVurl, headers = self.headers)html_str = response.content.decode()html=etree.HTML(html_str)result=etree.tostring(html)return resultdef get_script_list(self,str):html = etree.HTML(str)script_list = html.xpath("//script/text()")return script_list

拿到所有的 script 内容之后,我们再来解析我们需要的数据

script_list = self.get_script_list(html_content)
# 解析script数据,获取cid信息
for script in script_list:if '[{"cid":' in script:find_script_text = script
final_text = find_script_text.split('[{"cid":')[1].split(',"page":')[0]

最后,我们再把整体代码封装成一个类,就完成了弹幕抓取的数据收集工作了

spider = BiliSpider("BV16p4y187hc")
spider.run()

结果如下:

获取评论数据

对于评论数据,可能要复杂一些,需要分为主(main)评论和回复主评论的 reply 评论

我们通过浏览器工具抓取网页上的所有请求,然后搜索 reply,可以得到如下结果

我们先来看看 main 请求,整理后通过浏览器访问如下

也可以直接通过 requests 请求

通过观察可以得知,响应消息里的 replies 就是主评论内容,同时我们还可以改变 url 当中的 next 参数来翻页,进而请求不同的数据

这里我们再关注下 rpid 参数,这个会用于 reply 评论中

再来看看 reply 评论,同样可以使用 requests 直接访问,同时 url 当中的 root 参数就是我们上面提到的 rpid 参数

我们厘清了上面的关系之后,我们就可以编写代码了

def get_data(data):data_list = []comment_data_list = data["data"]["replies"]for i in comment_data_list:data_list.append([i['rpid'], i['like'], i['member']['uname'], i['member']['level_info']['current_level'], i['content']['message']])return data_listdef save_data(data_type, data):if not os.path.exists(data_type + r'_data.csv'):with open(data_type + r"_data.csv", "a+", encoding='utf-8') as f:f.write("rpid,点赞数量,用户,等级,评论内容\n")for i in data:rpid = i[0]like_count = i[1]user = i[2].replace(',', ',')level = i[3]content = i[4].replace(',', ',')row = '{},{},{},{},{}'.format(rpid,like_count,user,level,content)f.write(row)f.write('\n')else:with open(data_type + r"_data.csv", "a+", encoding='utf-8') as f:for i in data:rpid = i[0]like_count = i[1]user = i[2].replace(',', ',')level = i[3]content = i[4].replace(',', ',')row = '{},{},{},{},{}'.format(rpid,like_count,user,level,content)f.write(row)f.write('\n')for i in range(1000):url = "https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid=972516426&mode=3&plat=1&_=1632192192097".format(str(i))print(url)d = requests.get(url)data = d.json()if not data['data']['replies']:breakm_data = get_data(data)save_data("main", m_data)for j in m_data:reply_url = "https://api.bilibili.com/x/v2/reply/reply?jsonp=jsonp&pn=1&type=1&oid=972516426&ps=10&root={}&_=1632192668665".format(str(j[0]))print(reply_url)r = requests.get(reply_url)r_data = r.json()if not r_data['data']['replies']:breakreply_data = get_data(r_data)save_data("reply", reply_data)time.sleep(5)time.sleep(5)

爬取过程中:

这样,针对一个冰冰视频,我们就完成了上千评论的抓取

可视化

下面我们简单做一些可视化动作

先来看下我们爬取的数据整体的样子

因为数据中有一些空值,我们来处理下

df_new = df.dropna(axis=0,subset = ["用户"])  

下面就可以作图了,GO!

使用 pyecharts 还是我们的首选,毕竟编写容易

评论热度

df1 = df.sort_values(by="点赞数量",ascending=False).head(20)c1 = (Bar().add_xaxis(df1["评论内容"].to_list()).add_yaxis("点赞数量", df1["点赞数量"].to_list(), color=Faker.rand_color()).set_global_opts(title_opts=opts.TitleOpts(title="评论热度Top20"),datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")],).render_notebook()
)

等级分布

pie_data = df_new.等级.value_counts().sort_index(ascending=False)
pie_data.tolist()
c2 = (Pie().add("",[list(z) for z in zip([str(i) for i in range(6, 1, -1)], pie_data.tolist())],radius=["40%", "75%"],).set_global_opts(title_opts=opts.TitleOpts(title="等级分布"),legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"),).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")).render_notebook()
)

评论词云

def wordcloud(data, name, pic=None):comment = jieba.cut(str(data), cut_all=False)words = ' '.join(comment)img = Image.open(pic)img_array = np.array(img)wc = WordCloud(width=2000, height=1800, background_color='white', font_path=font, mask=img_array,stopwords=STOPWORDS, contour_width=3, contour_color='steelblue')wc.generate(words)wc.to_file(name + '.png')wordcloud(df_new["评论内容"], "冰冰", '1.PNG')

最新的B站弹幕和评论爬虫,你们要的冰冰来啦!相关推荐

  1. 爬虫数据云词图片怎么做?小姐姐教你用python做B站弹幕爬虫,并进行数据分析生成词云

    hello大家好,我是你们的可爱丸,大家平时在B站看视频时有没有开弹幕的习惯呢?如果不把视频从头看到尾,那么多弹幕,我们怎么快速的知道大家都说了些什么并且持有什么观点呢? 今天小姐姐就教你做一个简单的 ...

  2. python弹幕代码_只需3 行代码就可以获取B站(弹幕、评论、用户)数据

    在今年5月份,我写了一篇爬取B站视频的文章,今天给大家介绍一个获取B站数据的Python扩展库-bilibili_api,可以获取的数据包括: video-视频模块 user-用户模块 dynamic ...

  3. 3行Python代码采集B站(弹幕、评论、用户)数据

    今天介绍一个获取B站数据的Python扩展库-bilibili_api 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例 ...

  4. bilibili_api,仅用 3 行代码获取B站(弹幕、评论、用户)数据

    今天介绍一个获取B站数据的Python扩展库-bilibili_api 可以获取的数据包括: video-视频模块 user-用户模块 dynamic-动态模块 这次用"Running Ma ...

  5. 某站弹幕抓取,视频,评论......

    现在某站的内容也可以爬取了,包括弹幕,评论,点赞,投币的功能.........,给大家介绍一个方便的库,方法如下: 第一步:安装 pip3 install bilibili-api-python Py ...

  6. python爬虫和定位_Python网络爬虫实战,照片定位与B站弹幕!

    之前两篇已经说完了如何爬取网页以及如何解析其中的数据,那么今天我们就可以开始第一次实战了. Python资源共享群:626017123 这篇实战包含两个内容. * 利用爬虫调用Api来解析照片的拍摄位 ...

  7. python爬虫和定位_Python网络爬虫实战(三)照片定位与B站弹幕

    之前两篇已经说完了如何爬取网页以及如何解析其中的数据,那么今天我们就可以开始第一次实战了. 这篇实战包含两个内容. * 利用爬虫调用Api来解析照片的拍摄位置 * 利用爬虫爬取Bilibili视频中的 ...

  8. 爬虫----b站弹幕

    爬取B站弹幕数据的API:https://api.bilibili.com/x/v1/dm/list.so?oid=XXX 方法一:获取oid 我们要想知道这个oid是什么,首先要获取到cid.弹幕数 ...

  9. Python3 (爬虫实践)[BeautifulSoup + Selenium] 爬取B站用户名和评论,并且按照条件进行抽奖

    爬取B站用户和评论,并且按照条件进行抽奖 一.前言 二.总思路 1.爬取需要的内容 2.整理数据并进行抽奖 三.爬虫 1. 选择库 2. 引用库 3. 设置Selenium参数 4.爬取数据: 5.保 ...

最新文章

  1. python浏览器自动化测试库【2018/7/27-更新】
  2. 对cocos2dx引擎的改动
  3. visual studio 2019安装配置可编写c/c++语言的IDE环境
  4. 解决ORACLE被锁定的资源两法
  5. Collection(单列集合)
  6. UBB代码相关内容的收藏
  7. AtCoder Regular Contest 102 (ARC102) E - Stop. Otherwise... 排列组合
  8. 三角矩阵的逆矩阵怎么求_「线性代数」求可逆矩阵P,使得相似矩阵对角化
  9. java去掉边框_java swing怎么去掉边框
  10. 多种方法对网页文字进行快速复制(仅供学习使用,勿践踏他人成果)
  11. mysql全文索引是什么_Mysql中的全文索引
  12. CF14A Letter(模拟+字符串)(C++题解)(大佬勿喷)
  13. java砍价源码_(JAVA)仿拼多多砍价算法
  14. 删除 Windows 文件资源管理器左侧 OneDrive 图标
  15. 性能测试报告(入门)
  16. 查寝 | c++ | 不用双向链表(上篇)
  17. 判断输入字符是否是字母c语言,用C语言编程:判断输入的一个字符是否为英文字母...
  18. Cisco思科命令速查
  19. 为什么无法链接mysql_为什么不能连接到SQL数据库?
  20. 折叠始祖摩托罗拉,困于“性价比”折叠屏

热门文章

  1. Go 1.12发布:改进了运行时性能以及模块支持
  2. java中如何应对读改写场景
  3. bzoj2724: [Violet 6]蒲公英(分块)
  4. 15-shell 输入/输出重定向
  5. Hadoop生态圈-Flume的组件之自定义拦截器(interceptor)
  6. asp.net文件上传下载的简单实现
  7. 【HDOJ】3275 Light
  8. 常用的 linux命令
  9. 用VS2005打开方案出现“此安装不支持该项目类型”
  10. Spring Cloud(九)高可用的分布式配置中心 Spring Cloud Config 集成 Eureka 服务