爬取b站最火up主及其粉丝信息

news/2025/2/12 16:41:44/

爬取b站最火up主及其粉丝信息


  • 编译环境:python3、Firefox Developer Edition

  • 使用技术:bs4、json、selenium、pymysql

输出预览:

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


代码:链接: https://pan.baidu.com/s/1SSqMrMr_IVni-Tb6Yx40vQ 提取码: hnu6 使用前请修改数据库密码
配套视频教程:https://www.acfun.cn/v/ac14821412,b站不让发只能发a站


实现思路:

查看up主榜单

https://www.kanbilibili.com/rank/ups/fans

在这里插入图片描述
审查元素,可以发现up主的信息都是封装在a标签下的,a的href对应up主的空间
在这里插入图片描述
可以通过

a = soup.find('div', 'ups-list').find_all('a', limit=3)

查询up空间的url,limit来判断想要查询up的个数
想要进入up的空间,我们只需要将a中href用 ‘https:’ + href+’/video’ 拼接即可

查看up主空间

我们选定某个up主的空间 https://space.bilibili.com/326499679/video
在这里插入图片描述
我想要爬取这两块的内容,但是如果直接爬取,返回的数字都是0,我们需要用selenium先进行动态渲染再爬取数据

html = driver.execute_script("return document.documentElement.outerHTML")  # 必须执行js
time.sleep(2)

一定要先休眠两秒等待js运行结束,不然爬到的数据依旧是0

使用渲染库动态爬取关注数、粉丝数、获赞数等

可以看到要爬取的粉丝数、播放数等都在p标签中,我们可以通过id或者class进行爬取
在这里插入图片描述
但是获赞数与播放数id、class都是一样的,我们只能用父节点下第几个元素的形式才能获取到

focus = soup.find('p', 'n-data-v space-attention').text  # 关注数
fans = soup.find('p', 'n-data-v space-fans').text  # 粉丝数
div = soup.find('div', 'n-statistics')
praise = div.contents[2].find('p', 'n-data-v').text  # 获赞数
view = div.contents[3].find('p', 'n-data-v').text  # 播放数

接下来爬分区:
在这里插入图片描述
可以看到分区信息都是在 div 下的 a 标签中,我不需要全部的分区,所有class=“active"我不需要,只要爬取class=”"的,返回的数据是 动画40,我把它拆分成动画,40的形式存入字典中

div = soup.find('div', id='submit-video-type-filter') #分区
a = div.find_all('a', attrs={'class': ''})
dict = {}
for each in a:lstrip = each.text.lstrip()dict[lstrip[0:2]] = int(lstrip[2:])
maxArea = max(zip(dict.values(), dict.keys()))

最后一句是库中方法,目的是返回数值最大的那个键,也就是投稿最多的分区

爬取up的个人信息

找到这个uri
在这里插入图片描述
里面返回的就是up主的信息
​	https://space.bilibili.com/326499679/fans/fans
将curl转换成Python requests

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0','Accept': 'application/json, text/plain, */*','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://space.bilibili.com','Connection': 'keep-alive','Referer': 'https://space.bilibili.com/546195/fans/fans','Cache-Control': 'max-age=0',
}
params = (('mid', str(mid)),('jsonp', 'jsonp'),
)
response = requests.get('https://api.bilibili.com/x/space/acc/info', headers=headers, params=params)

str(mid))代表up主uid,通过以下方法获取json中的数据

	json_obj = json.loads(up.text)up_mid = json_obj['data']['mid']name = json_obj['data']['name']sex = json_obj['data']['sex']sign = json_obj['data']['sign']level = json_obj['data']['level']birthday = json_obj['data']['birthday']title = json_obj['data']['official']['title']

爬取up主粉丝信息

该uri中返回了粉丝的json数据
在这里插入图片描述
在这里插入图片描述
只要构造请求头即可

	headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.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','Connection': 'keep-alive','Referer': href+'/fans/fans',}params = (('vmid', str(mid)),('pn', str(n)),('ps', '50'),('order', 'desc'),)response = requests.get('https://api.bilibili.com/x/relation/followers', headers=headers, params=params)

其中pn代表分页数,ps代表一页多少人,这些都可用通过python来修改

*注:每次请求该uri时必须先休眠5s左右,否则会封ip

		json_obj = json.loads(r.text); #返回json格式for entry in json_obj['data']['list']:fans_mid = entry['mid']mtime = entry['mtime']uname = entry['uname']vip = entry['vip']['vipType']fansDetails = getUserDetails(fans_mid)json_obj = json.loads(fansDetails.text)sex = json_obj['data']['sex']level = json_obj['data']['level']print("uid:" + str(fans_mid), "关注时间:"+ time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(mtime)),"用户名:" + uname, "vip等级:" + viplevel(vip), "性别:"+sex, "账户等级:"+str(level))insertFans(str(up_mid),str(fans_mid), time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(mtime)),uname,viplevel(vip),sex,str(level))time.sleep(5) # 防止封ip
最后,数据库的代码也在网盘里,下载了自己用下就行
目前b站没有反爬虫的手段但是不代表以后没有,这个帖子可能不久后就没用了,b站也会更新,有些html、css也会改变的。

http://www.ppmy.cn/news/409608.html

相关文章

一场胆战心惊的B站面试,哔哩哔哩也太难进了

此次哔哩哔哩Java开发面试之旅可谓惊险,不过通过对大部分面试题套路的掌握,不出意外还是拿下了,下面我们来看看这些题是不是常见的不能再常见的了。这些面试题看了就能面上?当然不是,只是通过这些题让自己知道所欠缺的…

Miko二次元动漫视频网站源码 视频播放带仿哔哩哔哩视频字幕弹幕

非常大气漂亮的Miko动漫视频网站整站源码,二次元动漫网源码。Dz后台管理方便,整站数据都设置好了,传上即可制作一个完整的动漫网。 安装教程: 1.源码上传到空间 2.自己修改里面数据库信息(错一个网站就打不开&#xff…

B站,被扫黄了!B站变P站?

月活用户达1.97亿的B站,又惹麻烦了。 作为全国乃至全球最大的二次元社区,B站如今的市值已经超过300亿美元,而曾经把B站按在地上摩擦的爱奇艺还一直在130亿美元徘徊。 众所周知,最初的B站只是一个小众的追番网站,后来它…

B站频繁暂停并弹出登录框

场景回顾 现在在没有登录的情况下,使用PC网页版B站观看视频时,会时不时(大概1分钟)自动暂停,并弹出登录框,非常影响用户体验。咱就偶尔想随便看点东西还这么麻烦,笔者印象里以前还没有这种机制的…

https://b23.tv/av...【相关研究】

参考链接 Fiddler教程:fiddler抓包时,出现的 tunnel tohttp tunnel && http connect methodfiddler的columns添加HTTPMethod 网络安全设备Bypass功能介绍及分析 (旁路) 特殊的B站链接研究 - 相关小记 前言 可能没啥有技…

(bilibili)b站看不见视频评论区或不显示高级弹幕

如果你的b站评论区变成了这样: 或者这样: 甚至是....这样: 那就快看看你用的是什么浏览器~ 如果是360极速浏览器,或者360旗下的其他浏览器,快快换掉,装个谷歌浏览器(Google Chrome)…

模仿bilibili登录页面

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>哔哩哔哩登录页面</title><!--外部样式--><link rel"stylesheet" href"哔哩哔哩样式.css"></head> <body><div c…

【Java面试】Spring中Autowired和Resource关键字的区别

Resource和Autowired都是做bean的注入时使用&#xff0c;其实Resource并不是Spring的注解&#xff0c;它的包是javax.annotation.Resource&#xff0c;需要导入&#xff0c;但是Spring支持该注解的注入。 1、共同点 两者都可以写在字段和setter方法上。两者如果都写在字段上&am…