爬取某视频网站电影,仅参考学习
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、爬取思路
- 爬取使用到的第三方库和技术知识:
- 将对应步骤进行分析
- 1. 找到网页首页,输入相关的关键字进行搜索
- 为了方便,把爬取的方法打包起来
- 分析网页拿到想要的链接和网络
- 拿到的结果如下:
- 对得到的链接,爬取单个剧的剧集和链接
- 3. 分析当前视频来源
- 通过在源码中搜索m3u8找到了这三个,分析源码可得,这是js生成的数据。
- 终于拿到了js传过来的json数据,对着json数据一顿拳打脚踢之后,拿他的url就行了。
- 紧接着使用螃蟹拳,把m3u8的头打歪,代码处理如下:
- 4. 拿到m3u8文件进行分析
- 对网页分析一波之后,发现了一些蹊跷,经过百度后发现,原来还配上了密码阿(嗦嘎,高级货)
- 5. 使用FFmpeg进行下载
- 经过一系列的分析之后发现,FFmpeg有合并m3u8的功能
- 其中走了很多的误区,也一一指出吧:
- 总之,在最后解决了,在命令行中尝试了这段命令
- 总结
前言
在前面学习了一些爬取视频的案例后,为了巩固知新,自己去网上找一些爬取其他视频的方法, 后面发现网上并没有流出这种,所以自己就根据前两次学习到的知识,将某网站的凹凸曼视频拿了下来 ,只分享思想和部分代码,想要一起交流学习的可以私聊,只为学习,有一定基础的可以技术交流;没任何基础,纯粹是想爬视频看的就算了,因为我不会贴源码的,我是王玉玊,我为自己代言。
提示:以下是本篇文章正文内容,下面案例仅供参考
一、爬取思路
爬取使用到的第三方库和技术知识:
requests进行爬取
bs4剖析html
re正则(字符串分割也行,因为我正则是真的菜到姥姥家了)
添加防盗链
处理M3u8和ts之类的视频文件流
python使用命令行命令
- 找到网页首页,输入相关的关键字进行搜索
- 爬取搜索到的列表主要信息:剧名,链接
- 分析当前视频来源
- 拿到m3u8文件进行分析
- 使用FFmpeg进行下载
将对应步骤进行分析
1. 找到网页首页,输入相关的关键字进行搜索
为了方便,把爬取的方法打包起来
def send_request(url):chrome = ["Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36","Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36","Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36","Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36","Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36"]random_headers = random.choice(chrome)print(url, '网页爬取路径')headers = {'referer': url,"User-Agent": random_headers}# res = requests.get(url=url, headers=headers, verify=False) # 去除SSLres = requests.get(url=url, headers=headers)t = random.randint(1, 4)time.sleep(t)return resif __name__ == '__main__':# title_html = save_html(url, "text")with open("text.html", 'r', encoding='utf-8') as f:data = f.read()
分析网页拿到想要的链接和网络
soup = BeautifulSoup(data, 'html.parser')div = soup.find("div", class_="myui-panel_bd col-pd clearfix")li = div.findAll("li")for i in li:h4 = i.find('h4', class_='title')a = h4.find('a')title = a.texthref = a['href']# 获取到列表的标题和网址print(title, href)print("----------" * 5)# break #只做一次循环,为了测试使用
拿到的结果如下:
对得到的链接,爬取单个剧的剧集和链接
def spider_html(titles, url):''':param titles: 电视剧标题:param url: 电视剧链接:return: None'''title_html = save_html(url, titles)with open(title_html, 'r', encoding='utf-8') as f:data = f.read()# print(data)soup = BeautifulSoup(data, 'html.parser')div = soup.find("div", id="playlist1")li = div.findAll('li', class_='col-lg-8 col-md-7 col-sm-6 col-xs-4')for i in li:a = i.find('a')title = titles + "_" + a.texthref = a['href']# 获取到列表的标题和网址print(title, href)# spider_movie(title, 'http://tv.cnco.me/' + href)# break # 先不循环,看效果
3. 分析当前视频来源
通过在源码中搜索m3u8找到了这三个,分析源码可得,这是js生成的数据。
所以需要正则来得到结果,然而我是真的找不出结果,我实在没法子了,只能用字符串分割了,只要分割线足够宽,就没有人拦得到我拿数据。
title_html = save_html(url, title)with open(title_html, 'r', encoding='utf-8') as f:data = f.read()# m3u8_json = re.findall('''<i class="fa fa-close"></i></a><div class="myui-player__video embed-responsive clearfix"><script type="text/javascript">var player_aaaa=(.*?)</script>''',data)# print(m3u8_json)# pprint.pprint(m3u8_json)# print(data)split_json = data.split("""<script type="text/javascript">var player_aaaa=""")[1]# print(len(split_json))split_json = split_json.split("</script>")[0].strip().replace('\n', '').replace(" ", '')# pprint.pprint(json.loads(split_json))
终于拿到了js传过来的json数据,对着json数据一顿拳打脚踢之后,拿他的url就行了。
在拿到url之后发现:这m3u8演我,它打假赛阿(搁着套娃呢?玩呢?),内容如下:
紧接着使用螃蟹拳,把m3u8的头打歪,代码处理如下:
m3u8_data = re.sub('#EXTM3U', "", m3u8_before)m3u8_data = re.sub('#EXT-X-STREAM-INF:PROGRAM-ID=\d,BANDWIDTH=\d+,RESOLUTION=\d+x\d+', "", m3u8_data)m3u8 = 'https://v11.tkzyapi.com/' + m3u8_data.replace("\n", '')
得到最后存放播放ts文件的m3u8
原本还对这玩意进行了ts下载和合并
m3u8_data = send_request(m3u8).textm3u8_data = re.sub('#EXTM3U', "", m3u8_data)m3u8_data = re.sub('#EXT-X-VERSION:\d', "", m3u8_data)m3u8_data = re.sub('#EXT-X-TARGETDURATION:\d', "", m3u8_data)m3u8_data = re.sub('#EXT-X-MEDIA-SEQUENCE:\d', "", m3u8_data)m3u8_data = re.sub('#EXT-X-PLAYLIST-TYPE:VOD', "", m3u8_data)m3u8_data = re.sub('#EXT-X-DISCONTINUITY', "", m3u8_data)m3u8_data = re.sub('#EXT-X-KEY:METHOD=NONE', "", m3u8_data)m3u8_data = re.sub('#EXTINF:3,', "", m3u8_data)m3u8_data = re.sub('#EXT-X-ENDLIST', "", m3u8_data)m3u8_data = re.sub('#EXTINF:\d.\d+,', "", m3u8_data).split()with open("video/" + title + ".txt", 'w+') as f:for i in m3u8_data:f.write(i+"\n")print(i)
后面发现合并好了之后打不开啊,只能重新对页面进行分析。
4. 拿到m3u8文件进行分析
对网页分析一波之后,发现了一些蹊跷,经过百度后发现,原来还配上了密码阿(嗦嘎,高级货)
分析箭头所指的两个文件,至于为啥要搜m3u8呢,因为看这种一点一点加载的文件,就知道他是片段ts的,目前只有m3u8是最为常见的格式,m3u8的内容如下:
而上上图得到的key.key也是这里链接访问到的key,对于这个key,本人昨天搞了一个小时去研究,发现并无所获,只能了解到一些大概知识:key是一串16字节的二进制码,但是在网上百度的都是Linux对key的处理方法,所以我焉了,找到了一种新思路,为啥网页通过这些玩意就可以直接加载呢,毕竟人家后台也是用代码写的,是不是用了某些整合的命令?
5. 使用FFmpeg进行下载
经过一系列的分析之后发现,FFmpeg有合并m3u8的功能
其中走了很多的误区,也一一指出吧:
- 对m3u8文件提取ts文件单独下载合并
- 使用openssL命令进行合并,与key值的提取,虽然当时知道明显不可能,但是尝试下可不可以单独合成ts文件播放,结果失败了
- 使用FFmpeg对m3u8处理前,将key和ts文件下载到了本地,然后将m3u8文件的内容地址都改成自己的本地路径,然后太多了,而且改不完。
- 对key文件进行解码,16字节16进制的16个数,我真的不知道怎么变成一些博客里说的32个16进制数。。
# m3u8_data = send_request(m3u8).text# m3u8_data = re.sub('#EXTM3U', "", m3u8_data)# m3u8_data = re.sub('#EXT-X-VERSION:\d', "", m3u8_data)# m3u8_data = re.sub('#EXT-X-TARGETDURATION:\d', "", m3u8_data)# m3u8_data = re.sub('#EXT-X-MEDIA-SEQUENCE:\d', "", m3u8_data)# m3u8_data = re.sub('#EXT-X-PLAYLIST-TYPE:VOD', "", m3u8_data)# m3u8_data = re.sub('#EXT-X-DISCONTINUITY', "", m3u8_data)# m3u8_data = re.sub('#EXT-X-KEY:METHOD=NONE', "", m3u8_data)# m3u8_data = re.sub('#EXTINF:3,', "", m3u8_data)# m3u8_data = re.sub('#EXT-X-ENDLIST', "", m3u8_data)# m3u8_data = re.sub('#EXTINF:\d.\d+,', "", m3u8_data).split()## with open("video/" + title + ".txt", 'w+') as f:# for i in m3u8_data:# f.write(i+"\n")# print(i)# openssl aes-128-cbc -d -in 2Ev4YOCx.ts -out media_decryptd_0.ts -nosalt -iv 0 -K d5ec6e51ddcdce99cmd='ffmpeg -i "'+m3u8+'" -c copy '+ title +'.mp4'# subprocess.Popen(cmd, shell=True)print(cmd)# os.system(cmd)print('视频合成结束:', title)# 第一条为key的链接# with open("videos/key.key", 'w') as f:# ts_content = send_request(m3u8_data[0].split('"')[1]).text# f.write(ts_content)# for i in m3u8_data[1:]:# # 5.保存数据# ts_content = send_request(i).content# with open("videos/" + i.split("/")[-1], 'wb') as f:# f.write(ts_content)# print(title + '.ts下载完成')
# Failed to open segment 503 ofplaylist 0
# indexlll.m3u8: Invalid data found when processing input
总之,在最后解决了,在命令行中尝试了这段命令
其中会有一些因为网络原因,或者路径不存在而丢失,但不会报错,最后得到的视频也可以播放,,但是是否完整就不得而知了,毕竟将近半个小时的时长,400条左右的链接,难免会有点瑕疵。
下面图一是我爬取的截图时长
图二是原视频时长
好像看起来没啥问题。
总结
周末没事干,爬来玩玩,这次爬取终于没有参考一些教学视频了,只是百度了一些不知道的知识点,比如m3u8的key,python控制命令行等等。。学以致用,多练习一些案例才能熟练的掌握这些,如果以后我从事这行,再回来复习下自己的博客加以理解学习。
爬取某视频网站电影,仅参考学习相关推荐
- 爬取某视频网站的电影
通过抓包爬取某视频网站的电影 burpsuite工具 1. 先使用抓包工具进行抓包分析,得到对应的接口 2. 直接用requests库来请求响应数据 3. 存入数据库 代码 from functool ...
- python网络爬虫爬取视频_Python网络爬虫——爬取小视频网站源视频!自己偷偷看哦!...
学习前提1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 1.引入库 爬取网站视频需要引入的第三方库: impor ...
- 简单爬虫——爬取Scrape|Movie网站电影排行Top10
1.简单说明 本教程仅用来学习,不用于商业目的.这是第一次写文章,排版可能有点差,希望大家理解,嘻嘻. 不喜欢看分析的同学可以直接跳到最后有源代码 我们要爬的网站为:https://static1.s ...
- python3下载网页视频_Python网络爬虫——爬取小视频网站源视频!自己偷偷看哦!...
学习前提 1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 1.引入库 PS:如有需要Python学习资料的小伙伴 ...
- Python网络爬虫——爬取小视频网站源视频!自己偷偷看哦!
学习前提 1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 1.引入库 PS:如有需要Python学习资料的小伙伴 ...
- python爬取web漫画网站_[Python爬虫学习]利用selenuim爬取漫画网站
注意事项 版本 Python版本为 Python-3.8.3 系统为 Windows10 浏览器为 Firefox-77.0 前置 \(selenium\) \(BeautifulSoup\) \(r ...
- Qt 爬虫 爬取LCSC的器件信息(仅供学习,请勿违法)
创建.cpp/.h文件,复制以下代码即可 // // Created by Administrator on 2023/3/12. //#include <QRegularExpressionM ...
- 使用线程池批量爬取梨视频最热视频
小白尝试用刚学到的线程池对梨视频音乐专栏下的最热板块的四个视频进行异步爬取,参考B站教学视频和各位大佬的指点终于运行成功!!! 目录 文章目录 前言 一.难点 二.使用步骤 1. 引入库 2. ...
- python爬虫:爬取猎聘网站职位详情
python爬虫:爬取猎聘网站职位详情 第一次学习python,也是刚开始学习爬虫,完成的第一个实例,记录一下. baseurl.py # @author centao # @time 2020.10 ...
最新文章
- 今日头条CEO朱文佳:新一代搜索引擎已经来了
- 从芯片巨头沦落到收购对象 高通是怎样失去魔力的?
- 如何促使团队紧密协作
- COM+组件注册方法
- 在asp.net core中使用托管服务实现后台任务
- Chart of Accout-科目表
- J .U.C 简介-Lock
- RequestMapping注解的作用
- [Python]使用 lambda 函数
- linux网卡顺序问题,linux网卡绑定及网卡顺序变更测试.docx
- 2021年NBA季后赛第三轮晋级预测
- React Native开发之IDE(Atom+Nuclide)安装,运行,调试
- 电机控制初学入门资料_电机控制如何入门
- 常见几种编码格式及比较
- 头的各个部位示意图_人体头部结构图:人体图片头部组织图文解读
- zen-cart修改 zencart 模板修改
- 在html上运行asp,ASP在网页设计的作用
- Android Studio BMI计算器设计(三种计算标准)
- Android 按电源键亮屏/息屏流程分析
- Redis基本概念知识
热门文章
- convolutional LSTM(convLSTM)的pytorch版本代码实现
- Java写泡泡堂网络游戏
- 伤感qq日志-爱冷了 情淡了、心累了,陌生了
- java 高效计算99乘法表_【九九乘法表】九九乘法表学习攻略 九九乘法表快速记忆小诀窍...
- MIT6.031学习笔记:(一)code review
- 惠普暗影精灵7和联想小新pro16哪个好
- 「Vue实战」武装你的前端项目
- 前端开发之走进Vue.js(入门者看过来)
- 线段树维护(最大区间和,最大子段和,最长连续上升子序列)
- 【考前冲刺】计算机三级网络技术之综合题-IP地址计算