Python网络爬虫3—爬取umn网站的所有视频


一、网站分析

打开课程详情页,目标是爬取所有的教学视频。
在详情页抓包,可以得到前三个视频的链接后缀。
第一个视频:1581601804.0237.24958.6125399.mp4
第二个视频:1581605929.0875.63457.6129383.mp4
第三个视频:1581605996.445.72069.6126469.mp4
那这个后缀怎么得到呢,首页的源代码里面是没有的,只能抓包看看,果然发现一个很萌的东西,因为开发者为了让首页加载出封面的图片,而这个图片又是直接从视频截取的,然后顺理成章的,网站开发者为了图方便省事,直接就用了和视频一样的url,只是后缀换成了jpg而已。
既然这样就很简单了,渲染出整个页面的数据,然后取出视频的后缀,拼接一下就行了,代码如下。

二、完整代码

#2.1版本公告:从程序目录启动谷歌浏览器驱动
#2.0版本公告:下载内容从网站动态获得
#1.3版本公告:显示已找到多少个资源
#1.2版本公告:加入了文本进度条显示
#1.1版本公告:新增自动创建文件夹功能,文件检索功能,文件已存在时不会重复下载
#umn一键视频爬取器1.0版本介绍:用于爬取umn教学平台上的的教学视频
import time
import pyautogui
import re
import requests
import os
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def video_url_get(url_course):
#----获取视频的url----#
    video_list=[]
    #----设置浏览器静默模式(已停用,否则无法下滑鼠标)----#
    chrome_options=Options()
    chrome_options.add_argument('--headless')
    diver=webdriver.Chrome(executable_path='chromedriver.exe')
    #----访问到首页----#  
    diver.get(url_course)
    time.sleep(4)
    #----鼠标往下滑两次----#
    for i in range(5):
        pyautogui.scroll(-10000)
        time.sleep(2)
    #----获取整个页面的数据,提取出视频后缀----#
    Pagesource=diver.page_source
    video_tails=re.compile('(\d*\.\d*\.\d*.{0,10}).mp4',re.S).findall(Pagesource)
    diver.close()
    for video_tail in video_tails:
        video_url='https://statics0.umustatic.cn/videoweike/teacher/weike/4kXW2806/transcoding/'+video_tail+'.mp4'
        video_list.append(video_url)
    return video_list

def downloader(url):
#----下载器----#
    start=time.time()
    size=0 #定义已下载文件的大小(byte)
    chunk_size=1024 #定义每次下载的数据大小(byte)
    root='d://umn_spider_video//'
    path=root+url.split('/')[-1]
    try:
        if not os.path.exists(root):
            os.mkdir(root)
        if not os.path.exists(path):
            res=requests.get(url,stream=True)
            content_size=int(res.headers['content-length'])
            if res.status_code==200:
                print('[文件大小]:%0.2f MB'%(content_size/1024/1024)) #将byte换算成MB
                print("急速爬虫器正在疯狂下载!!!".center(50,'-'))            
                with open(path,'wb') as f:
                    for data in res.iter_content(chunk_size=chunk_size):
                        f.write(data)
                        size+=len(data)
                        print("\r[下载进度]:{}{:.2f}%".format('>'*int(size*50/content_size),size*100/content_size),end='')
                    print('\n下载成功,文件自动帮您保存在d:/umn_spider_video/')
        else:
            print('文件已存在')
    except:
        print('爬取失败')
if __name__=='__main__':
    url_course=input('请输入课程首页的网址,如果不清楚请看教程:')
    # url_course='https://m.umu.cn/course/?groupId=4138993&sKey=0e6490a0d5ef477593326d2e8cd53faa&from_type=myparticipate'#专业教学设计与案例分析
    # url_course='https://m.umu.cn/course/?groupId=5001078&sKey=e30c05f1c34302d77478bf49a21daec2&from_type=myparticipate'  #职业教育德育研究
    video_list=video_url_get(url_course)
    print('已找到资源共%d个'%len(video_list))
    for url in video_list:
        downloader(url)
    input('任务全部完成,欢迎您的再次使用,按任意键退出。')

有了这个程序模板,只要把url_course换成你自己的课程url,就可以爬取到全部的视频,按理说应该可以爬取任意的课程视频了,我又用这个程序取爬取了另外一门课程的视频,实测是没问题的。
就是注意一点,如果用于盈利的话,就涉及侵权,侵权违法,不要说是我教的。


文章作者: 彭韦浩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 彭韦浩 !
  目录