当前位置: 首页 > 后端技术 > Java

腾讯课堂爬虫分析

时间:2023-04-01 17:23:53 Java

核心概要作者是一名错过了211和985名校的大专生。虽然我是一名大专生,但“不要因为你还有一个伟大的梦想就向世界屈服”的人生格言不允许我只是一名普通的大专生。岁末已过,一切重回正轨。为了提高自己的技术实力,花钱买了腾讯课堂的课程,没想到的是马上就要开学了,腾讯课堂的视频只能在内部下载观看APP缓存。显然这条规则约束了作者。作为未来互联网的开发者,面对这种约束当然不能妥协,所以才有了这个特刊和这篇文章。敢想,敢做,不悔青春。下面我将从新手的角度来描述爬虫分析。当然,笔者也是新手,只是比小白稍微强一点而已。目标分析爬虫分析个人信息GEThttps://ke.qq.com/cgi-bin/use...点击个人头像中的个人信息会触发该接口的调用。通过分析这个接口,就可以知道腾讯课堂采用的是什么方案。解决前后端交互安全认证的问题,当然有小伙伴会想到用Session来解决这个问题,但是他们忽略了Session是存储在服务端的,而客户端在浏览器访问时存储的是SessionId关闭。到时候SessionId就会消失,而服务器上保存的Session还会存在,这无疑增加了服务器的压力。虽然在服务器上实现了一些session失效策略,但撇开这个问题不谈,这么大规模的Internet项目服务器肯定是以集群的形式存在的。这时候就需要考虑session的共享或者session的绑定了。使用CookieToken来解决这个问题。CookieToken是一个只存储在客户端的文件。这是比Session更好的选择,因为此时服务端只需要考虑如何解析生成CookieToken。不需要考虑像Session之类的共享问题。当然,对于大型互联网项目的前后端交互安全认证方案,这也是目前业界主流的方案。通过分析这个接口的RequestHeaders,可以发现它使用cookie封装了一些认证信息。当然了解cookies的朋友会有想法,但是要知道作者不是傻子,所以这里的cookies肯定是过期了。接受:application/json,text/plain,*/*接受编码:gzip,deflate,br接受语言:zh-CN,zh;q=0.9连接:keep-aliveContent-Length:2Content-Type:application/json饼干:_ga=GA1.2.1045223782.1639395871;LF_ID=1639395871969-5650567-1016048;GCID=5a7e11c-5fdc6e0-ec86384-1cc8de6;网格=5a7e11c-5fdc6e0-ec86384-1cc8de6;MEIQIA_TRACK_ID=24ixuWXpI5WXM68hM1n4NdW4IrF;_gcl_au=1.1.2051684781.1644253524;_gid=GA1.2.302668339.1645078454;MEIQIA_VISIT_ID=25EJkkTDspp5EBAfgoPEKy7mcbm;GCESS=BgsCBgAEBAAvDQAKBAAAAAAGBPiLPOANAQEMAQEDBBwlDmIHBC7OZx8JAQEBCDVaLAAAAAAAAgQcJQ5iBQQAAAAACAED;sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%222906677%22%2C%22first_id%22%3A%2217f073deb255c7-09d380380dbee5-f791539-1327104-17f073deb261016%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_landing_page%22%3A%22https%3A%2F%2Ftime.geekbang.org%2F%22%2C%22%24latest_utm_source%22%3A%22time_web%22%2C%22%24latest_utm_medium%22%3A%22menu%22%2C%22%24latest_utm_campaign%22%3A%22timewebmenu%22%2C%22%24latest_utm_content%22%3A%22menu%22%2C%22%24latest_utm_term%22%3A%22timewebmenu%22%7D%2C%22%24device_id%22%3A%2217db39bc70f775-0956fde004162-4343363-20710b47db?3922%7D;hm_lvt_59c4ff31a9ee6263811b23eb921a5083=1645080295,1645094172,1645096912,1645164399;gksskpitn=13b506d9-98e1-440a-8777-1641eb71065d;_gat=1;hm_lpvt_59c4ff31a9ee6263811b23eb921a5083=1645164463;服务器ID=1fa1f330efedec1559b3abbcb6e30f50|1645164465|1645164401;gk_process_ev={%22count%22:7%2C%22target%22:%22%22%2C%22utime%22:1645164473299}主机:account.geekbang.org来源:https://account.geekbang.orgReferer:https://account.geekbang.org/dashboard/infosec-ch-ua:“不是;一个品牌”;v="99","GoogleChrome";v="97","Chromium";v="97"sec-ch-ua-mobile:?0sec-ch-ua-platform:"Windows"Sec-Fetch-Dest:空Sec-Fetch-Mode:corsSec-Fetch-Site:同源用户代理:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/97.0.4692.99Safari/537.36我的课程GEThttps://ke.qq.com/cgi-bin/use...在头像中点击我的课程会触发该接口的调用。RequestBodypagePagenumbercount每页数据ResponseBodyretcode响应状态代码map_list.map_courses数据信息cidcourseIDtname课程名称{"result":{"map_list":[{"map_courses":[{"recent_live_task":{"name":"张冲","type":1,},"tname":"张冲","cid":739995653,},{...},{...}],"industry3_name":"不要向这个世界认输,因为你还有一个美好的梦想"}],"end":0,"page":1,"ts":0},"retcode":0}请求该接口时,需要携带Cookie、Referer等请求头参数来解析该接口,除此之外别无其他但是map_courses中ResponseBody集合中的cid属性绝对能够帮助作者达到目的。虽然有一些数据可以用,但是这个不够详细,继续分析。课程详情GEThttps://ke.qq.com/cgi-bin/get...点击我课程中的具体课程会触发该接口的调用interfaceclassid{"result":{"739995653":{"term_id":739995653,"name":"不要放弃这个世界,因为你还有一个很棒的梦想",},{...}},"retcode":0}请求该接口时,需要携带Cookie、Referer等请求头参数。分析这个接口等等,但是ResponseBody中结果集合中的term_id属性绝对可以帮助作者达到目的。虽然有一些数据可以用,但是这个不够详细,继续分析。.课程表GEThttps://ke.qq.com/cgi-bin/cou...[739995653]观看特定课程的视频会触发该接口的调用。请求BodycidcourseIDterm_id_listclasslistResponseBodyretcoderesponsecodeterms.nameclassnameterms.cidcourseIDterms.chapter_infoterm_idclassIDcidcourseIDsub_info所有课程sub_info.video.vidvideoIDwithinclass{"result":{"terms":[{"chapter_info":[{"ch_id":739995653,"sub_info":[{"name":"张冲","term_id":739995653,"task_info":[{"csid":739995653,"term_id":739995653,“视频”:{"vid":"739995653","name":"不要向这个世界屈服,因为你还有一个美好的梦想"},"cid":739995653}],"cid":739995653},{...}],"term_id":739995653,"cid":739995653}],"name":"张冲","cid":739995653}]},"retcode":0}请求该接口时,需要携带Cookie,Referer等请求头参数解析这个接口,最后我们得到了视频的地址,因为视频是HLS协议形式的,因为小编的技术还没有发展到全栈开发,所以不对这个东西了解不多,只知道使用HLS会增加视频播放的流畅度,同时可以根据网络情况动态切换清晰度。其他一系列的操作终于得到了M3U8文件。虽然拿到了M3U8文件,但是真的可以下载吗?以下只是M3U8文件的一部分,一起来看看吧。这个文件的地址存储在hls_videos.h中。通常,HLS协议携带的数据是加密的。查看M3U8文件头中的EXT-X-KEY属性。它使用的加密算法是AES-128,虽然是加密的,但是在M3U8文件中也会有对应的解密文件,即URI和VI这两个属性。现在市面上有一些M3U8的下载器和解析器,开源社区也有一些M3U8的下载器和解析器,这里就不过多解释了。温馨提示:腾讯视频播放视频使用的M3U8文件不是我上面拿到的文件,它使用了腾讯云的HLS服务,所以解密步骤有点麻烦。#EXTM3U#EXT-X-VERSION:3#EXT-X-ALLOW-CACHE:YES#EXT-X-TARGETDURATION:10#EXT-X-MEDIA-SEQUENCE:0#EXT-X-KEY:METHOD=AES-128,uri=“...?bombat.key”,vi=0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,0000,413092FCE65236F43DCB599457923723723728-SD-STREAM-ECTREAM-TREAM-tream-etream-extream-extream-extream-extream-extream-extream-extream-extremf:.13513135354f4134d4f4134d4f:4139f::10.000000,413092fce65236f43dcb599457923728-sd-encrypt-stream-00003.ts#EXTINF:10.000000,413092fce65236f43dcb599457923728-sd-encrypt-stream-00003.ts#EXTINF:10.000000,413092fce65236f43dcb599457923728-sd-encrypt-stream-00003.ts所有时间都不是真实的放弃生命不易及时放弃最后:不要放弃这个世界,因为你还有一个伟大的梦想**技术交流群577729045(快来加入我一起讨论交流)以上内容如有冒犯,今日致歉,谢谢,转载请见原文,转载请联系小编删除