网页flash抓取视频(优酷ios客户端分享来的链接,提取出视频源的经验)
优采云 发布时间: 2021-11-04 01:20网页flash抓取视频(优酷ios客户端分享来的链接,提取出视频源的经验)
最近遇到一个需求:根据优酷ios客户端分享的链接提取视频源,在ios系统播放器上播放。踩了一些坑之后,笔者也有了一些提取视频的经验网站。这里总结一下,为以后遇到这个问题的同学提供一些经验和方向。
1. 简介
提取网站视频链接的三种情况:
电脑版网页链接,查看此类网页的源代码时,会发现视频源为flash文件,无法获取有效的视频地址。需要使用第三方库You-Get 可惜You-Get不支持所有视频网站,对于不支持的视频网站,需要设置User-Agent模拟iPhone用户提取,或破解其加密方法 iPhone Safair 中的视频源。这是本文的重点。2. 使用你-获取视频地址
You-Get 实际上是一个视频下载器,用 Python3 编写并在命令行环境而不是 GUI 中运行。支持大量视频网站,详情可查看,持续更新中。
安装 You-Get
You-Get 运行在 Python3 环境下,不支持 Python2.x。所以在开始之前,系统中必须至少有一个版本的Python3.x。
虽然在项目介绍中说可以直接编译安装源代码,但是如果没有特殊要求,使用pip是最简单的安装方式。pip安装请参考这个文章pip安装。
使用 pip 安装 You-get
$ [sudo] pip3 install you-get
复制代码
检查是否安装成功
$ you-get -V
复制代码
使用 You-Get 下载视频
$ you-get http://youtu.be/sGwy8DsUJ4M
复制代码
显示视频信息
$ you-get -u http://youtu.be/sGwy8DsUJ4M
复制代码
使用you-get -u $link 返回视频信息,然后使用正则表达式提取视频链接。
一些问题ios系统播放器只支持mp4、mov等少数视频格式。但是下载的视频很多都是flv格式,无法在系统播放器中播放。手机分享的视频网址无法通过You-Get获取。You-Get 不支持所有视频网站。3. 提取手机Safari的视频链接
虽然ios系统不支持flv等视频格式,优酷等网站依然可以在safari中播放。因此,我猜测手机上的视频不是以falsh文件的形式播放的。通过设置 User-Agent Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B410 Safari/600.1.4 模拟手机浏览器访问视频网站,视频链接可在源码中获取。
视频链接/v_show/id_X...
和网页源代码
图中的src就是我们需要的。
知道源代码收录视频链接就容易多了,只要我们获取源代码,然后使用正则表达式提取视频链接即可。但是,经过尝试,发现视频标签部分是动态获取的。破解js比较麻烦,也不是万能的,所以这里给出一个简单粗暴的解决方法:
在服务器端运行一个虚拟窗口,通过调用浏览器加载网页,并对最终代码做正则提取出视频地址。
复制代码
操作环境
CentOs系统,使用python3.4版本,1M带宽,FireFox浏览器
使用 Splinter 调用浏览器
Splinter 是一个 Python 自动化测试工具,可以模拟浏览器的行为。可以运行js,支持鼠标操作等。
安装稳定版
$ [sudo] pip install splinter
复制代码
或者源码安装
$ git clone git://github.com/cobrateam/splinter.git
$ cd splinter
$ [sudo] python setup.py install
复制代码
代码示例
browser = Browser()
browser.visit(url)
html = browser.html
browser.quit()
复制代码
运行虚拟桌面
centos 服务器没有桌面。为了调用服务器上的浏览器进行渲染,我在centos命令行界面运行了一个虚拟桌面。Xvfb 创建一个新的虚拟 X 窗口并与 python 的 pyvirtualdisplay 一起工作。
安装
# 安装Xvfb和pyvirtualdisplay
yum install xorg-x11-server-Xvfb
pip install pyvirtualdisplay
复制代码
安装火狐和硒
yum install firefox
pip install selenium
复制代码
代码
from pyvirtualdisplay import Display
from selenium import webdriver
display = Display(visible=0, size=(800, 600))
display.start()
browser = webdriver.Firefox()
browser.get('http://www.baidu.com')
print browser.title
browser.quit()
display.stop()
复制代码
说话很便宜,给我看看他妈的代码
from splinter import Browser
from selenium.webdriver import PhantomJS, DesiredCapabilities
from splinter.driver.webdriver import (BaseWebDriver, WebDriverElement as BaseWebDriverElement)
from pyvirtualdisplay import Display
from selenium import webdriver
import re
import json
def fetch_info(url):
html = download_html(url)
videoUrl = parse_html(url, html)
resultDic = {'ret' : 0, 'srcUrl' : url, 'title' : url, 'abstract' : url, 'qsvideo' : videoUrl}
print(json.dumps(resultDic))
pass
def download_html(url):
display = Display(visible=0, size=(800, 600))
display.start()
browser = Browser(user_agent="Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B410 Safari/600.1.4")
browser.visit(url)
html = browser.html
browser.quit()
display.stop()
return html
pass
def parse_html(url, html):
matchObj = re.search(r'', html)
if matchObj:
videoUrl = matchObj.group(2)
return videoUrl
return ""
pass
if __name__ == '__main__':
url = "http://v.youku.com/v_show/id_XMTMyOTU4NTc4OA==.html"
fetch_info(url)
复制代码
4. 第二种情况
第二种情况,You-Get不支持的视频网站,需要设置User-Agent伪装成iPhone用户进行提取,或者破解其加密方式。
5. 总结
总的来说,这是一个可行的爬取方案。但是由于需要浏览器来启动和加载网页,所以在恶劣的环境下效率比较低。对笔者而言,1M带宽的视频链接要花几十秒的时间,几乎是无法忍受的。因此,如何在低带宽下提高速度仍有待探索。目前推测可能是加载网页时下载图片导致耗时,具体原因有待详细调查核实。
参考资料: