从入门到入土:Python实现爬取某站视频|根据视频编号|支持通过视频名称和创作者名称寻找编号|以及python moviepy合并音频视频
写在前面:
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出。欢迎各位前来交流。(部分材料来源网络,若有侵权,立即删除)
Python实现爬取某站视频|根据视频编号|支持通过视频名称和创作者名称寻找编号|以及python moviepy合并音频视频
- 免责声明
- 情况说明
- 效果展示
- 代码讲解
- cookie
- 获取视频链接
- 获取音视频文件
- 音画合并
- 查询
- 根据视频名称
- 根据创作者
- 主菜单
- 使用的库函数
- 代码
免责声明
- 代码仅用于学习,如被转载用于其他非法行为,自负法律责任
- 代码全部都是原创,不允许转载,转载侵权
情况说明
- python爬虫
- 实现了对视频的爬取并进行音画合并
- 支持通过视频名称和创作者名称寻找编号
效果展示
菜单
1:获取视频并合成
- 输入指令后输入视频编号- 该测试视频版权所有为我个人,不存在侵权行为- 先后爬取音频和视频- 会正常显示请求片段成功的返回状态码206- 当返回状态码不为206时,说明爬取结束
- 下载完成进行音视频合并
合并完成
- 查询
视频名称
根据视频创作者查询
代码讲解
cookie
参考博客
- 这边使用的是Selenium模拟登录的方法
- 函数如下:
def get_cookies():driver = webdriver.Firefox()#启动浏览器url = 'https://www.bilibili.com/'driver.get(url) # 发送请求# 打开之后,手动登录一次time.sleep(3)input('完成登陆后点击enter:')time.sleep(3)dictcookies = driver.get_cookies() # 获取cookiescookie = [item["name"] + "=" + item["value"] for item in dictcookies]cookiestr = ';'.join(item for item in cookie)print(cookiestr)with open('wyycookie.txt', 'w') as f:f.write(cookiestr)print('cookies保存成功!')driver.close()
- 这一行代码是将driver中获取到的cookie转换成requests能直接使用的格式
cookie = [item["name"] + "=" + item["value"] for item in dictcookies]cookiestr = ';'.join(item for item in cookie)
- 然后写入文件
with open('wyycookie.txt', 'w') as f:f.write(cookiestr)print('cookies保存成功!')driver.close()
- 读取cookie
def read_cookie():try:print("[INFO]:正常尝试读取本地cookie")with open('wyycookie.txt', 'r', encoding='utf8') as f:Cookies = f.read()# print(Cookies)except:print("[ERROR]:读取失败,请手动登录并更新")get_cookies()read_cookie()return Cookies
- 这边也有读取的机制和读取失败的机制
获取视频链接
- 首先我们打开一个视频
- F12后,在播放的过程中,查看发送过来的mp4类型的包,我使用的是火狐浏览器
- 我们可以理解为视频是分片发过来的
- 我们去查看网页源码
- 发现一个问题就是音频和视频是分开的
- 这个先不考虑
- 但是可以确认是通过这两个URL进行数据请求的
- 那先进行获取
def get_baseurl(bvid):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36','Cookie': '{}'.format(Cookies)}rs = requests.session()r = rs.get('https://www.bilibili.com/video/{}'.format(bvid), headers=headers)html=r.textstr = r'<h1 title="(.*?)" class="'title = re.findall(str, html)[0]str= r'\<script\>window\.__playinfo__=(.*?)\</script\>'result = re.findall(str, html)[0]temp = json.loads(result)videourl = temp['data']['dash']['video'][0]['baseUrl']audiourl = temp['data']['dash']['audio'][0]['baseUrl']print("[INFO]:视频链接获取成功")# print(videourl)# print(audiourl)return [title,videourl,audiourl]
- 这个函数也只是普普通通的爬虫函数然后解析页面重点json字典
- 很容易得到对应的视频标题以及两个URL
获取音视频文件
- 继续观察F12
- 可以看到发送mp4的状态码都是206
- MP4的url请求来自于视频和音频两个url
- 仔细对照可以发现和上面获得的两个URL相同
- 单独看一个
- 发送的目的url相同
- 那看看请求头
- 这个请求头中的Range参数会变化
- 是请求对应媒体字节的段数
- 所以我们在构造header的时候需要尽可能的详细
- 每一次的range参数会变化
- 所以我们需要更新headers
- range一次的值设置为1024*1024
- 逐次更替比如1-100、101-200,依次类推
def get_file(title,url,m,baseurl):print("[INFO]:开始下载")headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0','Cookie': '{}'.format(Cookies),'Host': 'cn-sccd3-cmcc-v-14.bilivideo.com','Origin': 'https://www.bilibili.com','Referer': baseurl}if (m == 0):form = 'mp4'print("[INFO]:现在下载视频")else:form = 'mp3'print("[INFO]:现在下载音频")start=0over=1024*1024-1k=0rs=requests.Session()M=0while True:time.sleep(0.2)headers.update({'Range': 'bytes=' + str(start) + '-' + str(over)})# print(headers['Range'])r = rs.get(url, headers=headers)print("[INFO]:网页返回状态码如下:",r.status_code,flush=True)if r.status_code==403 or r.status_code== 503:print("[ERROR]:请及时更换代理")if r.status_code == 206:start = over + 1over = over + 1024 * 1024M=M+1print("[INFO]:正在下载请稍后",flush=True)else:headers.update({'Range': str(over + 1) + '-'})# print(headers['Range'])r = rs.get(url, headers=headers)print("[INFO]:下载完成")k = 1with open(title + '.' + form, 'wb') as f:f.write(r.content)f.flush()if k==1:f.close()break
- 通过这个函数可以得到一个无声的mp4文件和一个mp3音频文件
- 接下来需要合并
音画合并
- 视频作者是我自己,所以不存在侵权
- 这边采用的一个python库是 moviepy
- MoviePy是一个用于视频编辑的Python模块,它可被用于一些基本操作(如剪切、拼接、插入标题)、视频合成(即非线性编辑)、视频处理和创建高级特效。它可对大多数常见视频格式进行读写,包括GIF。
- 使用文档
- 没什么好说的,路径记得写对
def conbine(title):print("[INFO]:正在合并音视频", flush=True)video_clip = VideoFileClip(r'F:\{}.mp4'.format(title))audio = AudioFileClip(r'F:\{}.mp3'.format(title)).volumex(0.5)final_video = video_clip.set_audio(audio)final_video.write_videofile("{}!.mp4".format(title))
查询
根据视频名称
- 由于最终的目的是查看视频编号
- 所以减少了很多元素的爬取
- 可以看到也是一个很简单的爬虫模块
- 通过搜索返回结果进行爬取
def search_video(name):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36','Cookie': '{}'.format(Cookies)}rs = requests.session()r = rs.get('https://search.bilibili.com/video?keyword={}'.format(name), headers=headers)soup = BeautifulSoup(r.content, 'lxml')all = soup.find_all('li', {'class': 'video-item matrix'})for every in all:data=[]title=every.find('a')['title']href = every.find('a')['href']watchnum = every.find('span',{'class':'so-icon watch-num'}).textwatchnum = re.sub('[\n <br> / \\\\]', '', watchnum)uploadtime = every.find('span', {'class': 'so-icon time'}).textuploadtime = re.sub('[\n <br> / \\\\]', '', uploadtime)creator = every.find('a', {'class': 'up-name'}).textstr = r'/video/(.*?)from=search'bvid = re.findall(str, href)[0]bvid = re.sub('[?]', '', bvid)print("=" * 200)print('视频标题:'+title)print('视频观看数:' + watchnum)print('上传时间:' + uploadtime)print('视频作者:' + creator)print('视频bv号:' +bvid)print("=" * 200)
根据创作者
和前一个的目的相同
也是通过搜索得到创作者编号
然后组合成url访问该作者的视频列表接口
思路和以前爬取ajax一样
再根据返回的视频列表,依次提取每一个视频的基本参数,提供给使用者选择
def get_up(name):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36','Cookie': '{}'.format(Cookies)}rs = requests.session()r = rs.get('https://search.bilibili.com/upuser?keyword={}'.format(name), headers=headers)html = r.textsoup = BeautifulSoup(r.content, 'lxml')first = soup.find('li', {'class': 'user-item'})second= first.find('div',{'class':'up-videos clearfix'})link=second.find('a',{'class':'video-more'})['href']str = r'.com/(.*?)/video'link = re.findall(str, link)[0]return linkdef get_vediourl(num):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36','Cookie': '{}'.format(Cookies)}rs = requests.session()r = rs.get('https://api.bilibili.com/x/space/arc/search?mid={}'.format(num), headers=headers)html = r.textdict_r = json.loads(html)for i in dict_r['data']['list']['vlist']:print("="*200)print('视频标题:'+i['title'])print('视频描述:'+i['description'])print('视频长度:'+i['length'])print('视频bv号:'+i['bvid'])print("=" * 200)
主菜单
def main():#print_menu()while True:print_menu()# 获取用户输入try:num = int(input("[INFO]:请输入需要的操作:"))except ValueError:# except Exception:print("输入错误,请重新输入(1.2.3)")continueexcept IndexError:print("请输入一个有效值:(1.2.3)")continue# 根据用户的数据执行相应的功能if num == 1:bv=input("[INFO]:请输入bv号:")data=get_baseurl(bv)print(data[0])get_file(data[0],data[1],0,'https://www.bilibili.com/video/{}'.format(bv))get_file(data[0],data[2],1,'https://www.bilibili.com/video/{}'.format(bv))conbine(data[0])print("=" * 500)elif num == 2:name = input("[INFO]:请输入视频名称:")search_video(name)print("=" * 500)elif num == 3:name = input("[INFO]:请输入创作者名称:")num=get_up(name)get_vediourl(num)print("=" * 500)elif num == 4:print("[END]:感谢您的使用,欢迎下次再见")print("=" * 500)breakelse:print("[ERROR]:输入错误")print("=" * 500)def print_menu():print ("="*500)print ("[INFO]:1. 获取指定音乐歌词")print ("[INFO]:2. 生成指定音乐评论词云图")print ("[INFO]:3. 下载歌曲")print ("[INFO]:4. 退出系统")print("=" * 500)
使用的库函数
from moviepy.editor import *
import requests
import time
import json
from selenium import webdriver
import re
from bs4 import BeautifulSoup
代码
git链接
- 慢用
- 再见
- 晚安
从入门到入土:Python实现爬取某站视频|根据视频编号|支持通过视频名称和创作者名称寻找编号|以及python moviepy合并音频视频相关推荐
- python爬取b站搜索结果播放地址_如何利用Python快速爬取B站全站视频信息
B 站我想大家都熟悉吧,其实 B 站的爬虫网上一搜一大堆.不过 纸上得来终觉浅,绝知此事要躬行,我码故我在.最终爬取到数据总量为 760万 条. 准备工作 首先打开 B 站,随便在首页找一个视频点击进 ...
- python爬虫爬取b站_python爬虫11 | 这次,将带你使用python爬取b站上的NBA形象大使蔡徐坤和他的球友们-Go语言中文社区...
在上一篇中 小帅b给大家透露了我们这篇要说的牛逼利器 selenium + phantomjs 如果你看了 那么你应该知道 selenium 是什么了 它能做到自动操作 比如我们上次说的自动百度苍老师 ...
- Python 自动爬取B站视频
文件名自定义(文件格式为.py),脚本内容: #!/usr/bin/env python #-*-coding:utf-8-*- import requests import random impor ...
- python怎么爬取b站_【Python爬虫实例学习篇】——4、超详细爬取bilibili视频
[Python爬虫实例学习篇]--4.超详细爬取bilibili视频 由于经常在B站上学习,但无奈于家里网络太差,在线观看卡顿严重,于是萌生了下载视频的想法(如果只是单纯想下载视频,请用you-get ...
- python爬虫爬取新浪网站新闻内容
我们以爬取sina时尚模块为例 准备工作 为进行爬虫爬取工作,我们需要进行相关库的准备以及对网页设置布局的了解 相关库的准备 import os import re import urllib fro ...
- Python爬虫入门教程 71-100 续上篇,python爬虫爬取B站视频
写在前面 上篇博客我们用比较大的篇幅分析了B站视频传输方式,这篇博客填一下之前留下的坑,我们把代码部分写出来. 文章来源:梦想橡皮擦,其实这个ID是一个组合 分析的步骤与逻辑这里不再重复给大家演示了, ...
- python selenium 爬取b站全站排行榜100个视频的播放量 弹幕数 点赞量 投币数 收藏量 分享数
参考:https://www.selenium.dev/ 需要提前安装 pip install -U selenium 和下载驱动 https://www.selenium.dev/documenta ...
- python爬虫爬取B站【马保国】诶..朋友们好啊,我是混元形意太极门掌门人——马保国,独自一人撑起了B站2020年的年尾。
诶-朋友们好啊,最近逛B站,在首推页总能见到马老师的视频,每次总能被那些神仙UP主的脑洞惊呆,于是我就很好奇一个事情,马老师到底在B站有多火,只要带 马老师的视频总能上首推,我就搞了个爬虫,把视频标题 ...
- python爬b站视频_python代码福利:用requests爬取B站视频封面
最近看到一篇文章介绍了利用Python爬虫爬取B站视频封面的文章,虽然我完全没看文章,但是只看了一眼这个封面图就彻底把我吸引了.不过我也对爬虫这方面比较熟悉了,这么简单的事情还用看别人的文章教我做事? ...
最新文章
- MYSQL 查询数据排序数据和分组数据
- 安全获取QueryString的值类库下载
- 主流的比较流行的Python量化开源框架
- PyTorch 实现经典模型8:FCN
- linux客户端无法绑定端口号,为什么Linux客户端的情况下不支持端口共用?
- stm32的语音识别_基于stm32循迹避障语音控制金属探测蓝牙小车设计(原理图+pcb+源码+参考文档)...
- 《深入理解Java虚拟机》——垃圾收集器的具体实现
- virus.win32.xorer病毒
- LeetCode刷题(35)--Add Binary
- 正则表达式3-兄弟的回复
- 让手机可以边打电话边上网
- Pytorch中BatchNorm中running_mean和running_var的计算方法
- 常用图片格式JPG\PNG\SVG该如何选择?
- Java 方法与C语言函数微区别
- 阿里巴巴图标库(iconfont)使用
- 史上最强Tomcat8性能优化,网易云课堂java高级架构师
- 支付宝企业向个人付款实现
- java的equals方法_在Java中编写完美的equals方法
- Discuz!论坛运营之增加创始人的方法
- .NetCore实现word转PDF无第三方水印+批量生成自定义水印(不用安装Microsoft和WPS插件)