大家好,给大家分享一下js 给id 赋值变量,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!
由于自己近年来一直在做Python爬虫开发,就把之前所做过的一些项目一些难点以及一些经验记录下来,对所抓取下来的企业数据进行一些数据上的补充,需要抓取企查猫的搜索接口,企查猫的搜索接口上有参数进行了js加密,找我研究一下,今天我把我的经历和解决方案分享给大家。
加密位置
在它的搜索接口这里mfccode参数是每次都会变的,而且失效很快,只能查找一次,第二次或者失效就会跳转登录页面,并且我们直接抓取的话,直接跳转的也是登录页面,所以就必须要研究该参数
进行分析
我们通过Fiddler抓包分析在它的页面请求成功之前额外进行了两次请求,并且第一次请求返回的是一串js代码,如下图:
可能改参数就是由该js生成的,我们通过观察js的调用栈追溯到该参数生成位置,如图:
打上断点进行单步调试,出现的就是我们第一次访问返回的js代码快码论文。如图:
但是这串代码用Pretty print 是无法进行格式化的,没办法进行调试,所以我们需要把js复制下来自己写一个页面进行调试分析
首先观察js,可以看出这串js它是个立即执行函数,内部传入了一个window,如图:
js立即执行函数就是可以让你的函数在创建后立即执行,可以让你的函数在定义后立即被执行,这种模式本质上就是函数表达式(命名的或者匿名的),在创建后立即执行。也算是一个闭包,所以呢此处我们就需要进行一个拆包,先观察js
w也就是window,调用了s这个函数,经过观察发现s函数传入的参数其实就是一个个的Unicode 编码通过String.fromCharCode()进行了转换,如图:
是不是很熟悉,这不就是上图window.__qzmcf()调用的函数,意思就是将dc赋值给了window.__qzmcf(),那么就证明我们只需要调用dc就可以了,我们把dc函数扣出来,然后再把需要的js全扣出来,把需要w的位置改为window,进行console.log()输出就成功获取,如图:
此处需要注意window.document,python是无法调用的,所以我们需要用去观察该js做了什么,然后用python编写出来,可以看出该js也是调用了s函数,生成的就是cookie,将cookie赋值给ac就可以了
调用思路
至此我们就可以去编写代码了,在第一次访问页面的时候先获取cookie,再将返回的js进行拆包,然后将w.document替换为获取的cookie,最后调用dc就可以成功获取mfccode参数