【Python爬虫】Python爬虫实战:爬取腾讯课堂视频 在当今信息高速发展的时代,视频学习成为了一种流行的学习方式,而腾讯课堂是国内较为知名的在线教育平台之一。然而,由于各种原因,很多时候我们需要将视频下载到本地,方便离线观看。本篇文章将介绍如何用Python爬虫技术实现对腾讯课堂视频的批量下载。 首先,我们需要了解爬虫的基本流程。使用浏览器打开腾讯课堂,搜索想要下载的视频,通过开发者工具(F12)查看网页源代码,发现视频信息存储在一串JSON格式的数据中。接着,我们找到这个数据的url,通过requests库发送请求获取响应数据,并使用json库对数据进行解析。代码如下: ``` import requests import json url = 'https://ke.qq.com/cgi-bin/comment_new/course_comment_list?cid=624780&count=10&page=0&filter_rating=0&bkn=&_=1527664533298' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36' } response = requests.get(url, headers=headers) response.encoding = 'utf-8' data = json.loads(response.text) print(data) ``` 需要注意的是,这里的url最后面有一些参数,其中cid表示课程ID,可以通过搜索课程后在链接中找到,count表示每一页显示的评论数,page表示当前页码数,filter_rating表示评论等级(0为全部,1为好评,2为中评,3为差评),bkn则为空,不需要管它。 接着,我们发现JSON数据中含有视频信息的url,如下所示: ``` "video_playurl": "https://v.qq.com/txp/iframe/player.html?origin=https%3A%2F%2Fke.qq.com&vid=w06247ose2r&autoplay=false&autoMute=false&share_from=copy", ``` 但是这个url并不能直接下载视频,我们需要再次发送请求,获取视频真正的下载链接。根据观察,真正的下载链接位于以上链接的vid参数后面,因此我们需要对视频信息进行解析,提取出vid参数,然后构造新的请求链接获取下载链接。代码如下: ``` import re vid = re.findall('vid=(.*?)&', data['result'][0]['video_playurl'])[0] url = f'https://h5vv.video.qq.com/getinfo?otype=json&vid={vid}&platform=11001&charge=0&defn=shd&vids={vid}&defaultfmt=auto&show1080p=1&isHLS=0&newplatform=11001&defsrc=2&fhdswitch=0&show1080phdonly=2&guid=6A62CD8A0D0C3F95C2CF3C7D2B4F5D93' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36' } response = requests.get(url, headers=headers) response.encoding = 'utf-8' data = json.loads(response.text[response.text.index('{'):response.text.rindex('}') + 1]) url = data['vl']['vi'][0]['ul']['ui'][0]['url'] print(url) ``` 需要注意的是,这里请求链接中有很多参数,一些比较重要的参数如下: - vid:视频ID,需要从视频信息中提取 - defn:视频清晰度,有ld(标清)、sd(高清)、hd(超清)等几种,我们选择最高清晰度shd来下载 - defaultfmt:视频格式,有auto(自动选择)、hdmp4(MP4高清格式)等几种,我们选择自动选择 最后,我们使用Python的requests和urllib库下载视频。由于视频较大,我们可以使用流式下载,将视频数据分段下载并保存到本地。完整代码如下: ``` import requests import json import re import urllib.request def download_video(url, title): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36' } req = urllib.request.Request(url, headers=headers) response = urllib.request.urlopen(req) chunk_size = 1024 with open(f'{title}.mp4', 'wb') as f: while True: chunk = response.read(chunk_size) if not chunk: break f.write(chunk) def main(): cid = input('请输入课程ID:') url = f'https://ke.qq.com/cgi-bin/comment_new/course_comment_list?cid={cid}&count=10&page=0&filter_rating=0&bkn=&_=1527664533298' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36' } response = requests.get(url, headers=headers) response.encoding = 'utf-8' data = json.loads(response.text) for i, comment in enumerate(data['result']): print(f'正在下载第{i + 1}个视频...') vid = re.findall('vid=(.*?)&', comment['video_playurl'])[0] url = f'https://h5vv.video.qq.com/getinfo?otype=json&vid={vid}&platform=11001&charge=0&defn=shd&vids={vid}&defaultfmt=auto&show1080p=1&isHLS=0&newplatform=11001&defsrc=2&fhdswitch=0&show1080phdonly=2&guid=6A62CD8A0D0C3F95C2CF3C7D2B4F5D93' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36' } response = requests.get(url, headers=headers) response.encoding = 'utf-8' data = json.loads(response.text[response.text.index('{'):response.text.rindex('}') + 1]) url = data['vl']['vi'][0]['ul']['ui'][0]['url'] title = comment['lesson_name'] download_video(url, title) if __name__ == '__main__': main() ``` 我们通过输入课程ID来获取评论信息,并遍历评论信息中的视频信息,依次下载视频到本地。下载的文件名为视频名称,后缀为mp4。 运行代码后,我们就可以愉快地离线观看腾讯课堂的视频啦!