Python+BeautifulSoup+Selenium模拟浏览器循环自动播放视频,如哔哩哔哩某个UP主的视频

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投稿页中所有的视频,这样就不用自己动手了,自动播放,方便,适合懒人。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值