如何使用Python脚本下载YouTube视频
我想用一个Python脚本从YouTube下载视频。但是我无法从YouTube页面获取视频的链接。
比如,给定这个链接:http://www.youtube.com/watch?v=5qcmCUsw4EQ&feature=g-all-u&context=G2633db8FAAAAAAAAAAA
- 我需要把视频下载成flv格式或者其他格式。同时,我还希望能下载不同清晰度的视频。
- 我尝试过一些脚本,比如youtube-dl和quvi,但它们都出错了,无法使用。请帮帮我,我会非常感激的。
1 个回答
10
你需要解析一下包含视频的 <embed>
标签里的 flashvars
变量。这些变量的名字可能会变,所以你可能需要试几次才能找到当前的变量名。大致来说,你可以使用像 mechanize
这样的库来获取网页的 HTML 内容,然后用 BeautifulSoup
来解析这些 HTML,并提取出 <embed>
元素中的 flashvars
字段。接着,看看这些变量,找出哪个包含了视频的链接。
例如:
br = mechanize.Browser()
# Browser options
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
# Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
# User-Agent (this is cheating, ok?)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
br.open('%s?v=%s' % (YOUTUBE_URL, vidId))
soup = BeautifulSoup.BeautifulSoup(br.response().read())
flashVars = urllib2.urlparse.parse_qs(soup.find('embed').get('flashvars'))
# Return the first second video source URL
return flashVars['fmt_stream_map'][0].split('|')[1]