nodejs抓取动态网页(记录一下西瓜视频MP4地址的获取步骤(1)_ )
优采云 发布时间: 2021-09-25 03:07nodejs抓取动态网页(记录一下西瓜视频MP4地址的获取步骤(1)_
)
记录获取西瓜视频MP4地址的步骤
目标:
指定西瓜视频的地址,例如获取其视频MP4文件的下载地址
以下使用chrome浏览器
开始分析:
首先在浏览器中打开视频页面,打开review元素(右键->review元素或F12)刷新页面查看网络选项中抓包
提示 1:
由于我们得到的是视频文件的下载地址,而视频文件一般都比较大,可以使用网络包列表中的Size来对最大的包进行排序
如图:
在这里我们可以轻松确定视频文件的地址
(你得到的地址可能和我得到的不一样,但URL路径中的最后一串应该是一样的)
接下来,我们将找出获取地址的位置。一般的做法是截取url中比较有代表性的部分(这个靠经验,你应该明白)进行搜索,搜索可以使用chrome评论元素的Search功能
此搜索将在网络列中找到所有数据包的响应内容。如果找到,我们就可以确定视频文件地址的来源。
你为什么这么做?
按照正常思路,首先获取视频文件的请求是由浏览器发起的,所以浏览器在发起之前肯定已经获取到了视频文件的地址,那么地址在哪里呢?一般来说,无非就是直接写
在网页源码中获取视频地址或者使用ajax请求之类的,所以这个地址必须在我们目前能看到的网络列表中的包中。
但是,在这个例子中,搜索结果是空的。尝试220f87599d445a14a53803fd01d86816e971157c7a70000cab5121742cc、5c*敏*感*词*c0ae0f7d6f87014dc0f0058257e>@k
无法搜索。
好吧,既然找不到,那就用暴力的方法吧。好在这个网页上的网络包并不多,我们就一一寻找。搜索过程一般可以忽略css、图片、多媒体等文档,
先查看json格式的文件
下面手动查看。. .
再次检查后,我发现了一个可疑的链接
首先这个url是可疑的,里面收录了各种敏感的关键词,比如mp4、urls等。
二、内容可疑:
video_list 出来了,但还能是谁呢?但是,如果仔细观察,该内容中的 URL 格式是不正确的。乍一看,好像是加密过的。难怪你找不到它。
下面是找个解密方法来验证我们这里看到的就是我们想要的视频地址
让我们先来看看这个想法。我们找到的数据是浏览器请求的。既然是请求数据,那肯定有用。让我们找出数据在哪里使用,如何找到它,或搜索。使用这些数据中的变量名称进行搜索
这些数据中有两个可疑的变量:backup_url_1、main_url。第一个乍一看是备份,所以让我们搜索第二个。
搜索结果如下:
下面找到这些包中 main_url 所在的代码。幸运的是,第一个就是我们想要的(tt-video.js)
如图:
从代码中我们可以看出main_url使用base64decode进行解密。下面使用代码验证(请自行验证)。果然,我们得到了想要的视频地址。
至此,我们已经有了从这个数据包中获取视频地址的方法,那么接下来的问题是,这个数据包的地址是如何生成的呢?
首先分析一下这个包的url的组成:
先去掉不相关的参数,方法很简单,直接在浏览器中打开url,然后尝试删除参数,继续测试。删除的url如下
然后我发现有三件事我不知道它们来自哪里。让我们继续使用我们的搜索工具来一一查找。
(注:当你按照文章一步一步来的时候,你看到的参数可能和我这里写的参数不一样,请按实际搜索)
首先是v02004bd0000bc9po7aj2boojm5cta5g,搜索结果如下:
原来这个参数是视频的videoId,直接在网页源码中。好的,第一个就完成了。
看看第二个参数8795045找不到
来看看第三个参数 3128215333 找不到
后两个参数是不可搜索的,可能是实时生成的,也可能是加密的,所以换个思路,用url前半部分的关键词搜索一下,看看用在什么地方
关于关键词 当然越长越准确,所以我选择的搜索词是video/urls/v/1/toutiao/mp4,搜索结果如下:
这里只能一一打开源代码。. .
查看源代码时,注意以下几点:
1、查看上下文,查看文件的功能
2、想想我们在寻找什么。比如在这个例子中,我们搜索的是一个视频资源的URL,所以一定要特别注意视频相关的关键词、函数名等
哈哈,幸运的是,我在第一个文件(tt-video.js)中发现了可疑代码
这都与视频有关。更可疑的是 getVideosJson 函数的名称。然后我发现一个 crc32 函数使用了目标 url。我们来看看crc32函数是在哪里定义的。
(PS:标准的crc32是一种公共算法,用于为一段数据生成校验码,但一般这些反爬虫前端工程师会自己实现,所以以JS代码为准)
通过搜索crc32关键词,可以定位到如下代码:
专注于图中的红色区域。我们找不到的 r 和 s 参数出现在这里。这说明我们的想法应该是正确的。然后我们发现r的值是随机生成的。这很容易处理。我们也会只随机生成一个,最好完全按照JS代码模拟。
但是s的值似乎有点复杂。那么,现在是测试你的脑力的时候了。
s 的值是由函数 o 生成的,但是 o 的代码非常复杂。我该怎么办?
第一种方法:
不好说,js代码的算法完全是模拟出来的,可以用其他语言尝试计算,或者用pyv8、nodejs等js引擎来执行
第二种方法:
怎么说呢,换个角度想想。如果你是写这段代码的前端工程师,你会怎么做?您会从头开始实施验证算法吗?? ? (当然不可否认,确实有些情况下算法是自创的)由于这个函数是
对于像crc32这样的公共算法,每种语言基本上都有一个标准库实现,所以可以直接调用标准库来测试。如果加密结果一致,大家开心不一致,请参考第一种方法。
好了,到此为止,分析已经完成了,现在是时候编写代码了。代码显示如下: