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

相关推荐
大白同学4212 小时前
【C++】用哈希表封装unordered_XX
开发语言·c++·散列表
chian-ocean5 小时前
Bright Data 代理 + MCP :解决 Google 搜索反爬的完整方案
人工智能·python
XH华7 小时前
C语言第十一章内存在数据中的存储
c语言·开发语言
清风6666669 小时前
基于STM32单片机的二维码识别物联网OneNet云仓库系统
stm32·单片机·物联网·毕业设计·课程设计
AndrewHZ9 小时前
【python与生活】如何用Python写一个简单的自动整理文件的脚本?
开发语言·python·生活·脚本·文件整理
拉法豆粉9 小时前
在压力测试中如何确定合适的并发用户数?
java·开发语言
香蕉割草机9 小时前
云原生、容器及数据中心网络相关名词记录
网络·云原生
枯萎穿心攻击9 小时前
Unity VS UE 性能工具与内存管理
开发语言·游戏·unity·ue5·游戏引擎·虚幻·虚幻引擎
北方有星辰zz9 小时前
语音识别:概念与接口
网络·人工智能·语音识别
爱上纯净的蓝天9 小时前
迁移面试题
java·网络·c++·pdf·c#