利用selenium和ffmpeg爬取m3u8 ts视频《进击的巨人》
需求
想看下动漫《进击的巨人》,发现到处被和谐,找不到资源,但是在一个视频网站找到了在线播放,https://www.55cc.cc/dongman/17890/player-2-1.html,然而不能下载下来(喜欢的东西我一般都看很多遍)
找了下,网站没发现robots协议,加上我用的和真人浏览差不多的效率来爬取,应该ok的
于是想爬虫爬取下,但是看源代码发现视频是m3u8的ts流,而且是双层m3u8的,并且m3u8地址还隐藏在js代码中,于是有2种处理方法:
1.直接requests源码,把js代码的部分逐字解析,找出m3u8地址。
2.直接调用浏览器渲染,将渲染后的网页代码拿到,就可以看到iframe标签中src地址了

获取到首层m3u8地址后就简单了,直接requests请求到第二层m3u8地址,这就是真实地址了,下载后可以看到是很多的ts流小文件,于是有2种处理方法了:
1.直接逐个获取ts地址,然而写到本地磁盘的同一个文件,最后转码到mp4(ts格式太占空间)
2.直接调用ffmpeg,能根据m3u8地址下载ts流并合并为一个文件且同步转码为mp4

上述均采用第二种方法,于是写出个简单的该网站的视频爬虫
源代码
from selenium import webdriver
from bs4 import BeautifulSoup
import re
import requests
import os if __name__ == '__main__':
urls = ['https://www.55cc.cc/dongman/17890/player-2-'+str(n)+'.html' for n in range(1,14,)]
for url in urls:
browser = webdriver.Firefox()
browser.get(url)
htmldata=browser.page_source
browser.close()
soup = BeautifulSoup(htmldata,'html.parser')
m3u8 = re.findall(r'(https://\S+)',soup.select('iframe[name="iFrame_play"]')[0].get('src')[1::1])[0]
r = requests.get(m3u8).text
m3u8_rel = m3u8.replace('index.m3u8','')+re.split('\n',r)[-1]
ffmpeg = '"C:\\soft\\ffmpeg\\bin\\ffmpeg.exe"'
output = "f:\\进击的巨人\\第三季\\"+soup.title.string.replace('集在线观看_动漫_五五影院','').replace(' ','')+".mp4"
cmd = ffmpeg+" -i "+m3u8_rel+" -vcodec copy -acodec copy "+output
os.system(cmd)
执行结果

总结
每次都要启动浏览器,有点儿膈应人,后面还是改成headless浏览器即无界面浏览器(无头浏览器)来渲染
12集都要顺序执行下载,有点儿慢,后续改成并发执行,一次性同步并发执行12条cmd命令来下载,即多进程方式
优化后
把共12集由原来的串行爬取改为并行爬取,增加效率

from selenium import webdriver
from bs4 import BeautifulSoup
import re
import requests
import os if __name__ == '__main__':
urls = ['https://www.55cc.cc/dongman/17890/player-2-'+str(n)+'.html' for n in range(1,14,)]
cmds = []
command = ''
for url in urls:
browser = webdriver.Firefox()
browser.get(url)
htmldata=browser.page_source
browser.close()
soup = BeautifulSoup(htmldata,'html.parser')
m3u8 = re.findall(r'(https://\S+)',soup.select('iframe[name="iFrame_play"]')[0].get('src')[1::1])[0]
r = requests.get(m3u8).text
m3u8_rel = m3u8.replace('index.m3u8','')+re.split('\n',r)[-1]
output = "f:\\进击的巨人\\第三季\\"+soup.title.string.replace('集在线观看_动漫_五五影院','').replace(' ','')+".mp4"
cmd ="ffmpeg -i "+m3u8_rel+" -vcodec copy -acodec copy "+output
cmds.append(cmd)
#os.system(cmd)
for i in cmds:
command+='start cmd /c "'+i+'"&'
os.system(command[:-1:])
知识点
尝试过you-get来爬,不过好像不好用,也许是我菜
浏览器动态渲染 webkit;
python中动态网页爬取方式:
dryscape 作者已经不再维护了,并且作者推荐的库仅是python2,已凉凉;
selenium 可以,但是缺点是必须要打开浏览器;
Phantom JS,无头浏览器 ,无界面浏览器, headless ,借助之可以模拟webkit执行,但是Phantom JS停止更新了且selenium不支持它了,也凉凉;
chrome headless 或者firefox headless可以替代Phantom JS(建议使用,毕竟官方出品,比开源项目动不动有大坑,比如phantomjs坑1000+,或者没人维护等等毛病)
puppeteer也可以替代Phantom JS ,Pyppeteer是其python实现库但是有问题不成熟,不建议用
tampermonkey油猴插件,自动交互,用js注入,可以对网页各种花式操作,比如给网页注入个下载按钮啥的(油猴可以自动交互但不好监控网络请求,chrome extension 可以监控请求但没法监控响应,cdp 全部都可以做但是不好操作 dom)
cheerio 针对DOM的
appium是针对手机端的,一般由于手机端性能问题,反爬策略较少,对于pc端实在没法子的,可以从手机端操作
selenium被识别的程度越来越高,阿里的网站瞬间能识别,但是识别了并不会告诉你,而是返回给你和真人不一样的结果
一般小型网站,直接webkit渲染即可,最简单通用的方式是用 headless 的浏览器,完全模拟人工操作,增大 IP 池,降低访问评率。缺点是效率低,资源成本高
大型网站,是有价值去仔细分析的,一般都是前后分离,传输数据都是json,找到接口requests即可,但是对于加密的,直接请求又可能不行
无头浏览器的资源占用太多,能不用就不用
利用selenium和ffmpeg爬取m3u8 ts视频《进击的巨人》的更多相关文章
- 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)
前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...
- 一起学爬虫——使用selenium和pyquery爬取京东商品列表
layout: article title: 一起学爬虫--使用selenium和pyquery爬取京东商品列表 mathjax: true --- 今天一起学起使用selenium和pyquery爬 ...
- 利用Python网络爬虫爬取学校官网十条标题
利用Python网络爬虫爬取学校官网十条标题 案例代码: # __author : "J" # date : 2018-03-06 # 导入需要用到的库文件 import urll ...
- PYTHON 爬虫笔记九:利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集(实战项目二)
利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集 目标站点分析 今日头条这类的网站制作,从数据形式,CSS样式都是通过数据接口的样式来决定的,所以它的抓取方法和其他网页的抓取方 ...
- 爬虫(四)Selenium + Headless Chrome爬取Bing图片搜索结果
Bing图片搜索结果是动态加载的,如果我们直接用requests去访问页面爬取数据,那我们只能拿到很少的图片.所以我们使用Selenium + Headless Chrome来爬取搜索结果.在开始前, ...
- python 爬取腾讯视频的全部评论
一.网址分析 查阅了网上的大部分资料,大概都是通过抓包获取.但是抓包有点麻烦,尝试了F12,也可以获取到评论.以电视剧<在一起>为例子.评论最底端有个查看更多评论猜测过去应该是 Ajax ...
- 爬虫之爬取B站视频及破解知乎登录方法(进阶)
今日内容概要 爬虫思路之破解知乎登录 爬虫思路之破解红薯网小说 爬取b站视频 Xpath选择器 MongoDB数据库 爬取b站视频 """ 爬取大的视频网站资源的时候,一 ...
- Python爬取某短视频热点
写在前面的一些话: 随着短视频的大火,不仅可以给人们带来娱乐,还有热点新闻时事以及各种知识,刷短视频也逐渐成为了日常生活的一部分.本文以一个简单的小例子,简述如何通过Pyhton依托Selenium来 ...
- 如何手动写一个Python脚本自动爬取Bilibili小视频
如何手动写一个Python脚本自动爬取Bilibili小视频 国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶-- 我身边的很多小伙伴们在朋友圈里面晒着出去游玩 ...
随机推荐
- Linux简单命令的使用
1.linux上怎么快速删除一个目录在linux中删除一个目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可解决.直接rm就可以了,不过要加两 ...
- nginx 配置使用index.php作为目录的默认加载文件
配置如下: 在server增加一行: index index.php index.html index.htm default.php default.htm default.html 增加后如下: ...
- aws产品整理
计算 Amazon EC2:弹性虚拟机 AWS Batch:批处理计算 Amazon ECR:Docker容器管理 Amazon ECS:高度可扩展的快速容器管理服务 Amazon EKS:在AWS上 ...
- C++面向对象程序设计学习笔记(2)
C++在非面向对象方面的扩充 C++向下兼容C语言,因此C语言中的语法在C++中依然成立 输入输出 C++添加了标准输入流对象cin和标准输出流对象cout来进行输入输出, 例: #include&l ...
- Apex 中 DML 进阶知识小结
DML 选项 在 DML 语句执行的时候可以设置选项.这些选项用 DML.Options 类来表示. 完整的介绍在官方文档中. 在建立一个 DML.Options 实例之后,可以使用 setOptio ...
- mysql悲观锁的实现
https://www.cnblogs.com/laoyeye/p/8228467.html 参考原文链接, //0.开始事务 begin;/begin work;/start transaction ...
- wait函数和waitpid的使用和总结
wait和waitpid出现的原因 SIGCHLD --当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) --子进程退出时,内 ...
- 【2019.7.15 NOIP模拟赛 T2】与非树(nand)(树形DP)
树形\(DP\) 实际上,这道题应该不是很难. 我们设\(f_{x,i,j}\)表示在以\(x\)为根的子树内,原本应输出\(i\),结果输出了\(j\)的情况数. 转移时,为了方便,我们先考虑与,再 ...
- 《30天自制操作系统》笔记4 --- (Day2 下节)了解如何用汇编写操作系统中的HelloWorld
关于上一节,我测试了发现3e.4c.4e都OK ,4b 4d 4f都进不去系统还把qemu卡死了. 50不会输出HelloWorld,可能需要hex偶数且在0x3e~4f区间吧.上节复制并运行命令如下 ...
- (十五)golang--init函数
每一个源文件都会包含一个init函数,这个函数会在执行main()执行之前被调用,相当于python中的__init__ 注意细节:(1)如果一个文件同时包含全局变量定义,init函数和main函数, ...