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

极客时间爬虫分析

时间:2023-04-01 19:32:31 Java

核心概要作者是一名错过了211和985名校的大专生。虽然我是一名大专生,但“不要因为你还有一个伟大的梦想就向世界屈服”的人生格言不允许我只是一名普通的大专生。新的一年结束了,又回到了正轨。为了提升自己的技术实力,我花了点钱在极客时间买了一门课程,没想到的是马上就要开学了,极客时间的视频只能在APP里下载观看内部缓存,显然这条规则约束了作者。作为未来互联网的开发者,面对这种约束当然不能妥协,所以才有了这个特刊和这篇文章。敢想,敢做,不悔青春。下面我将从新手的角度来描述爬虫分析。当然,笔者也是新手,只是比小白稍微强一点而已。目标分析爬虫分析账号中心POSThttps://account.geekbang.org/...点击头像中的用户名会触发该接口的调用。通过分析这个接口,我们可以知道Geekbang是用什么方案来解决前端和后端交互安全认证的问题的,当然有的朋友会想到用Session来解决这个问题,但是他们忽略了Session是存储的在服务器端,而客户端存储SessionId。当浏览器关闭后,SessionId就会消失,而服务器上保存的Session仍然存在,这无疑增加了服务器的压力。虽然在服务器上实现了一些session失效策略,但撇开这个问题不谈,这样一个大型的互联网项目服务器肯定是以集群的形式存在的。这时候就要考虑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我的课程POSThttps://time.geekbang.org/ser...在头像中点击我的课程会触发该接口的调用。请求Bodydesc是否排序expice无效枚举last_learn最后学习learn_status用户身份prev当前页码sizepagesize{"desc":true,"expire":1,"last_learn":0,"learn_status":0,"prev":0,"size":20,"sort":1,"type":"","with_learn_count":1}ResponseBodycode响应状态码data数据信息列表课程重要参数pidcourseIDarticles这个应该是专刊信息ordocumentinformationproductsallcourseinformationerrorerrormessage{"code":0,“data”:{“has_expiring_product”:false,“learn_count”:{“total”:1},“list”:[{“pid”:739995653,“ptype”:“p35”,“aid”:0,“ctime":739995653,"score":2,"is_expire":false,"expire_time":0,"last_learned_time":0}],"articles":[{...}],"products":[{...}],"page":{"more":false,"count":0,"score":0,"score0":0}},"error":{},"extra":{"cost":739995653,"request-id":"739995653"}}请求该接口时,需要携带Cookie、Referer等请求头参数分析这个接口等等,但是ResponseBody中list集合中的pid属性绝对可以帮助作者达到目的。虽然有一些数据可以用,但是这个不够详细,继续分析。课程详情POSThttps://time.geekbang.org/ser...在我的课程中点击具体课程会触发该接口的调用。请求bodycid课程IDsize显示多少课程列表prev当前页码顺序排序规则{"cid":"739995653","size":500,"prev":0,"order":"earliest","sample":false}ResponseBodyerror错误信息datalist课程列表信息其中id很重要,用到了获取视频信息的页面数据{"error":[],"data":{"list":[{"article_subtitle":"","video_cover":"...","id":739995653,"had_viewed":true,"article_title":"张冲:不要向这个世界屈服,因为你还有一个美好的梦想","article_cover":"","video_media_map":{"sd":{"size":739995653},"ld":{"size":739995653},"hd":{"size":739995653}},"is_video_preview":true,"article_summary":"张冲:不要向这个世界投降,因为你还有一个美好的梦想",“column_had_sub”:true,“is_finished”:false,“subtitles”:[],“include_audio”:false,“article_could_preview”:false,“chapter_id”:“2457”,“rate_percent”:1,“video_size”:739995653,"video_time_arr":{"m":"55","s":"40","h":"00"},"video_id":"VX:张冲SR0208","column_sku":739995653,"offline":{"file_name":"","download_url":""},"video_time":"00:00:00","is_required":true,"rate":{...},"score":739995653,"article_ctime":739995653},{...}],"page":{"count":739995653,"more":false}},"code":0}请求这个使用该接口时,需要携带Cookie、Referer等请求头参数来解析该接口。别的不说,ResponseBody中list集合中的id属性绝对可以帮助作者达到目的。虽然有一些数据可以用,但是这个不够详细,继续分析。.观看视频POSThttps://time.geekbang.org/ser...观看特定课程的视频会触发该接口的调用。请求课程列表BodyidID{"id":739995653}响应Bodyarticle_content列表详情article_title列表titlevideo_id视频IDvideo_cover视频封面product_id课程IDid列表IDhls_videosHLS视频播放地址ld标清sd高清hd超清{"data":{"article_content":"张翀:不要因为你还有美好的梦想就放弃这个世界","article_title":"张翀:不要因为你还有美好的梦想就向这个世界屈服","video_id":"739995653","video_cover":"...","product_id":739995653,"id":739995653,"hls_videos":{"sd":{"url":"...?combat.m3u8","size":739995653},"hd":{"url":"...?combat.m3u8","size":739995653},"ld":{"url":"...?combat.m3u8","size":739995653}},}}请求该接口时,需要携带Cookie等请求头和Referer分析了这个接口的参数,最终得到了视频的地址,因为视频是HLS协议形式的,因为小编的技术还没有发展到全栈开发,所以不知道这个东西比较多,我只知道用HLS的方法会增加视频播放的流畅度,还可以根据网络情况动态切换分辨率,所以hls_videos里面有三种分辨率可以选择。下载的视频虽然得到了M3U8文件,但是真的可以下载吗?以下只是M3U8文件的一部分,一起来看看吧。这个文件的地址存储在hls_videos.h中。通常,HLS协议携带的数据是加密的。查看M3U8文件头中的EXT-X-KEY属性。它使用的加密算法是AES-128,虽然是加密的,但是在M3U8文件中也会有对应的解密文件,即URI和VI这两个属性。现在市面上有一些M3U8的下载器和解析器,开源社区也有一些M3U8的下载器和解析器,这里就不过多解释了。温馨提示:极客时间播放视频使用的M3U8文件不是我上面得到的文件,它使用了阿里云的HLS服务(可以在阿里云设置,使用标准HLS加密或者使用阿里云私有加密)很遗憾,极客时间使用阿里云私有加密。因此,如果直接解析或下载极客时间播放视频使用的M3U8文件,获取的视频是无法直接观看的。#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(快来和小编一起讨论吧)以上内容如有冒犯,敬请谅解今天谢谢,希望看到原文,请联系小编删除