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

相关推荐
mqiqe28 分钟前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin31 分钟前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
哭泣的眼泪40844 分钟前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
Ysjt | 深1 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__1 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
码农飞飞1 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货1 小时前
Rust 的简介
开发语言·后端·rust
湫ccc1 小时前
《Python基础》之基本数据类型
开发语言·python