写在前面:
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出。欢迎各位前来交流。(部分材料来源网络,若有侵权,立即删除)

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> &nbsp; / \\\\]', '', watchnum)uploadtime = every.find('span', {'class': 'so-icon time'}).textuploadtime = re.sub('[\n <br> &nbsp; / \\\\]', '', 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合并音频视频相关推荐

  1. python爬取b站搜索结果播放地址_如何利用Python快速爬取B站全站视频信息

    B 站我想大家都熟悉吧,其实 B 站的爬虫网上一搜一大堆.不过 纸上得来终觉浅,绝知此事要躬行,我码故我在.最终爬取到数据总量为 760万 条. 准备工作 首先打开 B 站,随便在首页找一个视频点击进 ...

  2. python爬虫爬取b站_python爬虫11 | 这次,将带你使用python爬取b站上的NBA形象大使蔡徐坤和他的球友们-Go语言中文社区...

    在上一篇中 小帅b给大家透露了我们这篇要说的牛逼利器 selenium + phantomjs 如果你看了 那么你应该知道 selenium 是什么了 它能做到自动操作 比如我们上次说的自动百度苍老师 ...

  3. Python 自动爬取B站视频

    文件名自定义(文件格式为.py),脚本内容: #!/usr/bin/env python #-*-coding:utf-8-*- import requests import random impor ...

  4. python怎么爬取b站_【Python爬虫实例学习篇】——4、超详细爬取bilibili视频

    [Python爬虫实例学习篇]--4.超详细爬取bilibili视频 由于经常在B站上学习,但无奈于家里网络太差,在线观看卡顿严重,于是萌生了下载视频的想法(如果只是单纯想下载视频,请用you-get ...

  5. python爬虫爬取新浪网站新闻内容

    我们以爬取sina时尚模块为例 准备工作 为进行爬虫爬取工作,我们需要进行相关库的准备以及对网页设置布局的了解 相关库的准备 import os import re import urllib fro ...

  6. Python爬虫入门教程 71-100 续上篇,python爬虫爬取B站视频

    写在前面 上篇博客我们用比较大的篇幅分析了B站视频传输方式,这篇博客填一下之前留下的坑,我们把代码部分写出来. 文章来源:梦想橡皮擦,其实这个ID是一个组合 分析的步骤与逻辑这里不再重复给大家演示了, ...

  7. python selenium 爬取b站全站排行榜100个视频的播放量 弹幕数 点赞量 投币数 收藏量 分享数

    参考:https://www.selenium.dev/ 需要提前安装 pip install -U selenium 和下载驱动 https://www.selenium.dev/documenta ...

  8. python爬虫爬取B站【马保国】诶..朋友们好啊,我是混元形意太极门掌门人——马保国,独自一人撑起了B站2020年的年尾。

    诶-朋友们好啊,最近逛B站,在首推页总能见到马老师的视频,每次总能被那些神仙UP主的脑洞惊呆,于是我就很好奇一个事情,马老师到底在B站有多火,只要带 马老师的视频总能上首推,我就搞了个爬虫,把视频标题 ...

  9. python爬b站视频_python代码福利:用requests爬取B站视频封面

    最近看到一篇文章介绍了利用Python爬虫爬取B站视频封面的文章,虽然我完全没看文章,但是只看了一眼这个封面图就彻底把我吸引了.不过我也对爬虫这方面比较熟悉了,这么简单的事情还用看别人的文章教我做事? ...

最新文章

  1. MYSQL 查询数据排序数据和分组数据
  2. 安全获取QueryString的值类库下载
  3. 主流的比较流行的Python量化开源框架
  4. PyTorch 实现经典模型8:FCN
  5. linux客户端无法绑定端口号,为什么Linux客户端的情况下不支持端口共用?
  6. stm32的语音识别_基于stm32循迹避障语音控制金属探测蓝牙小车设计(原理图+pcb+源码+参考文档)...
  7. 《深入理解Java虚拟机》——垃圾收集器的具体实现
  8. virus.win32.xorer病毒
  9. LeetCode刷题(35)--Add Binary
  10. 正则表达式3-兄弟的回复
  11. 让手机可以边打电话边上网
  12. Pytorch中BatchNorm中running_mean和running_var的计算方法
  13. 常用图片格式JPG\PNG\SVG该如何选择?
  14. Java 方法与C语言函数微区别
  15. 阿里巴巴图标库(iconfont)使用
  16. 史上最强Tomcat8性能优化,网易云课堂java高级架构师
  17. 支付宝企业向个人付款实现
  18. java的equals方法_在Java中编写完美的equals方法
  19. Discuz!论坛运营之增加创始人的方法
  20. .NetCore实现word转PDF无第三方水印+批量生成自定义水印(不用安装Microsoft和WPS插件)

热门文章

  1. 一行命令直接拷贝ssh公钥到远程服务器
  2. [转]awesome-tensorflow-chinese
  3. 遮挡行人的检测论文合集
  4. Java线程之间的协作
  5. extjs TabPanel 监听激活事件
  6. sqlserver 获取所有表的字段类型等信息
  7. [NOIp2008] 双栈排序 (二分图染色 + 贪心)
  8. C语言实现windows进程遍历
  9. h5-localStorage实现缓存ajax请求数据
  10. 设定谷歌为默认浏览器