1.前言
计算机的出现,推动了人类社会的进步,使得人们更高效的工作或是生活。当我们很”懒“的时候,计算机就能站出来,帮助我们做一些我们觉得浪费时间的事情了。你嫌用手点鼠标麻烦,计算机可以帮你哦。本文纯粹是为了学习计算机技术,增强自己的计算机技能,而且本人比较懒,不喜欢自己动手,所有利用自己写的一个小程序自动播放视频。切记不能用来刷视频的播放了,本人也坚决反对这种做法。如果读者一意孤行,造成的后果请自行承担。
2.Python+BeautifulSoup+Selenium模拟浏览器循环自动播放视频,如哔哩哔哩某个UP主的视频
我研究了一下,发现使用requests是无法获取到整个页面的。由于对前端也不是很在行,但是查了一下说是动态加载等原因。不管怎么样,咱们先完成这个任务。
2.1需要安装BeautifulSoup和Selenium库,你用的是anaconda的话,打开”anaconda prompt“,选中pycharm中的那个环境,使用命令
conda install BeautifulSoup
conda install selenium
就能安装这两个包了。
2.2然后你需要根据浏览器下载相应的驱动,我的是谷歌,所以使用的是谷歌驱动chromedriver.exe,根据自己浏览其的版本下载驱动,下载谷歌驱动地址为http://chromedriver.storage.googleapis.com/index.html,下载之后,
2.2.1要么使用
executable_path = r"D:\ProgramData\Anaconda3\envs\leisure\chromedriver.exe"
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path=executable_path, options=chrome_options)
直接设置路径的方式。
2.2.2要么使用:将chromedriver.exe放到python.exe同目录下
直接使用
driver = webdriver.Chrome()
即可。
3.源程序
import time
import math
import random
from bs4 import BeautifulSoup
from selenium import webdriver
class BLBL:
def __init__(self, master_url):
self.url = master_url
# selenium动态加载,返回driver对象
def dynamic_loading(self):
# 本地的驱动所在路径
executable_path = r"D:\ProgramData\Anaconda3\envs\leisure\chromedriver.exe"
chrome_options = webdriver.ChromeOptions()
# 后台运行Chromedriver
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
driver = webdriver.Chrome(executable_path=executable_path, options=chrome_options)
"""全屏显示"""
driver.maximize_window()
time.sleep(3)
return driver
# 动态加载防爬虫时,获取soup对象
def getSoup(self, url):
# 使用selenium加载完整页面再返回(blbl之前试过了,单纯的用requests是不能得到整个html页面的,貌似动态加载能得到完整页面)
driver = self.dynamic_loading()
driver.get(url)
driver.implicitly_wait(5)
time.sleep(3)
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")
driver.quit()
return soup
def getVideosNum(self):
# 使用selenium加载完整页面再返回(blbl之前试过了,单纯的用requests是不能得到整个html页面的,貌似动态加载能得到完整页面)
url = self.url
soup = self.getSoup(url)
UP_name = soup.find("span", {"id": "h-name"}).contents
print("%s!主人主人,好高兴见到你 o(*≧▽≦)ツ┏━┓ " % UP_name)
print("正在获取投稿视频数 o(≧口≦)o ")
ul = soup.find("ul", {"class": "contribution-list"})
ui = ul.find("li", {"class": "contribution-item cur"})
num_list = ui.find("span", {"class": "num"}).contents
num = 0
for nl in num_list:
num = nl
num = int(num)
print("投稿视频数获取成功 (๑•̀ㅂ•́)و✧ ,您一共有%d个作品,主人真棒(づ ̄3 ̄)づ╭❤~" % num)
return num
def getUrls(self, video_nums):
print("正在获取所有视频av或bv号 (ノへ ̄、) ")
urls = []
# 阿B完整一页的视频数量暂时定为30
onepage_nums = 5 * 6
pages = math.ceil(video_nums / float(onepage_nums))
for i in range(1, pages+1):
# 每一页博客列表的url
page_url = self.url + "?tid=0&page=" + str(i)
soup = self.getSoup(page_url)
nodes = soup.find("ul", {"class": "clearfix cube-list"}).find_all("li")
aids = [node.get("data-aid") for node in nodes]
urls.extend(aids)
print("视频av或bv号获取成功 ヽ(✿゚▽゚)ノ ")
return urls
if __name__ == "__main__":
# UP主的投稿页
master_url = 'https://space.bilibili.com/8047632/video'
blbl = BLBL(master_url)
# UP投稿的视频数
video_nums = blbl.getVideosNum()
# 获取UP的视频后几位号
urls = blbl.getUrls(video_nums)
len_urls = len(urls)
aB_url = "https://www.bilibili.com/video/"
# 每个视频每天播放几遍?
repeat_times = random.randint(3, 4)
for i in range(repeat_times):
print("第%d轮访问*^____^*" % i)
for url in urls:
# 使用谷歌driver自动打开网页,播放视频。
video_url = aB_url + url
driver = webdriver.Chrome()
driver.maximize_window()
print("正在播放", video_url)
driver.get(video_url)
handles = driver.window_handles
driver.switch_to.window(handles[-1])
time.sleep(3)
driver.find_element_by_class_name('bilibili-player-video-wrap').click()
time.sleep(15)
driver.quit()
4.代码功能
先获得投稿页中投稿视频的总数p,阿B一页最多有30个视频,用p/30就能得到总的页数。遍历这些视频列表页,获得所有的视频地址。最后使用driver访问这些地址。即运行这个程序,就会访问UP投稿页中所有的视频,这样就不用自己动手了,自动播放,方便,适合懒人。