这篇想写很久了,今天专门搞了搞,现在把用python下载知乎视频的整个流程码下来。
(1)目标站点分析
比如这篇知乎文章https://www.zhihu.com/question/279247693/answer/442578073里有一个小视频,我们想把它下载下来,首先对该网页进行分析。先来看一下原始请求:
原始请求有没有返回视频的链接呢?我们点开“Preview”和“Response”看一看:
这不就是我们想要的东西吗!接下来就是常规操作了,requests请求到网页代码之后可以用正则表达式或者BeautifulSoup和PyQuery之类的解析库提取到视频的URL。
现在让我们看一看上面的视频URL打开之后是什么东西:
显然,这是一个可以播放的视频,问题是我们怎样才能把它下载下来呢?一步一步来分析:
首先,我们发现原始请求返回的状态码是301,而且细心一些就可以看到网页的URL变了,从原来的https://www.zhihu.com/video/1001598833150816256变成了一个新的URLhttps://v.vzuu.com/video/1001598833150816256,如上图。状态码301代表什么呢,同样百度一下:
301表示永久重定向(301 moved permanently),表示请求的资源分配了新url,以后应使用新url。
这样就可以理解了,也就是请求视频的URL之后,转到了一个新的URL,我们可以用一个函数获取到这个新的URL:
def get_real_url(url, try_count=1):
if try_count > 3:
return None
try:
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'
}
response = requests.get(url, headers=headers, timeout=10)
if response.status_code >= 400:
return get_real_url(url, try_count+1)
return response.url
except RequestException:
return get_real_url(url, try_count+1)
然后,我们看一下请求这个新的URL会发生什么: