Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从youtube下载flv格式的视频。_Python_Download_Youtube_Urllib2 - Fatal编程技术网

Python 从youtube下载flv格式的视频。

Python 从youtube下载flv格式的视频。,python,download,youtube,urllib2,Python,Download,Youtube,Urllib2,我真的不明白youtube是如何提供视频的,但我一直在尽我所能地阅读,似乎旧的方法get_video现在已经过时,不能再使用了,因此,我想问,是否还有另一种类似于Python的简单方法来收集youtube视频。youtube dl可能会给你带来好运 我不确定是否有好的API,但它是用Python编写的,所以理论上你可以做一些比Popen更好的事情:)我建议你使用urllib2或beautifulsoup编写自己的解析器。您可以查看的源代码,了解该插件如何找到视频url。这里有一个下载Youtu

我真的不明白youtube是如何提供视频的,但我一直在尽我所能地阅读,似乎旧的方法get_video现在已经过时,不能再使用了,因此,我想问,是否还有另一种类似于Python的简单方法来收集youtube视频。

youtube dl可能会给你带来好运


我不确定是否有好的API,但它是用Python编写的,所以理论上你可以做一些比Popen更好的事情:)

我建议你使用urllib2或beautifulsoup编写自己的解析器。您可以查看的源代码,了解该插件如何找到视频url。这里有一个下载Youtube视频的快速Python脚本。无需任何提示,只需删除必要的url,点击generate_204 url,然后将数据流式传输到文件:

import lxml.html
import re
import sys
import urllib
import urllib2

_RE_G204 = re.compile('"(http:.+.youtube.com.*\/generate_204[^"]+")', re.M)
_RE_URLS = re.compile('"fmt_url_map": "(\d*[^"]+)",.*', re.M)

def _fetch_url(url, ref=None, path=None):
    opener = urllib2.build_opener()
    headers = {}
    if ref:
        headers['Referer'] = ref
    request = urllib2.Request(url, headers=headers)
    handle = urllib2.urlopen(request)
    if not path:
        return handle.read()
    sys.stdout.write('saving: ')
    # write result to file
    with open(path, 'wb') as out:
        while True:
            part = handle.read(65536)
            if not part:
                break
            out.write(part)
            sys.stdout.write('.')
            sys.stdout.flush()
        sys.stdout.write('\nFinished.\n')

def _extract(html):
    tree = lxml.html.fromstring(html)
    res = {'204': _RE_G204.findall(html)[0].replace('\\', '')}
    for script in tree.findall('.//script'):
        text = script.text_content()
        if 'fmt_url_map' not in text:
            continue
        # found it, extract the urls we need
        for tmp in _RE_URLS.findall(text)[0].split(','):
            url_id, url = tmp.split('|')
            res[url_id] = url.replace('\\', '')
        break
    return res

def main():
    target = sys.argv[1]
    dest = sys.argv[2]
    html = _fetch_url(target)
    res = dict(_extract(html))
    # hit the 'generate_204' url first and remove it
    _fetch_url(res['204'], ref=target)
    del res['204']
    # download the video. now i grab the first 'download' url and use it.
    first = res.values()[0]
    _fetch_url(first, ref=target, path=dest)

if __name__ == '__main__':
    main()
运行它:

python youdown.py 'http://www.youtube.com/watch?v=Je_iqbgGXFw' stevegadd.flv
saving: ........................... finished.

你确定没有生成url或类似的东西吗?我看了youtube dl,它的设计方法似乎有点奇怪,谢谢你的回答,但我仍然无法找到方法。我想get_video方法在7月份被禁用了,根据我搜索它时看到的情况。对不起的:(+1最后,youtube dl是一个复杂的GET请求包装器-但是看看下载成功还需要做些什么可能会有用。你离赢得赏金太近了!它抛出了一个异常。现在它没有。re被破坏了youtube做了一个更新。在修复之前,你不会得到赏金zed使用了url extraction regexp,现在使用了它找到的第一个“videoplayback”url。在几个不同的视频上试用了它,似乎还可以。这不适用于
python 3.3.0
。它会产生很多错误。无论如何,你能解释一下这个想法吗?我可以自己重写它吗?什么是
生成\u 204 url
“点击generate_204 url,然后将数据流式传输到文件”?