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站视频下载链接,所以关闭当前网页,切换网页就是很关键的了。

相关推荐
Darenm11133 分钟前
JavaScript事件流:冒泡与捕获的深度解析
开发语言·前端·javascript
whltaoin38 分钟前
Java 后端与 AI 融合:技术路径、实战案例与未来趋势
java·开发语言·人工智能·编程思想·ai生态
fat house cat_43 分钟前
记一次网络io学习流水账
网络·学习
wjs20241 小时前
jEasyUI 自定义窗口工具栏
开发语言
二十雨辰1 小时前
vite与ts的结合
开发语言·前端·vue.js
xiaohanbao091 小时前
Transformer架构与NLP词表示演进
python·深度学习·神经网络
亦良Cool1 小时前
如何部署一个Java项目
java·开发语言
沐知全栈开发1 小时前
JavaScript 输出
开发语言
is08152 小时前
全志 H3 armbian 备份
linux·服务器·网络
love530love2 小时前
【笔记】 Podman Desktop 中部署 Stable Diffusion WebUI (GPU 支持)
人工智能·windows·笔记·python·容器·stable diffusion·podman