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

### 使用 Python 实现爬取哩(Bilibili)网站的视频信息 为了实现这一目标,可以利用 B站开放 API 或者解析网页内容两种方式。对于初学者来说,使用官方提供的API接口更为简便可靠。 #### 方法一:调用B站公开API获取数据 通过访问特定URL并发送请求来获得JSON格式的数据返回,其中包含了所需的各种属性字段。下面是一个简单的例子展示怎样取得单个AV号对应的视频详情: ```python import requests def get_video_info_by_avid(avid): url = f"https://api.bilibili.com/x/web-interface/view?aid={avid}" response = requests.get(url).json() data = response["data"] title = data['title'] play_count = data['stat']['view'] info_dict={ 'av': str(data['aid']), '标题': title, '播放量': play_count } return info_dict if __name__ == "__main__": avid=9780254 # 这里填写想要查询的具体AV编号 video_information=get_video_info_by_avid(avid) print(video_information) ``` 此段代码会打印出指定 AV 编码下的视频名称以及它的总观看次数[^1]。 #### 方法二:基于BeautifulSoup库解析HTML文档 如果某些情况下无法直接依赖于API,则可以通过模拟浏览器行为加载页面后再提取感兴趣的部分。这里推荐采用`requests_html`或者`selenium`这类支持JavaScript渲染环境的工具包处理动态加载的内容;而对于静态资源则可以直接运用`beautifulsoup4`来进行DOM树遍历操作。 ```python from bs4 import BeautifulSoup import requests headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'} url="https://www.bilibili.com/video/BV1XX411c7pL" response=requests.get(url, headers=headers) html=response.text soup=BeautifulSoup(html,'lxml') script=soup.find('script',text=lambda t:'window.__INITIAL_STATE__'in t).string.strip().split('=')[1][:-12] import json info=json.loads(script)['videoData'] print(f"title:{info['title']}") print(f"play count:{info['stat']['view']}") ``` 这段脚本同样能够输出给定BV号关联影片的名字及其累计浏览人次[^2]。 需要注意的是,在实际开发过程中应当遵循各平台的服务条款,合理合法地开展自动化任务,并考虑到服务器压力等因素适当设置延时间隔等措施减少对目标站点的影响。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值