python selenium 爬取b站全站排行榜100个视频的播放量 弹幕数 点赞量 投币数 收藏量 分享数

参考:https://www.selenium.dev/
需要提前安装
pip install -U selenium
和下载驱动
https://www.selenium.dev/documentation/webdriver/getting_started/install_drivers/
下载后解压,并把解压后的文件复制到系统PATH变量中的某个地址(查看方法:打开命令行输入echo %PATH%(windows系统)),如果不能运行的话可以更换驱动的版本试试
可以这么说,要有谷歌浏览器,要有对应的驱动,再安装了selenium库,最后可以用代码操作浏览器

from selenium import webdriver
import time
import re
# import random # 随机访问间隔?
# 此处使用的是谷歌浏览器
bro = webdriver.Chrome()

# bro.get("https://www.bilibili.com/")
bro.get("https://www.bilibili.com/v/popular/rank/all") # 打开排行榜页面
# 获取排行榜tab(全站,番剧,国产动画,国创相关,等等)
# rank_tab = bro.find_elements_by_css_selector("ul.rank-tab>li")
# rank_tab[n].click() # 可以转到对应的分类,这里就用的全站,不再'点击'
# 获取作品列表
# rank_list = bro.find_elements_by_css_selector("ul.rank-list>li")
# 后发现直接点击作品会新建一个标签页,改为获取作品的URL,并使用get(url)转到
li = bro.find_elements_by_css_selector("div.info>a.title") # 作品列表
li_url = [i.get_attribute("href") for i in li] # 作品的URL列表
# 定义几个列表用来储存数据,也可以随查随存
tit_li = [] # 标题
view_li = [] # 播放量
danmu_li = [] # 弹幕数
zan_li = [] # 点赞数
coin_li = [] # 投币数
star_li = [] # 收藏数
share_li = [] # 分享数
# 定义处理函数,
def comp(st):
	return re.sub(r'<.*?>|\n| ',  '', st)
# 打开‘随查随存’的文件,以'添加'的方式,(如果文件不存在会被创建)
fn = open("bili_all_01.txt", 'a', encoding='utf-8')
# 写入标题、、这里和下面的写入操作也可以import csv来操作,就不用自己输这么多逗号了
fn.write("标题, 播放量, 弹幕数, 点赞量, 投币数, 收藏量, 分享数, 网址, \n")
# 遍历URL
for url in li_url:
	bro.get(url) # 打开URL
	# 获取标题//标题也可以在上一个页面获取这些URL的时候一起获取
	title = bro.find_element_by_css_selector("h1.video-title")get_attribute("title")
	# 获取播放量
	view = bro.find_element_by_css_selector("span.view").get_attribute("title")[4:]
	# 获取弹幕数
	dm = bro.find_element_by_css_selector("span.dm").get_attribute("title")[7:]
	# 找到有相关信息的那一块
	info_li = bro.find_elements_by_css_selector("div.ops>span")
	zan = info_li[0].get_attribute("title")[3:] # 获取点赞数//也可以像下面三个一样的,不过这里这样得到的可能更准确
	coin = comp(info_li[1].get_attribute("innerHTML")) # 获取投币数
	star = comp(info_li[2].get_attribute("innerHTML")) # 获取收藏数
	share = comp(info_li[3].get_attribute("innerHTML")) # 获取分享次数
	# 下七行,分别存入列表
	tit_li.append(title)
	view_li.append(view)
	danmu_li.append(dm)
	zan_li.append(zan)
	coin_li.append(coin)
	star_li.append(star)
	share_li.append(share)
	# 输出信息
	# print(title+", "+view+", "+dm+", "+zan+", "+coin+", "+star+", "+share+", "+url)
	# 尝试写入文件,如果出现UnicodeEncodeError错误,则以网址代替标题(也可以试试去除标题中的异常字符,或者采取其他方法)
	try:
		fn.write(title+", "+view+", "+dm+", "+zan+", "+coin+", "+star+", "+share+", "+url+", \n")
	except UnicodeEncodeError:
		fn.write(url+", "+view+", "+dm+", "+zan+", "+coin+", "+star+", "+share+", "+url+", \n")
	# 等5秒,这里不要太小
	time.sleep(5)
	# 返回上一页面,可以不返回
	bro.back()
# 关闭‘随查随存’文件
fn.close()
# 打开另一个文件储存爬到的信息
# 两个保存方法留下一个就可以,两个都留着也可以
# 可以一开始不打开文件,中途不保存,等到查完了在这里统一保存
# 也可以把一开始的七个列表删除,中途的七个信息加入列表的操作删除,下面的保存操作删除,只是随查随存
with open("bili_all_01.scv", 'a',  encoding='utf-8') as f:
	f.write("标题, 播放量, 弹幕数, 点赞量, 投币数, 收藏量, 分享数, 网址, \n")
	for i in range(len(tit_li)):
		try:
			f.write(tit_li[i]+", "+view_li[i]+", "+danmu_li[i]+", "+zan_li[i]+", "+coin_li[i]+", "+star_li[i]+", "+share_li[i]+", "+li_url[i]+", \n")
		except UnicodeEncodeError:
			f.write(li_url[i]+", "+view_li[i]+", "+danmu_li[i]+", "+zan_li[i]+", "+coin_li[i]+", "+star_li[i]+", "+share_li[i]+", "+li_url[i]+", \n")
# 输出done..表示正常运行结束
print("done..")
# 关闭浏览器
bro.close()

上方代码可封装出一个,参数为url,返回标题、播放量、点赞数等的函数。

将上方代码保存文件中的类似“1.5万”的改为“15000”

当然也可以在上面代码中直接处理,更简便

import csv
# 定义处理函数
def comp(ss):
	try:
		if(ss[-1]=="万"): # 如果最后一位是“万”字
			return str(int(eval(ss[:-1])*10000))
	except IndexError:
		return ss
	return ss

with open("bili_all_01.csv", 'r') as fr:
	fr_csv = csv.reader(fr)
	with open("bili_all_02.csv",'w', newline='') as fw:
		fw_csv = csv.writer(fw)
		for row in fr_csv:
			tp = [comp(i) for i in row]
			fw_csv.writerow(tp)

print("done....")

注:上方代码在添加注释时又有了一些小优化,有一定可能会无法运行
date: 2021/12/12
python: 3.9.4
selenium: 4.1.0
pip: 21.3.1
下面几个库,可能有关吧
google-api-core 1.17.0
google-api-python-client 1.9.1
google-auth 1.16.0
google-auth-httplib2 0.0.4
google-cloud-bigquery 1.22.0
google-cloud-core 1.4.3
google-cloud-firestore 1.6.2
google-cloud-pubsub 1.3.1
google-cloud-storage 1.28.1
google-resumable-media 0.5.1
googleapis-common-protos 1.52.0
the end…

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今夕何夕2112

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值