想看下动漫《进击的巨人》,发现处处被和谐,找不到资源,可是在一个视频网站找到了在线播放,https://www.55cc.cc/dongman/17890/player-2-1.html,然而不能下载下来(喜欢的东西我通常都看不少遍)html
找了下,网站没发现robots协议,加上我用的和真人浏览差很少的效率来爬取,应该ok的python
因而想爬虫爬取下,可是看源代码发现视频是m3u8的ts流,并且是双层m3u8的,而且m3u8地址还隐藏在js代码中,因而有2种处理方法:web
1.直接requests源码,把js代码的部分逐字解析,找出m3u8地址。chrome
2.直接调用浏览器渲染,将渲染后的网页代码拿到,就能够看到iframe标签中src地址了json
获取到首层m3u8地址后就简单了,直接requests请求到第二层m3u8地址,这就是真实地址了,下载后能够看到是不少的ts流小文件,因而有2种处理方法了:浏览器
1.直接逐个获取ts地址,然而写到本地磁盘的同一个文件,最后转码到mp4(ts格式太占空间) bash
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浏览器即无界面浏览器(无头浏览器)来渲染app
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便可,可是对于加密的,直接请求又可能不行
无头浏览器的资源占用太多,能不用就不用