python3_selenium webdriver 和 requetes 爬去淘宝购买的某机构的在线教育视频 教程

前言

大家好,我是宋哈哈,大家在某宝购买了 某某教学视频,每次看的时候,都需要网络去看它,如果网络不好的时候,岂不是看起来非常吃力?这样我们就把它爬去下来吧。【以下代码不一定适合你,但是破解 反爬虫的思路可能适合你】

这是我在某宝购买的视频教程:

在这里插入图片描述
需要爬去的视频预览:
在这里插入图片描述

爬取教程讲解

准备安装好 selenium 和 requests ,json 包,因为淘宝的反爬虫机制做的非常的严格,所以我这里就用到了 selenium 来模拟浏览器。但是同时也要获取cookie ,这里的cookie 可不是直接访问的cookie,是json 的cookie 。后面会讲。

用手机登陆淘宝,分享链接到电脑上,电脑打开就是下面的状态,一种手机的模式。当然也有PC端的,为什么不用PC端的呢,因为我不用爬虫模拟打开,真实的浏览器打开都不断提示我登陆,无法观看视频。不知道是我网络问题,还是淘宝本身问题。废话不多说了。
在这里插入图片描述
打开后,基本操作 F12 .打开 newwork

在这里插入图片描述

然后 按 F5 , 刷新一下浏览器,获取所有的加载文件。

在这里插入图片描述

获取到所有的加载文件,后点击 network 的有一个放大镜 按钮,然后左边 弹出输入框 ,输入 你想要爬去的资料的关键词:入门 , 按下 圆圈 按钮 ,下方就弹出了一个 文件,这个资料的所有信息就在这个文件下。

在这里插入图片描述

单击 出来的 文件url , 右边就会跳出 headers , preview 等信息。
在这里插入图片描述
此时,我们单击, Preview ,然后去用鼠标点击找到我们的的数据。

在这里插入图片描述
上面的数据,我们需要获取到 一些 ID 来拼凑出 资料视频的真实链接,因为我们用调试模式 的到的连接,是一个假的错误URL。

在这里插入图片描述

点击这个连接后,视频是不能播放的。

在这里插入图片描述

每个视频的URL 是这样的 :
https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.4&resourceId=5183000&sectionId=11093072&channel=2&courseId=78011&resourceId=5183000&live=false&title=01-Python%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AE%80%E4%BB%8B &img=%2F%2Fgw.alicdn.com%2Fbao%2Fuploaded%2Fi1%2F2705259897%2FTB2l51DvdBopuFjSZPcXXc9EpXa_!!2705259897.jpg&from=detail

这个时候,我们就需要分析其中的url 连接代码了。试着去删除一些无用 参数。红色加粗的 删除了。发现还能播放。

https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.4&resourceId=5183000&sectionId=11093072&channel=2&courseId=78011&resourceId=5183000&live=false&title=01-Python%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AE%80%E4%BB%8B

URL 代码分析:

https://h5.m.taobao.com/xue/play/index.html? :这段url 路径 每个视频都是一样不变。
spm=a2174.7623065.6.4 : 这个就是参数了,我发现第一个视频 为 a2174.7623065.6.4 ,第二个就是 a2174.7623065.6.5 ,也就是说最后的实在变化,第一个就是 4 第二个就是 5 ,也就是得出 算法 a2174.7623065.6.x+3 , 其中的x 就是 第几页,第一页就是 1+3 ,第二页就是 2+2 ,这样就可以一个 for 循环。

resourceId=5183000 这个就是在我们那个获取的到文件中:

在这里插入图片描述
sectionId=11093072 也是在那个文件中获取:

在这里插入图片描述

channel=2 这个参数保持不变。

courseId=78011 也是在那个文件中获取:

在这里插入图片描述

live=false&title=01-Python%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AE%80%E4%BB%8B 这个就是 标题编译成了十进制。

在这里插入图片描述

当我们知道了这个真实的URL是如何组成的后,我们就开干吧。打开刚刚获取的文件,发现的一个json 文件。这个时候我们就需要获取上面的 requests url 和 cookie ,还有 user-agent ,Referer 和 host

URL :
在这里插入图片描述
COOKIE :

在这里插入图片描述
Rerfer 和 Host :

在这里插入图片描述

USER-AGENT :

在这里插入图片描述

获取以上参数,我们就可以模拟伪装自己,去爬去资料啦:

代码如下【非完全代码,请勿复制直接使用】:

# encoding:utf-8
import json
import requests
from selenium import webdriver
import time
import os
headers = {
    'cookie':'*****************************',
    'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36",
    'host': 'api.m.taobao.com',

}
url = "https://api.m.taobao.com/h5/mtop.lifemallweb.courseinfomtopservice.getoutline/1.0/?appKey=12574478&t=1605101345112&sign=7aeb0c41b0bc943feb126a945606f499&v=1.0&api=mtop.lifemallweb.courseinfomtopservice.getoutline&type=jsonp&dataType=jsonp&callback=mtopjsonp4&data=%7B%22courseId%22%3A%2278011%22%7D"
requ = requests.get(url, headers=headers)
html = requ.text.replace('mtopjsonp4(', '').replace(')', '')
jsontext = json.loads(html)
print(jsontext)
datas = jsontext['data']['data']['outline']['chapters']

# 'https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.4&resourceId= 5183000 &sectionId= 11093072 &channel=2&courseId= 78011 &resourceId= 5183000 &live=false&title=4 &resourceId= 5183000 &sectionId= 11093072 &channel=2&courseId= 78011 &resourceId= 5183000 &live=false&title='

number = 0
#'https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.5&resourceId=5184940&sectionId=11064015&channel=2&courseId=78011&resourceId=5184940'
#'https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.5&resourceId=5184940&sectionId=11064015&channel=2&courseId=78011&resourceId=5184940'
for d in datas:
    video_url_info = d['sections']
    courseid = d['courseId']
    zj_title = d['title']  # 章节
    print(zj_title)
    # print(courseid)
    for v in video_url_info:
        v_id = v['resources']
        sectionid = v['id']
        # print(sectionid)
        for vi in v_id:
            video_id = vi['id']
            video_title = vi['title']  # 文章标题
            print(video_title)
            # print(video_id)
            number += 1
            url = 'https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.%s&resourceId=%s&sectionId=%s&channel=2&courseId=%s&resourceId=%s' % (
            number + 3, video_id, sectionid, courseid, video_id)
            print(url)

这里我们就得到 所有视频的 真是url ,效果如下:

在这里插入图片描述

得到视频URL ,我们就需要进入视频的页面,获取下载url , 然后利用 requests 下载视频。

在这里插入图片描述

然后 F12 ,进入到调试模式 。然后按照惯例,找到该视频的真实的 mp4 下载链接

在这里插入图片描述
上面通过一些手工搜索 mp4 发现都是不能用的,应该是用JS,调用出来的,所以这个时候我们就用到 selenium ,直接获取 网页源代码。

在这里插入图片描述
我们需要找到 这个url ,然后并获取它。

在这里插入图片描述
代码 如下 :

# encoding:utf-8
import json
import requests
from selenium import webdriver
import time
import os
headers = {


    'cookie':'************************',


    'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36",

    'host': 'api.m.taobao.com',

}

chrome_options = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2}
# chrome_options.add_experimental_option("prefs", prefs)
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
chrome_options.add_experimental_option("useAutomationExtension", False)
# chrome_options.add_argument('--host-resolver-rules=MAP g.alicdn.com 127.0.0.1')

driver = webdriver.Chrome(r"D:\pro_py\auto_office\chromedriver\chromedriver.exe", chrome_options=chrome_options)
chrome_options.add_argument(
    'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36')
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",
                       {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})""", })
fahuo_login_url = "https://h5.m.taobao.com/xue/detail.htm?ut_sk=1.WrHJH%2BF63IwDAD7l4yx9ORsJ_21380790_1605021159729.Copy.10000&itemId=552400591967&sourceType=other&ttid=201200%40taobao_iphone_8.8.0&suid=E0B7CB1C-710F-4610-95F7-2F047A369759&un=f249ba94edcb21f83911dc70f8aca8ac&share_crt_v=1&spm=a2159r.13376460.0.0&sp_tk=cmhpN2NQbXJPS0Q=&cpp=1&shareurl=true&short_name=h.43dpkg8&bxsign=scd59xbtg7Htg78I-yuxEtr95S91S-KaaGvXhZeF38L2SpC7Snd8C30bU-b2Q3xUk745Jc2fKHdj9pF3C9ORG909CyQkA8WaRT-rsnCKw-LmV0&sm=ab441c&app=chrome"

driver.maximize_window()
driver.get(fahuo_login_url)
time.sleep(2)
driver.find_element_by_xpath('//*[@id="J_BottomBanner"]/ul/li[4]/a').click()
time.sleep(2)
driver.find_element_by_css_selector('#fm-login-id').send_keys('xxxxxx') # 输入 淘宝账号 
time.sleep(1)
driver.find_element_by_css_selector('#fm-login-password').send_keys('xxxxxxxxxxxxxx') # 输入 密码
time.sleep(2)
driver.find_element_by_css_selector('#login-form > div.fm-btn > button').click()
time.sleep(10)

# url = 'https://api.m.taobao.com/h5/mtop.lifemallweb.courseinfomtopservice.getoutline/1.0/?appKey=12574478&t=1605036880894&sign=5c4fd7d263d2f5cdefa5d4dacc6adb2f&v=1.0&api=mtop.lifemallweb.courseinfomtopservice.getoutline&type=jsonp&dataType=jsonp&callback=mtopjsonp4&data=%7B%22courseId%22%3A%2278011%22%7D'
# url = 'https://api.m.taobao.com/h5/mtop.lifemallweb.courseinfomtopservice.getoutline/1.0/?appKey=12574478&t=1605076799899&sign=6144d16087af79182743b65fd887b3c7&v=1.0&api=mtop.lifemallweb.courseinfomtopservice.getoutline&type=jsonp&dataType=jsonp&callback=mtopjsonp4&data=%7B%22courseId%22%3A%2278011%22%7D'



# url = "https://api.m.taobao.com/h5/mtop.lifemallweb.courseinfomtopservice.getoutline/1.0/?appKey=12574478&t=1605101345112&sign=7aeb0c41b0bc943feb126a945606f499&v=1.0&api=mtop.lifemallweb.courseinfomtopservice.getoutline&type=jsonp&dataType=jsonp&callback=mtopjsonp4&data=%7B%22courseId%22%3A%2278011%22%7D"

url = 'https://api.m.taobao.com/h5/mtop.lifemallweb.courseinfomtopservice.getoutline/1.0/?appKey=12574478&t=1605275205588&sign=5b47cc8aafc78339c8535a48fbbca372&v=1.0&api=mtop.lifemallweb.courseinfomtopservice.getoutline&type=jsonp&dataType=jsonp&callback=mtopjsonp4&data=%7B%22courseId%22%3A%2278011%22%7D'


requ = requests.get(url, headers=headers)
html = requ.text.replace('mtopjsonp4(', '').replace(')', '')
jsontext = json.loads(html)
print(jsontext)
datas = jsontext['data']['data']['outline']['chapters']

# 'https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.4&resourceId= 5183000 &sectionId= 11093072 &channel=2&courseId= 78011 &resourceId= 5183000 &live=false&title=4 &resourceId= 5183000 &sectionId= 11093072 &channel=2&courseId= 78011 &resourceId= 5183000 &live=false&title='

number = 0
#'https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.5&resourceId=5184940&sectionId=11064015&channel=2&courseId=78011&resourceId=5184940'
#'https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.5&resourceId=5184940&sectionId=11064015&channel=2&courseId=78011&resourceId=5184940'
for d in datas:
    video_url_info = d['sections']
    courseid = d['courseId']
    zj_title = d['title']  # 章节
    print(zj_title)
    # print(courseid)
    for v in video_url_info:
        v_id = v['resources']
        sectionid = v['id']
        # print(sectionid)
        for vi in v_id:
            video_id = vi['id']
            video_title = vi['title']  # 文章标题
            print(video_title)
            # print(video_id)
            number += 1
            url = 'https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.%s&resourceId=%s&sectionId=%s&channel=2&courseId=%s&resourceId=%s' % (
            number + 3, video_id, sectionid, courseid, video_id)
            print(url)
            driver.get(url)
            down_url = driver.find_element_by_css_selector('#J_Video > source:nth-child(2)').get_attribute('src') # 获取元素的信息,也就是 上面 的 soure url 的信息。

获取到真是的下载地址后,其实这个时候是已经可以用迅雷下载的。但是还是无法用 requests 下载,按照道理是可以的:

down_url :https://cloud.video.taobao.com/play/u/2705259897/p/1/e/6/t/1/d/hd/235227068483.mp4?auth_key=YXBwX2tleT04MDQ0ODEmYXV0aF9pbmZvPXsiY291cnNlSWQiOjc4MDExLCJiaXpUeXBlIjoiYnV5IiwidmlkZW9JZCI6MjM1MjI3MDY4NDgzLCJlbmNyeXB0SWQiOiJGRTc5QjY5RjVBRDg2NTVEQTY1N0UxQzY1RUUxOUY3NCJ9JnRpbWVzdGFtcD0xNjA1MzYzNTc5&hardware=true
在这里插入图片描述
以下是我自己的办法:

利用 selenium 点击那个url , 然后获取当前页的 mp4 。因为上面一大串的 url ,会跳转 到 https://xxxxxx.mp4

在这里插入图片描述

全部代码如下【我这里是把每个教程创建了一个文本,然后把mp4 连接写入到了文本中】:

# encoding:utf-8
import json
import requests
from selenium import webdriver
import time
import os
headers = {
    # 'cookie':'cna=d9MyGFXJy3ECAd+VP+C9tMBO; _m_h5_tk=fd0dcb980c4bb8d4bb200b65848c0b0b_1605111359929; _m_h5_tk_enc=64fc55729b0678e8f4e1ce878a9e413f; cookie2=1677f4a1a649100c194e4729930edfd2; t=29bbbfdee40cdae4ef00175b0b6b0d52; _tb_token_=e1e795083e031; _samesite_flag_=true; xlly_s=1; tfstk=cJSPBWc-yuEPCztQW3tEPjmCRSLRZMXlKmJ6rwoA77GUw3TliXlpn8bM3pOTmUf..; ockeqeudmj=mravPk0%3D; _w_tb_nick=%E7%8B%82%E9%A3%99%E7%9A%84%E8%9C%97%E7%89%9Bye; munb=2701589139; WAPFDFDTGFG=%2B4cMKKP%2B8PI%2Bu50IDqlWEadoeeFOG9NuUXcUIw%3D%3D; _w_app_lg=0; sgcookie=E10099yD1YiYYjAQLQzVKLKIWUsl%2BTK2xxRgIhtnb5XRWE448Ao8gy3h6IkuaLit2SQNJlCfhdqvSuvbmlooKijo2A%3D%3D; unb=2701589139; uc3=lg2=W5iHLLyFOGW7aA%3D%3D&vt3=F8dCufOCQdmQJL524GE%3D&nk2=3EWY2QbTAkdb7KWx&id2=UU8IPTyRbKU2yw%3D%3D; uc1=cookie14=Uoe0aD3LMu58Zw%3D%3D&cookie15=V32FPkk%2Fw0dUvg%3D%3D&cookie21=WqG3DMC9Edo1SB5NB6Qtng%3D%3D&existShop=true; csg=2a4a3f56; lgc=%5Cu72C2%5Cu98D9%5Cu7684%5Cu8717%5Cu725Bye; ntm=0; cookie17=UU8IPTyRbKU2yw%3D%3D; dnk=%5Cu72C2%5Cu98D9%5Cu7684%5Cu8717%5Cu725Bye; skt=cb1d6520a45792bb; uc4=nk4=0%403jG%2Fc5Qu3r%2B0Ew2RwiFRlxgVGjEiX24%3D&id4=0%40U22PGMm3NWDuPibXLvJw2b42sdl9; tracknick=%5Cu72C2%5Cu98D9%5Cu7684%5Cu8717%5Cu725Bye; _cc_=UIHiLt3xSw%3D%3D; _l_g_=Ug%3D%3D; sg=e90; _nk_=%5Cu72C2%5Cu98D9%5Cu7684%5Cu8717%5Cu725Bye; cookie1=B0EzweA7TLKhu4P1CHazoo1aUxo3HEXdG9jckoF2hK4%3D; isg=AmRk0H2M53wdMBOwyVXRSt-QNWIPTpen9sLlnn6F6i_yKQTzpg1Y95qPnzfN; l=AomJ4AWMVtIQxi0vYpuqC/gDGb7jzH0I',

    'cookie':'cna=BzcpGD+dYjUCAd+VQzVfH0gp; lgc=%5Cu72C2%5Cu98D9%5Cu7684%5Cu8717%5Cu725Bye; tracknick=%5Cu72C2%5Cu98D9%5Cu7684%5Cu8717%5Cu725Bye; thw=cn; enc=i9M1y3B%2F9lEte6JjPplqFT68R%2FkEyR3tnIr%2BI1gZZ9hgTcv%2BHJpF1XCgJr04vNohDo9bbNGDaJPZOQmvrRIDcQ%3D%3D; t=07a4276138be8389e3560e2f0ba12ae0; miid=2055164070163868920; x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0; _fbp=fb.1.1604983772781.845569496; hng=CN%7Czh-CN%7CCNY%7C156; _w_tb_nick=%E7%8B%82%E9%A3%99%E7%9A%84%E8%9C%97%E7%89%9Bye; munb=2701589139; WAPFDFDTGFG=%2B4cMKKP%2B8PI%2Bu50IDqlWEadoeeFOG9NuUXcUIw%3D%3D; _w_app_lg=0; xlly_s=1; sgcookie=E100lUndR9DLvGBW74N4aRThUBwdhIyrIEj1MTQH4a9E3qcijL3UoP4r7sccnc7ClfyiUSpzaAVSbhk%2FXFcF8vBwHw%3D%3D; uc3=id2=UU8IPTyRbKU2yw%3D%3D&lg2=VFC%2FuZ9ayeYq2g%3D%3D&nk2=3EWY2QbTAkdb7KWx&vt3=F8dCufOMOXW9b1BqWgM%3D; uc4=nk4=0%403jG%2Fc5Qu3r%2B0Ew2RwiFRlxgWZyB%2FbFc%3D&id4=0%40U22PGMm3NWDuPibXLvJw2pfVfuuC; _cc_=VFC%2FuZ9ajQ%3D%3D; mt=ci=37_1; tfstk=c7i5BpGwm_f57CLF4Y94UEhkREZha65bLUwKF4EQ05AMSnH4MsXAb5w-42fGDPef.; _m_h5_tk=b9d23539f1cbc8b8a1a9f3d352375cf0_1605283946106; _m_h5_tk_enc=21d03b9ac4eee3ca96c6ced27af25fe8; cookie2=22c7b2fe75abc02d076df67203b20e01; _tb_token_=79b4f1eb55abb; isg=AsHBP0cber5BV5aKHYKj1mlG0A2CXWpRANwzrSMWqUgnCuHcaz5FsO8Mmsiw; l=Am5usdtQzP1WE8mDIv7Vz9KuPs8wezJp',


    'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36",

    'host': 'api.m.taobao.com',

}

chrome_options = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2}
# chrome_options.add_experimental_option("prefs", prefs)
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
chrome_options.add_experimental_option("useAutomationExtension", False)
# chrome_options.add_argument('--host-resolver-rules=MAP g.alicdn.com 127.0.0.1')

driver = webdriver.Chrome(r"D:\pro_py\auto_office\chromedriver\chromedriver.exe", chrome_options=chrome_options)
chrome_options.add_argument(
    'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36')
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",
                       {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})""", })
fahuo_login_url = "https://h5.m.taobao.com/xue/detail.htm?ut_sk=1.WrHJH%2BF63IwDAD7l4yx9ORsJ_21380790_1605021159729.Copy.10000&itemId=552400591967&sourceType=other&ttid=201200%40taobao_iphone_8.8.0&suid=E0B7CB1C-710F-4610-95F7-2F047A369759&un=f249ba94edcb21f83911dc70f8aca8ac&share_crt_v=1&spm=a2159r.13376460.0.0&sp_tk=cmhpN2NQbXJPS0Q=&cpp=1&shareurl=true&short_name=h.43dpkg8&bxsign=scd59xbtg7Htg78I-yuxEtr95S91S-KaaGvXhZeF38L2SpC7Snd8C30bU-b2Q3xUk745Jc2fKHdj9pF3C9ORG909CyQkA8WaRT-rsnCKw-LmV0&sm=ab441c&app=chrome"

driver.maximize_window()
driver.get(fahuo_login_url)
time.sleep(2)
driver.find_element_by_xpath('//*[@id="J_BottomBanner"]/ul/li[4]/a').click()
time.sleep(2)
driver.find_element_by_css_selector('#fm-login-id').send_keys('15024341207')
time.sleep(1)
driver.find_element_by_css_selector('#fm-login-password').send_keys('china.')
time.sleep(2)
driver.find_element_by_css_selector('#login-form > div.fm-btn > button').click()
time.sleep(10)

# url = 'https://api.m.taobao.com/h5/mtop.lifemallweb.courseinfomtopservice.getoutline/1.0/?appKey=12574478&t=1605036880894&sign=5c4fd7d263d2f5cdefa5d4dacc6adb2f&v=1.0&api=mtop.lifemallweb.courseinfomtopservice.getoutline&type=jsonp&dataType=jsonp&callback=mtopjsonp4&data=%7B%22courseId%22%3A%2278011%22%7D'
# url = 'https://api.m.taobao.com/h5/mtop.lifemallweb.courseinfomtopservice.getoutline/1.0/?appKey=12574478&t=1605076799899&sign=6144d16087af79182743b65fd887b3c7&v=1.0&api=mtop.lifemallweb.courseinfomtopservice.getoutline&type=jsonp&dataType=jsonp&callback=mtopjsonp4&data=%7B%22courseId%22%3A%2278011%22%7D'



# url = "https://api.m.taobao.com/h5/mtop.lifemallweb.courseinfomtopservice.getoutline/1.0/?appKey=12574478&t=1605101345112&sign=7aeb0c41b0bc943feb126a945606f499&v=1.0&api=mtop.lifemallweb.courseinfomtopservice.getoutline&type=jsonp&dataType=jsonp&callback=mtopjsonp4&data=%7B%22courseId%22%3A%2278011%22%7D"
url = 'https://api.m.taobao.com/h5/mtop.lifemallweb.courseinfomtopservice.getoutline/1.0/?appKey=12574478&t=1605275205588&sign=5b47cc8aafc78339c8535a48fbbca372&v=1.0&api=mtop.lifemallweb.courseinfomtopservice.getoutline&type=jsonp&dataType=jsonp&callback=mtopjsonp4&data=%7B%22courseId%22%3A%2278011%22%7D'


requ = requests.get(url, headers=headers)
html = requ.text.replace('mtopjsonp4(', '').replace(')', '')
jsontext = json.loads(html)
print(jsontext)
datas = jsontext['data']['data']['outline']['chapters']

# 'https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.4&resourceId= 5183000 &sectionId= 11093072 &channel=2&courseId= 78011 &resourceId= 5183000 &live=false&title=4 &resourceId= 5183000 &sectionId= 11093072 &channel=2&courseId= 78011 &resourceId= 5183000 &live=false&title='

number = 0
'https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.5&resourceId=5184940&sectionId=11064015&channel=2&courseId=78011&resourceId=5184940'
'https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.5&resourceId=5184940&sectionId=11064015&channel=2&courseId=78011&resourceId=5184940'
for d in datas:
    video_url_info = d['sections']
    courseid = d['courseId']
    zj_title = d['title']  # 章节
    print(zj_title)
    # print(courseid)
    for v in video_url_info:
        v_id = v['resources']
        sectionid = v['id']
        # print(sectionid)
        for vi in v_id:
            video_id = vi['id']
            video_title = vi['title']  # 文章标题
            print(video_title)
            # print(video_id)
            number += 1
            url = 'https://h5.m.taobao.com/xue/play/index.html?spm=a2174.7623065.6.%s&resourceId=%s&sectionId=%s&channel=2&courseId=%s&resourceId=%s' % (
            number + 3, video_id, sectionid, courseid, video_id)
            print(url)
            driver.get(url)
            down_url = driver.find_element_by_css_selector('#J_Video > source:nth-child(2)').get_attribute('src')
            time.sleep(5)
            driver.get(down_url)
            time.sleep(3)
            mp4_url = driver.current_url

            print(mp4_url)
            while True:
                if os.path.isdir("pro_file/%s"%zj_title): 
                    with open("pro_file/%s/%s.txt"%(zj_title,video_title),'w',encoding='utf-8') as f: # 写入 mp4 链接。
                        f.write(mp4_url)
                        f.close()
                        break
                        
                else:
                    os.makedirs("pro_file/%s"%zj_title)

等上面获取好所有 标题 url 后:在写一个 request 去下载上面的 视频,代码如下:

#encoding:utf-8
import os
import requests
path = 'pro_file'



filepath = os.listdir(path)
for f in filepath:

    class_name = f # 分类文件名称
    filepath2 = os.path.join(path,f) # 分类路径
    print(filepath2)
    filepath3 = os.listdir(filepath2)
    for f3 in filepath3:

        filename = str(f3).replace('.txt','') # 视频文件名称
        video_path = os.path.join(filepath2,f3)
        with open(video_path,'r',encoding='utf-8') as f:
            down_url = f.read()
            requ = requests.get(down_url)
            with open("%s/%s.mp4"%(filepath2,filename),'wb') as m:  # 下载视频。
                m.write(requ.content)
                m.close()


得到文件如下:

在这里插入图片描述
视频文件如下:
在这里插入图片描述

总结:因为其中用到了 selenium 去 反反爬虫,我感觉还不是很好,这个代码。所以如果有人能看懂这个文章,能有更好的办法,请在下方留言,非常感谢。
如果文章对你有帮助,点个关注呗!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋哈哈呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值