此文章仅作为个人学习记录,其他人可用作参考,仅供学习技术交流

针对的网站嘛,就是看动漫的那个网站,懂得都懂,不懂的就算了

1.使用的库

import json
import pprint  # 查看数据
import subprocess
import requests
import re  # 正则表达式

2.发送请求

def get_response(html_url):"""发送请求:param html_url:请求的url地址:return:返回请求服务器返回的响应数据"""# 在发送请求之前,需要进行伪装headers请求头# user-agent 浏览器基本标识 用户代理 基本伪装 反反爬的手段# 出现 403 加防盗链 refererheaders = {'referer': 'xxx',  # 加防盗链 referer        此处xxx为请求头中的信息可去请求头中查看'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'}response = requests.get(url=html_url, headers=headers)  # 请求代码# <Response [200]>  对象response响应对象  200 状态码 表示请求成功# 404 >>> 你所拨打的电话是空号 >>> 网址出错# 403 >>> 你所拨打的电话不在服务区 >>> 你没有访问权限return response

如chrome浏览器在headers中的referer和user-agent可以在请求头中找到

3.获取视频标题、音频url地址、视频画面url地址

def get_video_info(html_url):"""获取视频标题 / 音频url地址 / 视频画面url地址:param html_url: 视频的详情页:return: 视频标题 / 音频url地址 / 视频画面url地址"""response = get_response(html_url=html_url)# response.text 获取响应体的文本数据# print(response.text)# 只要你可以看到数据 就可以下载 进行批量下载# 解析数据 提取视频标题 re正则表达式 css选择器 xpath(解析方式) bs4 parsel lxml(解析模块) jsonpath 主要提取json数据# 通过re正则表达式里面findall方法提取数据内容 ‘返回都是列表数据类型[0] 列表 索引取值# 想要的内容用括号括起来 .*? 可以匹配任意字符(除了换行符以外\n)  从response.text 里面查找数据title = re.findall('<h1 id="video-title" title="(.*?)" class="video-title">', response.text)[0]  # 标题html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0]  # 提取播放信息# html_data 是什么样的数据类型 <class 'str'># 为了更加方便提取数据, 可以字符串数据 转换成 字段数据类型# print(title)# print(html_data)# pprint.pprint(html_data)# print(type(html_data))json_data = json.loads(html_data)# 根据冒号左边的内容,提取冒号右边的内容 键值对取值audio_url = json_data['data']['dash']['audio'][0]['baseUrl']video_url = json_data['data']['dash']['video'][0]['baseUrl']video_info = [title, audio_url, video_url]# pprint.pprint(json_data)# print(audio_url)# print(video_url)return video_info

4.保存数据(音频数据、视频数据)

def save(title, audio_url, video_url):"""保存数据函数:param title:视频标题:param audio_url: 音频url:param video_url: 视频画面url:return:"""# 保存音频 视频数据 获取二进制数据内容# 使用正则表达式将标题当中的所有标点符号替换为空title = re.sub('\W+', '', title).replace("_", '')audio_content = get_response(html_url=audio_url).contentvideo_content = get_response(html_url=video_url).contentwith open(title + '.mp3', mode='wb') as f:f.write(audio_content)with open(title + '.mp4', mode='wb') as f:f.write(video_content)print(title, '保存成功~~~')

5.使用主函数调用

def main(bv_id):"""主函数:param bv_id: bv号:return:"""url = f'https://xxx/video/{bv_id}'  # 此处xxx为链接什么链接也就不用多说啦video_info = get_video_info(url)save(video_info[0], video_info[1], video_info[2])keyword = input('请输入你要下载的视频BV号:')
main(keyword)

到此可以已经可以下载出单独的纯音频和纯视频

输入后面的下载视频的bv号即可

6.下载并且配置ffpeg环境变量

接下来就是合成音频和视频,需要下载ffmpeg,然后给ffmpeg配置环境变量,可以去官网下载

下载好之后可以解压到自己喜欢的路径,然后配置环境变量

此电脑->属性->高级系统设置->环境变量->系统变量->path中添加ffmpeg的bin目录

D:\ffmpeg\ffmpeg-5.0-essentials_build\bin

然后进入cmd输入ffmpeg -version查看是否配置完成

这样就算完成了

7.数据合并

加上这个函数就可以调用ffmpeg进行合成数据

def merge_data(video_name):"""数据合并"""# 使用正则表达式将标题当中的所有标点符号替换为空,防止执行ffmpeg合并视频和音频时输出视频失败video_name = re.sub('\W+', '', video_name).replace("_", '')print('视频合成开始:', video_name)cmd = f"D:/ffmpeg/ffmpeg-5.0-essentials_build/bin/ffmpeg -i {video_name}.mp4 -i {video_name}.mp3 -c:v copy -c:a aac -strict experimental {video_name}out.mp4"# print(cmd)subprocess.run(cmd, shell=True)print('视频合成结束:', video_name)

此时在主函数也有需要调用这个函数

更改后的main函数

def main(bv_id):"""主函数:param bv_id: bv号:return:"""url = f'https://xxx/video/{bv_id}'  # 此处xxx为链接什么链接不准说video_info = get_video_info(url)save(video_info[0], video_info[1], video_info[2])#调用数据合并merge_data(video_info[0])

8.踩过的坑

最后说一下我自己踩过的坑,当然以上代码都是完善过的,所以我使用没什么问题

到合并那块调用ffpeg就出了很多问题

第一个问题最主要的就是我明明配置了环境变量也没写错,就是无法合并

我出现的问题就是这样,百度了好久都没有结果,之后找到的结果是需要定位到精确的路径使用

cmd = f"D:/ffmpeg/ffmpeg-5.0-essentials_build/bin/ffmpeg -i {video_name}.mp4 -i {video_name}.mp3 -c:v copy -c:a aac -strict experimental {video_name}out.mp4"

也就是这样在命令前加上路径

第二个问题就是命令行无法针对空格识别的问题,因为很多视频标题里面或多或少都有空格,这样会影响cmd运行,他是针对之前下载的两个文件名称合并,如果两个文件名中有空格,cmd就不好识别到文件路径,所以在网上找到的解决方法就是把符号啥的替换为空

    # 使用正则表达式将标题当中的所有标点符号替换为空title = re.sub('\W+', '', title).replace("_", '')# 使用正则表达式将标题当中的所有标点符号替换为空,防止执行ffmpeg合并视频和音频时输出视频失败video_name = re.sub('\W+', '', video_name).replace("_", '')

这样名称就不会影响结果输出

9.完整代码

import json
import pprint  # 查看数据
import subprocess
import requests
import re  # 正则表达式def get_response(html_url):"""发送请求:param html_url:请求的url地址:return:返回请求服务器返回的响应数据"""# 在发送请求之前,需要进行伪装headers请求头# user-agent 浏览器基本标识 用户代理 基本伪装 反反爬的手段# 出现 403 加防盗链 refererheaders = {'referer': 'xxx',  # 加防盗链 referer       此处的xxx去请求头里查看'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'}response = requests.get(url=html_url, headers=headers)  # 请求代码return responsedef get_video_info(html_url):"""获取视频标题 / 音频url地址 / 视频画面url地址:param html_url: 视频的详情页:return: 视频标题 / 音频url地址 / 视频画面url地址"""response = get_response(html_url=html_url)# response.text 获取响应体的文本数据# print(response.text)# 只要你可以看到数据 就可以下载 进行批量下载# 解析数据 提取视频标题 re正则表达式 css选择器 xpath(解析方式) bs4 parsel lxml(解析模块) jsonpath 主要提取json数据# 通过re正则表达式里面findall方法提取数据内容 ‘返回都是列表数据类型[0] 列表 索引取值# 想要的内容用括号括起来 .*? 可以匹配任意字符(除了换行符以外\n)  从response.text 里面查找数据title = re.findall('<h1 id="video-title" title="(.*?)" class="video-title">', response.text)[0]  # 标题html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0]  # 提取播放信息# html_data 是什么样的数据类型 <class 'str'># 为了更加方便提取数据, 可以字符串数据 转换成 字段数据类型# print(title)# print(html_data)# pprint.pprint(html_data)# print(type(html_data))json_data = json.loads(html_data)# 根据冒号左边的内容,提取冒号右边的内容 键值对取值audio_url = json_data['data']['dash']['audio'][0]['baseUrl']video_url = json_data['data']['dash']['video'][0]['baseUrl']video_info = [title, audio_url, video_url]# pprint.pprint(json_data)# print(audio_url)# print(video_url)return video_infodef save(title, audio_url, video_url):"""保存数据函数:param title:视频标题:param audio_url: 音频url:param video_url: 视频画面url:return:"""# 保存音频 视频数据 获取二进制数据内容# 使用正则表达式将标题当中的所有标点符号替换为空title = re.sub('\W+', '', title).replace("_", '')audio_content = get_response(html_url=audio_url).contentvideo_content = get_response(html_url=video_url).contentwith open(title + '.mp3', mode='wb') as f:f.write(audio_content)with open(title + '.mp4', mode='wb') as f:f.write(video_content)print(title, '保存成功~~~')def merge_data(video_name):"""数据合并"""# 使用正则表达式将标题当中的所有标点符号替换为空,防止执行ffmpeg合并视频和音频时输出视频失败video_name = re.sub('\W+', '', video_name).replace("_", '')print('视频合成开始:', video_name)cmd = f"D:/ffmpeg/ffmpeg-5.0-essentials_build/bin/ffmpeg -i {video_name}.mp4 -i {video_name}.mp3 -c:v copy -c:a aac -strict experimental {video_name}out.mp4"# print(cmd)subprocess.run(cmd, shell=True)print('视频合成结束:', video_name)def main(bv_id):"""主函数:param bv_id: bv号:return:"""url = f'https://xxx/video/{bv_id}'  # 此处的xxx为链接什么链接不能写video_info = get_video_info(url)save(video_info[0], video_info[1], video_info[2])#调用数据合并merge_data(video_info[0])keyword = input('请输入你要下载的视频BV号:')
main(keyword)# response = get_response(html_url=url)
# response.text 获取响应体的文本数据
# print(response.text)

此文章仅供学习,也作为个人记录,如果各位大佬有什么问题可以相互讨论。

python爬虫-个人记录相关推荐

  1. python爬虫,记录爬取全球所有国家-首都的简单爬虫

    python爬虫,记录爬取全球所有国家-首都的简单爬虫 本来以为简单至极,没想到获取数据还是花费了大把功夫.先上图 <table> <tr> <td> <st ...

  2. python爬虫工程师-记录一下自己找“python爬虫工程师实习生”岗位的经历

    今天是2018年9月11号,是我实习的第二天,记录一下找工作的历程,本来准备昨晚写的,但是第一天来实习,有点累了,就早点睡了,早上醒了,洗漱一下就来写这篇文章了. 鄙人的水平很低,而且还是一名大四的学 ...

  3. python爬虫实例-记录一次简单的Python爬虫实例

    本次的这篇文章主要是和大家分享了一篇关于记录一次简单的Python爬虫实例 ,有需要的小伙伴可以看一下. 主要流程分为: 爬取.整理.存储 1.其中用到几个包,包括 requests 用于向网站发送请 ...

  4. python爬虫实践记录-基于requests访问翻译网页爬取结果

    前言 目前主流的翻译网站反爬虫都挺严格的,某度有sign算法,谷歌自带技能冷却.... 查了一下发现一个反爬虫没用那么苛刻的翻译网站:译典通.         第一次听说这个网站,界面挺老,爬来的源代 ...

  5. python爬虫,记录一下爬取过程,列表数据,翻页,post方式,保存字典

    记录一下自己的爬虫的过程把,最近在做个项目. 要爬取的网站比较简单. 其中的问题是: post方式,网站的数据有一些需要使用post方式才能获得. 比如, 这部分要看到<发起的项目>,需要 ...

  6. python爬虫学习记录(1)基本库的使用——urllib

    一.使用urllib库 python内置HTTP请求库,包含如下四个模块: request:模拟发送请求 error:异常处理模块 parse:工具模块,提供url处理方法 robotparser:识 ...

  7. Python爬虫入门记录1.0:获取网站某板块首页面资讯文章标题

    准备工作: IDE:pycharm 2018.3.5 Anaconda3-2018.12 + Python 3.7.1 1.导入相关的库 file -> settings -> proje ...

  8. Python爬虫学习记录(3)——用Python获取虾米加心歌曲,并获取MP3下载地址

    在第一篇里记录了获取虾米热门歌曲,听了一段时间后,加心了很多歌曲,因此想要批量下载加心过的虾米收藏夹歌曲. 虾米好评歌曲页只保存最近的2000首..之前star过的3k首歌有1k首都不在了.所以起了备 ...

  9. Python爬虫学习记录(2)——LDA处理歌词

    百度空间关闭了, 本系列文章从 hi.baidu.com/cwyalpha 转移过来 想看看某类歌词里哪些词用的比较多. 1. 歌词及类别从这里来 http://music.baidu.com/tag ...

最新文章

  1. 统计csv词频_中文词频统计
  2. python绘制可多角度查看的3d图像
  3. 计算机专业要学几门课呀,计算机专业学生一定要学好这几门课!
  4. BugkuCTF-WEB题源码
  5. Sql Server系列:排序函数
  6. python学习-3.一些常用模块用法
  7. hibernate映射(学生-科目-成绩)
  8. 【SICP练习】80 练习2.52
  9. 7. keras - 模型的保存与载入
  10. 【OTDR曲线工具箱】02 OTDR测量曲线查看
  11. 软件项目经理应具备的素质和条件_项目经理应具备的素质与能力
  12. C++求最大公约数和最小公倍数
  13. mediawiki java_MediaWiki
  14. 亲自动手写爬虫系列三、爬取队列
  15. 傅里叶Fourier变换fft-python-scipy-幅值-辐角-相位(一)
  16. 在线流程图和思维导图开发技术详解(六)
  17. Java8新特性stream流的优雅操作
  18. Transflow:Quake 是如何构建以 DSL 为核心的低代码系统?
  19. Java公式编辑器开发思路,附项目源码
  20. 数学建模——规划模型

热门文章

  1. 小甲鱼python入门笔记(一)(全)
  2. 我的世界 服务器文件ess,求助服务器ess插件报错怎么解
  3. 计算机硕士论文的框架应该怎么写,计算机硕士论文提纲模板 计算机硕士论文框架怎样写...
  4. 【剑指offer】一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
  5. 逆向与破解-windows异常处理机制
  6. python3 最基础
  7. SpringBoot中通过Redis的setnx和自定义注解@Idempotent实现API幂等处理
  8. 斐波那契数列+pyton
  9. 一个BUG引发的灾难:ORA-00600 [kjmchkiseq:!seq]
  10. oracle日期英文