python爬取B站视频实验

实验17:爬虫2

文章目录

1.实验目标及要求

(1)掌握有关爬虫的包

(2)掌握爬虫方法

(3)爬取B站卡塔尔世界杯若干视频

2. 实验主要内容

bash 复制代码
代码部分:
import json
import os
import re
import time
import requests
from selenium.webdriver import Edge
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

# 请求头信息
head = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.67',
    'Referer': 'https://www.bilibili.com/video/BV1NG4y1R7re/?spm_id_from=333.1007.tianma.1-1-1.click&vd_source=bd03a18123cf7caa08dcac9d5ef031d6'
}

# 绑定浏览器事件
web = Edge()
web.get('https://www.bilibili.com/')

# 爬取视频函数
def DownloadVideo(title,saveName):
    # 爬取 class="col_3 col_xs_1_5 col_md_2 col_xl_1_7 mb_x40"的div下的视频,B站网页版一页24个视频
    if title == 1:
        contents = web.find_elements(By.XPATH, ('//*[@id="i_cecream"]/div/div[2]/div[2]/div/div/div/div[1]/div/div[@class="col_3 col_xs_1_5 col_md_2 col_xl_1_7 mb_x40"]'))
     else:
        contents = web.find_elements(By.XPATH, (
'//*[@id="i_cecream"]/div/div[2]/div[2]/div/div/div[1]/div[@class="col_3 col_xs_1_5 col_md_2 col_xl_1_7 mb_x40"]'))
        
# 视频编号
j = 0
for content in contents[:24]:
    j += 1
    # 点入视频主页
content.find_element(By.XPATH,('.//div/div[2]/a')).click()

    # 切换到最后一个网页
    web.switch_to.window(web.window_handles[-1])
    time.sleep(2)

    # 获取网页源代码,并找到视频下载地址
    page = web.page_source
    json_data = re.findall('<script>window.__playinfo__=(.*?)</script>', page)[0]
    json_data = json.loads(json_data)

    # 下载提取视频
    video_url = json_data['data']['dash']['video'][0]['backupUrl'][0]

    # 保存视频
    video_data = requests.get(url=video_url, headers=head).content
    with open('./{}/{}_{}.mp4'.format(saveName,title, j), 'wb') as f:
          f.write(video_data)
    time.sleep(2)

    # 关闭当前网页,回到第二个网页
    web.close()
    web.switch_to.window(web.window_handles[1])
    print('成功下载第{}页,第{}个视频'.format(title, j))
time.sleep(5)

# 主函数
def get_target(keyword, page, saveName):
# 在网页搜索栏内输入搜索内容
web.find_element(By.XPATH, ('//*[@id="nav-searchform"]/div[1]/input')).send_keys("{}".format(keyword),Keys.ENTER)
time.sleep(5)
     # 创建文件夹
     os.mkdir("./{}".format(saveName))

    # 循环获取不同页的视频
    for i in range(0, page):
# 窗口切换
web.switch_to.window(web.window_handles[-1])
i += 1

# 调用爬取视频函数
DownloadVideo(i, saveName)

# 浏览器事件,锁定下一页按钮并点击
if i == 1:
time.sleep(5)
web.find_element(By.XPATH, ( '//*[@id="i_cecream"]/div/div[2]/div[2]/div/div/div/div[2]/div/div/button[10]')).click()
elif 1 < i <= 5:
    time.sleep(5)
    web.find_element(By.XPATH,              ('//*[@id="i_cecream"]/div/div[2]/div[2]/div/div/div[2]/div/div/button[10]')).click()
else:
    time.sleep(5)
    web.find_element(By.XPATH,
('//*[@id="i_cecream"]/div/div[2]/div[2]/div/div/div[2]/div/div/button[9]')).click()

if __name__ == '__main__':
keyword = input('请输入要搜索的关键词:')
page = int(input('请输入爬取的页数:'))
saveName = input('请输入要保存的文件名:')
get_target(keyword, page, saveName)

实验结果:


3.实验小结

学Python不弄点爬虫,总觉得不完整,这一次和上一次我使用的都是selenium库进行爬虫,但这次也依靠了requests库。一看到实验需要进行输入查找视频内容,在我的脑海中只想到了使用selenium库的浏览器事件处理会比较简单一些,但是找了很多资料也没能弄明白selenium库如何进行下载视频,目前为止只会使用selenium库进行获取B站的视频资料,比如up主,视频名称,播放量等等信息,对于如何下载视频还是没能弄明白,所以我就使用了requests库进行下载视频的任务,发现了结合不同的爬虫的方法进行爬虫可以简便许多,果然在学习上还是要进行知识上的汇集,使各种方法进行有机集合,形成一个简便的解决方式。

实验过程中也是出现了很多的问题,最多的问题就是浏览器的xpath路径了,不同的页数的下一页按钮还不一样,一开始测试循环点击下一页的时候报错了好几次,经过刺激摸索发现了问题所在,一共分成了三种情况,所以我就使用if语句对问题进行解决,发现能够成功运行。对于这种xpath路径问题出现了很多次,但解决难度不大,主要是比较多而麻烦。实验过程中还要不断的进行切换网页,因为想要下载B站视频需要点击观看视频,从而获取B站视频下载链接,所以关闭当前网页,切换网页就是很关键的了。

相关推荐
Captain823Jack19 分钟前
nlp新词发现——浅析 TF·IDF
人工智能·python·深度学习·神经网络·算法·自然语言处理
资源补给站44 分钟前
大恒相机开发(2)—Python软触发调用采集图像
开发语言·python·数码相机
2301_819287121 小时前
ce第六次作业
linux·运维·服务器·网络
CIb0la1 小时前
GitLab 停止为中国区用户提供 GitLab.com 账号服务
运维·网络·程序人生
Captain823Jack1 小时前
w04_nlp大模型训练·中文分词
人工智能·python·深度学习·神经网络·算法·自然语言处理·中文分词
m0_748247551 小时前
Web 应用项目开发全流程解析与实战经验分享
开发语言·前端·php
Black_mario1 小时前
链原生 Web3 AI 网络 Chainbase 推出 AVS 主网, 拓展 EigenLayer AVS 应用场景
网络·人工智能·web3
6.941 小时前
Scala学习记录 递归调用 练习
开发语言·学习·scala
PieroPc1 小时前
Python 自动化 打开网站 填表登陆 例子
运维·python·自动化
FF在路上2 小时前
Knife4j调试实体类传参扁平化模式修改:default-flat-param-object: true
java·开发语言