文章目录

  • 一.准备工作
    • 1.工具
  • 二.思路
    • 1.整体思路
    • 2.爬虫思路
  • 三.分析网页
    • 1.分析网页加载方式
    • 2.分析数据接口
    • 3.获取oid
  • 四.撰写爬虫
  • 五.存储数据
  • 六.总结

你爱我,我爱你,蜜雪冰城甜蜜蜜…最近被蜜雪冰城的宣传洗脑了,相关视频播放量很高,b站视频评论区都是人才说话好听,写个爬虫爬取一下b站评论区用户信息和评论内容。(修改于2021-06-25)

一.准备工作

1.工具

(1)Chrome 谷歌浏览器 安装地址:https://www.google.cn/chrome/ (插件:json-handle 下载地址:http://jsonhandle.sinaapp.com/,json-handle安装方法:

https://blog.csdn.net/xb12369/article/details/79002208

用于分析网页结构
(2)python 3.x 安装地址:https://www.python.org/ 用于编写代码,开发工具:JetBrains PyCharm Professional下载地址:https://www.jetbrains.com/pycharm/
(3)Mongodb 数据库存储数据 安装地址:https://www.mongodb.com/try/download/community, 数据库可视化工具MongoDB Compass 用于动态管理数据库,安装教程详见:

https://blog.csdn.net/weixin_41466575/article/details/105326230

二.思路

1.整体思路

2.爬虫思路

三.分析网页

要想写好爬虫,一定要先把网页结构分析透彻。

1.分析网页加载方式

我们要爬取用户信息和评论,所以先打开一个视频。

鼠标右击 查看源代码 ,在源代码中搜索相关评论内容,并没有找到相关数据,可以判断此页面为ajax异步加载数据渲染出来的。

2.分析数据接口

回到视频页面F12打开开发者工具,刷新一下,ctrl+f搜索一下,发现评论数据都在这个json中。

这个json指向了下面这个接口地址:

https://api.bilibili.com/x/v2/reply?callback=jQuery1720631904798407396_1605664873948&jsonp=jsonp&pn=1&type=1&oid=248489241&sort=2&_=1605664874976

使用jsonhandle查看这个json可以看到用户信息在member里,评论信息在message里。

回到这个接口,此接口需要传以下参数:

callback: jQuery1720631904798407396_1605664873948  #经测试可以不传
jsonp: jsonp  #经测试可以不传
pn: 1  #页码标识
type: 1  #所属类型
oid: 248489241  #视频标识,现在确定为视频av号
sort: 2  #所属分类
_: 1605664874976  #当前时间戳,经测试可以不传

通过分析发现关键参数为oid和pn,sort,个人猜测oid为视频标识,pn为评论所在页数,sort为类别,我们要获取到oid。

3.获取oid

如果视频url类似

https://www.bilibili.com/video/BV1wv41157Rr

则需要将BV号转化为av号
如果视频url类似

https://www.bilibili.com/video/av248489241

直接使用字符串切割出av后面的数字就可以啦。

这样我们就把视频评论信息加载方式、加载接口搞清楚了,可以去撰写爬虫了。

四.撰写爬虫

废话不说,直接上源码

import requests
import os
import re
import json
import pymongo
import time"""    test=  https://www.bilibili.com/video/BV1wv41157Rr?from=search&seid=6132990751586623785
"""class BCommentParse(object):def __init__(self,base_url):self.headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'}self.base_url=base_urldef my_init(self):id = self.base_url.split('video/')[-1].split('?')[0]if id.startswith('av'):id = id.split('av')[-1]self.oid = self.get_avid_title(id)else:self.oid = self.get_avid_title(id, av=False)self.set_page()def get_avid_title(self,id_number,av=True):"""获取av号以及视频标题:param id_number: av/bv号:param av: 是否为av号:return: av号"""if av==True:api=f'https://api.bilibili.com/x/web-interface/view?aid={id_number}'else:api=f'https://api.bilibili.com/x/web-interface/view?bvid={id_number}'r=requests.get(api,headers=self.headers)_json=json.loads(r.text)self.video_title=_json['data']['title']avid=_json['data']['aid']return aviddef set_page(self):"""配置数据库:return:"""host = '127.0.0.1'port = 27017myclient = pymongo.MongoClient(host=host, port=port)mydb = 'Bilibili'sheetname = self.video_titledb = myclient[mydb]self.post = db[sheetname]def parse_comment(self):self.my_init()base_url=f'https://api.bilibili.com/x/v2/reply?jsonp=jsonp&type=1&oid={self.oid}&sort=2'n=0url=base_url+'&pn={}'headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'}try:while True:r=requests.get(url.format(n),headers=headers)_json=json.loads(r.text)replies=_json.get('data').get('replies')item={}n+=1if len(replies)!=0:print(f'\033[34;47m--------------------正在爬取{n}页--------------------')for replie in replies:item['user_id']=replie.get('member').get('mid')#用户iditem['user_name']=replie.get('member').get('uname')#用户名item['user_sex']=replie.get('member').get('sex')#性别item['user_level']=replie.get('member').get('level_info').get('current_level')#等级vip=replie.get('member').get('vip').get('vipStatus')#是否vipif vip==1:item['user_is_vip']='Y'elif vip==0 :item['user_is_vip']='N'comment_date=replie.get('member').get('ctime')#评论日期timeArray = time.localtime(comment_date)otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)item['apprecate_count']=replie.get('like')#点赞数item['reply_count']=replie.get('rcount')#回复数item['comment_date']=otherStyleTimeitem['comment']=replie.get('content').get('message')#评论内容#判断数据库中有无此文档,也可用于断点续res=self.post.count_documents(item)if res==0:data = dict(item)self.post.insert(data)print(f'\033[35;46m{item}\033[0m')else:print('\033[31;44m pass\033[0m')time.sleep(0.5)else:print(f'\033[31;44m--------------------程序在第{n}页正常退出!--------------------\033[0m')breakexcept:passif __name__ == '__main__':video_url='https://www.bilibili.com/video/BV1wv41157Rr?from=search&seid=6132990751586623785'if video_url.startswith('https://www.bilibili.com/video/'):b=BCommentParse(video_url)b.parse_comment()else:print('请输入正确地址!')

这里要说一下,开始我简单判断了一下输入内容,而且我并没有将api所有参数都传过去,像_这样的时间戳可以用time.time()去构造,用户信息的话,可以按需去抽取。

控制台一直在输出数据,直到结束。

五.存储数据

数据存储,我选择mongodb数据库,您可以自行选择存储方式。

一共1w3千多条,您可自行选择导出数据为json或者csv格式。

六.总结

  • 本次爬取的是b站视频评论用户信息和评论数据,不只适用于代码所示视频,是通用的,修改网址或者av/BV号就行。b站对ip访问频率有限制,所以保险起见,加入了限速,此爬虫的重点在于寻找评论api接口,url构造完成以后数据抽取就简单容易了,一共1w3千多条数据,思路、代码方面有什么不足欢迎各位大佬指正、批评!

python3网络爬虫--爬取b站视频评论用户信息(附源码)相关推荐

  1. 爬取b站视频评论用户信息!这些评论的才是大神!

    最近马保国老师在b站挺火的,关于他的视频播放量很高,b站视频评论区都是人才说话好听,写个爬虫爬取一下b站评论区用户信息和评论内容. 一.准备工作 1.工具 (1)Chrome 谷歌浏览器 安装地址:h ...

  2. python3网络爬虫--爬取b站用户投稿视频信息(附源码)

    文章目录 一.准备工作 1.工具 二.思路 1.整体思路 2.爬虫思路 三.分析网页 1.分析数据加载方式 2.分词接口url 3.分析用户名(mid) 四.撰写爬虫 五.得到数据 六.总结 上次写了 ...

  3. 简单的爬取B站视频评论

    2019年12月20日15:14:09补充: 这篇博客为刚学爬虫的一个简单实践,主要使用到的为selenium模拟点击 补充说明的主要原因是有小伙伴问我评论提取的相关问题,这里统一回复一下 最简单的办 ...

  4. python爬取b站评论_学习笔记(1):写了个python爬取B站视频评论的程序

    学习笔记(1):写了个python爬取B站视频评论的程序 import requests import json import os table='fZodR9XQDSUm21yCkr6zBqiveY ...

  5. python爬b站评论_学习笔记(1):写了个python爬取B站视频评论的程序

    学习笔记(1):写了个python爬取B站视频评论的程序 import requests import json import os table='fZodR9XQDSUm21yCkr6zBqiveY ...

  6. Python爬虫 爬取腾讯视频评论内容

    Python爬虫 爬取腾讯视频评论内容 腾讯视频评论内容在源码里是不可见,所以要使用抓包分析. 可安装fiddler代理服务器实现. 下面爬了腾讯视频评论内容(不包括回复),及发表评论者的id.昵称和 ...

  7. 曝肝三天,两千行Python代码,制作B站视频下载工具(附源码)

    曝肝三天,两千行Python代码,制作B站视频下载工具(附源码) 文章目录 一.准备工作 二.预览 1.启动 2.解析 3.下载中 4.下载完成 5.结果 三.设计流程 1.bilibili_vide ...

  8. 年轻小伙竟用python爬取B站视频评论!

    大家好,我是啃书君. 今天为大家带来的小demo是爬取B站视频的评论.开始还以为很难,等正真上手的时候发现,也就是那么回事. 高考对于每个人来说都是人生的重大转折点,你考上一所什么样的大学,极大可能改 ...

  9. 将白嫖进行到底?简单爬虫爬取B站视频

    文章目录 起因 一步步实现 方法一 方法二 代码 结果 最后 起因 作为一个B站的忠实粉丝,每天睡前和起床刷一下视频那是必须的.不过一般我都是在手机上刷,昨天用电脑刷的时候本来想下载一个视频,但是发现 ...

最新文章

  1. linux怎么使多条命令同时执行
  2. Bailian2688 求字母的个数【输入流】
  3. 【node】-----简单介绍 nodejs
  4. mysql initialsize,单机数据库优化
  5. java 加锁_Java中的重重“锁”事
  6. 多目标跟踪算法 | FairMOT
  7. 运放参数SR(压摆率)、增益带宽积(GBW)
  8. Baidu Expressive TTS《Multi-reference Tacotron by Intercross Training for Style Disentangling...》
  9. c#语言编写汉诺塔游戏,c#语言编写汉诺塔游戏
  10. 一个简单的连续变焦红外镜头的从零开始的设计过程(zemax)(二)进一步优化,公差分析
  11. 《一年学完mit计算机课程》,用了这种学习方法,他一年学完了33门MIT计算机课程...
  12. 自动生产线实训考核装备
  13. 阿里云云服务器固定带宽和带宽按量付费的区别
  14. mysql数据库自动生成数据库开发设计文档
  15. EasyExcel与EasyPoi性能对比
  16. 使用CSS画一个三角形
  17. window系统静默运行批处理
  18. 佳能lbp623cdn硒鼓_佳能Canon LBP623Cdn 驱动
  19. house of apple1
  20. 南阳理工计算机专业在全国排第几,南阳理工学院怎么样 2021年全国排名多少

热门文章

  1. 只要是腰疼就是患上腰肌劳损了吗?
  2. python之进程和线程(二)
  3. jQuery字符串拼接
  4. Android MVVM探究(一)
  5. 【Rosalind】Finding a Protein Motif – 正则表达式的使用
  6. 不是有效的win32程序_豪横!程序员搭个人博客,一个 GitHub 账号足矣!
  7. 【大数据存储与处理】
  8. 解决部署报错No main manifest attribute, in XXX.jar
  9. disposal disposable
  10. 发现安全隐患的“火眼金睛” —— 新华三荣获2016年漏洞信息报送突出贡献单位...