tx课堂爬虫

声明

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872              
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除!q 2766958292

前言

作为遵纪守法的中国公民我有必要提醒大家千万不要恶意爬取网站数据,在学习期间也不可大批量发送网络请求占用公共资源给网站造成负面影响严禁在代码转给给其他人。篇幅较短开始发车。

1.逆向过程

1.1.requestId

应该是个uuid,扣webpack就行了很简单。

tx课堂爬虫_第1张图片 requestId位置

1.2.怎么获取m3u8接口所需要的参数

访问aHR0cHM6Ly9rZS5xcS5jb20vY291cnNlL3tjaWR9这个接口然后获取json数据,只需要3个。

course_list=json.loads(script_code)["props"]["pageProps"]["courseInfo"]['catalogMap']
for course in course_list:
    package_name = course['sub_id']
    resid_list = course['task_info'][0]['resid_list']
    file_name = course['name']

1.3.请求m3u8和密钥地址和token获取

m3u8接口:aHR0cHM6Ly9rZS5xcS5jb20vY2dpLXByb3h5L3JlY192aWRlby9kZXNjcmliZV9yZWNfdmlkZW8=

//前缀   
 prefix = json.loads(response.text)['result']['rec_video_info']['infos'][0]['ts_list'][0]['url'].split('drm')[0]



function getToken(cid,termId){
    return _getDrmToken({
    "cid": cid,
    "termId": termId,
    "vod_type": 0,
    "platform": 3
})
}
tx课堂爬虫_第2张图片 token位置

同时m3u8文件的ts路径需要前缀+原来内容+token。获取token代码如下

cid是课程id,termId课程都有一个而且相同的。

1.4.ts文件解密

def download_ts(url,key,package_name):
    response = requests.get(url['url'])
    cipher = AES.new(key, AES.MODE_CBC, b'\x00' * 16)
    decrypted_content = cipher.decrypt(response.content)
#         这是单线程
            # for url_info in all_urls:
            #     download_ts(url_info, key,package_name)
    #         这是多线程
    with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
        futures = [
            executor.submit(download_ts, url_info, key, package_name)
            for url_info in all_urls
        ]
        concurrent.futures.wait(futures)

1.5.线程池下载课程

global_executor = ThreadPoolExecutor(max_workers=4)
futures = []
for course in course_list:
    package_name = course['sub_id']
    resid_list = course['task_info'][0]['resid_list']
    file_name = course['name']
    future = global_executor.submit(concurrent_downloads, package_name, resid_list, file_name)
    futures.append(future)
# 遍历所有任务的结果
for future in concurrent.futures.as_completed(futures):
    result = future.result()

global_executor.shutdown(wait=True)

1.6.结果

免费代理太慢了就不等了。

tx课堂爬虫_第3张图片

1.7.总结

1.出于安全考虑,本章未提供完整流程,调试环节省略较多,只提供大致思路,具体细节要你自己还原,相信你也能调试出来。

2.本人写作水平有限,如有讲解不到位或者讲解错误的地方,还请各位大佬在评论区多多指教,共同进步。

如果侵犯到你的权益联系我,我会马上删除wx a15018601872   

2766958292

你可能感兴趣的:(爬虫,python,前端,javascript,node.js,音视频,后端)