匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

【Python爬虫】Python爬虫实战:爬取腾讯课堂视频

【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。

运行代码后,我们就可以愉快地离线观看腾讯课堂的视频啦!