起因

写这次爬虫的契机,源自一个数学学渣内心的呐喊,本想着过完寒假一定好好学习,可无论怎样,也没想到这假会越放越长啊喂(#`O′)

于是,不甘沉沦的我,决定,好好学习,重新做人

某度这个垃圾信息山里,经历了一番寻找,我发现了一个叫乐乐课堂的站点,里面的视频对我们这种学渣来说,感觉超级有用,于是,心生歹念,我全都要!!

分析

首先,这个主站里,有6个主要的版块:
T@J_09Z9Q18YE46BP<code>T_R</code>K.png

经过一番考察,天天练里的货是最多的,于是我们把重点放在这里。进入该模块,发现其按学习阶段,分为小学,初中,高中三个部分。每个学习阶段,又划分出了几门重点科目:
_1~SQHEH8K0HU99_H4_RJ_5.png

依次点击进入后,发现每个知识点都有对应的讲解视频,这便是我们的主要目标:
_T2__4DEJXB_LYQD_OO_FHA.png

右键,检查元素。一次打开各级<div>,找到目标视频的地址:
NE_H_D1@@TS2X_SBM6E_A_F.png

可以发现,视频地址是由前面不变的协议头域名+dat+学习阶段简称+科目简称+/k/video/+视频ID构成

实现爬取

我们一开始的方案是通过遍历后面这些参数以达到下载所有视频的目的,但是写好之后发现,下载出来的视频都是这样的:
IV_SY4UR1_Z@_J4AXT@_1X0.png

第一版代码:

# -*- coding: utf-8 -*-
import requests

origion_url = 'http://v.leleketang.com/dat/ms/ma/k/video/'
           
# ms : middle school
# hs : high school
# ps : primer school
# ma : math
# la : chinese
# en : english
# ch : chemistry
# ph : physics

for id in range(29750,999999):
    url=origion_url+str(id)+'.ogv'
    print("Current id:"+str(id))
    r = requests.get(url)
    if(r.status_code == 200):
        print("正在下载"+str(id)+'.ogv')
        with open(str(id)+'.ogv', "wb") as vedio:
            vedio.write(r.content)
        print("Vedio:"+str(id)+"下载完成!")

文件名全都是视频ID,没有任何辨识度,后期观看视频的时候简直要命,果断PASS,得改进。于是我们上BeautifulSoup,通过遍历每个视频详情页找到视频地址,用详情页的标题来做文件名:
35FH_UQYWC6_U_MF_7S__DI.png

第二版代码:

# -*- coding: utf-8 -*-
import re
import time
import urllib
import requests
from bs4 import BeautifulSoup
 
original_url = "http://www.leleketang.com/cr/stage.php?id="

for id in range(10630,99999):
    time.sleep(2)
    url = original_url+str(id)
    response = requests.get(url)
    print("Now we're in "+str(id))
    soup = BeautifulSoup(response.text,"html.parser")
    script = soup.find_all('script')
    print(soup.title.string)
    try:
        result = re.findall("m4v: \"(.*?)\"", str(script[4]))[0]
        print("Downloading: "+str(id))
        urllib.urlretrieve("http:"+result, soup.title.string+".mp4")
        print("DownLoad Complete!")
        time.sleep(3)
    except:
        pass

这样就好多了,但是仍有一个问题,这个天天练里的绝大部分视频,都是要付费开通VIP才能访问,而我们的爬虫并没有权限,所以第二版的爬虫无法爬到所有的视频,这个问题待解决,如果有大佬解决了,欢迎评论区留下你的codeˋ( ° ▽、° )

实测,第一版可以爬取所有的视频,没有访问限制orz

彩蛋

还记得我们刚刚进入主站时的6大主要板块吗,进入乐学堂模块后,是可以免费试用的,里面货也不少,而且全是干货~

所以,只要在第二版的基础上,改动一下,就变成了:

# -*- coding: utf-8 -*-
import re
import time
import urllib
import requests
from bs4 import BeautifulSoup

def Download(target_url,filename):
    print("Downloading: "+filename)
    urllib.urlretrieve(target_url, filename+".mp4")  #文件名待解决
    print("Download Complete!")

t_url = "https://www.leleketang.com/let3/my_ppts.php?from=undefined&cid="
response = requests.get(t_url+"290620")
soup = BeautifulSoup(response.text,"html.parser")
for each in soup.find_all(name='a',attrs = {'data-step':'2'}):
        cid = re.findall("data-cid=\"(.*?)\"",str(each))[0]
        url = t_url+str(cid)
        response = requests.get(url)
        soup = BeautifulSoup(response.text,"html.parser")
        for each in soup.find_all(name='div',attrs = {'title':'下载'}):
            src = re.findall("data-src=\"(.*?)\"",str(each))[0]
            file_name = re.findall("data-name=\"(.*?)\"",str(each))[0]
            Download(src,file_name)
            #print("下载地址: "+src)
            #print("文件名: "+file_name)

成品:
ICYRU8_4@7X_K_7_1RHZ9NW.png