python爬取B站视频实验

news/2024/10/21 23:50:10/

实验17:爬虫2

文章目录

      • 实验17:爬虫2
      • 1.实验目标及要求
      • 2. 实验主要内容
      • 3.实验小结

1.实验目标及要求

(1)掌握有关爬虫的包
(2)掌握爬虫方法
(3)爬取B站卡塔尔世界杯若干视频

2. 实验主要内容

代码部分:
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_sourcejson_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).contentwith 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站视频下载链接,所以关闭当前网页,切换网页就是很关键的了。


http://www.ppmy.cn/news/1507433.html

相关文章

kafka下载|安装

1、下载kafka https://kafka.apache.org/downloads 2、安装kafka 解压下载的kafka安装包即可 tar -xvf kafka_2.13-3.7.0.tgz -C /usr/local/3、查看kafka目录 bin目录&#xff1a;存放了脚本 config目录&#xff1a;主要存放了配置文件

中国科技统计年鉴,数据覆盖1991-2022年多年份

基本信息. 数据名称: 中国科技统计年鉴 数据格式: excel 数据时间: 1991-2022年 数据几何类型: xlsx 数据坐标系: WGS84 数据来源&#xff1a;国家统计局 数据预览&#xff1a; 数据可视化.

JDK8优化JVM总结

JDK8优化JVM总结 默认垃圾回收器&#xff1a; 当前大多数应用仍然使用JDK 1.8&#xff0c;并且默认的年轻代垃圾回收器是Parallel Scavenge。Parallel Scavenge回收器旨在最大化吞吐量&#xff0c;适合对CPU使用率有较高要求的应用场景。 AdaptiveSizePolicy&#xff1a; 默认…

YII2的errorHandler.errorAction失效原因

<?phpreturn [components => [errorHandler => [errorAction => site/error,],] ]; 这段配置存在错误,导致错误处理无法生效。为了解决这个问题,我们需要对配置进行优化。 代码查看:yii\web\ErrorHandler::renderException <?phpprotected function ren…

FPGA面试问题整理

1. 逻辑设计中竞争与冒险概念&#xff0c;如何识别和消除&#xff1f; 竞争&#xff1a;在组合逻辑电路中&#xff0c;信号经过多条路径到达输出端&#xff0c;每条路径经过的逻辑门不同存在时差&#xff0c;在信号变化的瞬间存在先后顺序。这种现象叫竞争。 冒险&#xff1a;由…

记录使用IDEA时出现的小问题

一、类文件的图标变成咖啡 问题分析&#xff1a;IDEA无法正常识别文件&#xff0c;大概率是因为系统找不到根目录。 解决方法&#xff1a;将整个文件夹设置为根目录&#xff0c;或者将src设置为根目录。 二、pom.xml文件的图标不是M&#xff0c;IDEA右侧的maven框消失 问题描…

【Java数据结构】---List(LinkedList)

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 前言链表&#xff08;MyS…

MySQL(一)——初识数据库(概念、数据类型、基本表库操作)

文章目录 初识数据库数据库相关基本概念数据库的分类 MySQL数据库数据模型基本操作库操作查看数据库创建数据库删除数据库选中数据库 数据类型数值类型字符串类型日期类型 表操作查看所有表查看表结构创建表删除表 其他操作查看警告信息查看编码集 这是我们 MySQL 学习的第一程…