[返回编程技术首页]·[所有跟帖]·[ 回复本帖 ] ·[热门原创] ·[繁體閱讀]·[坛主管理]

别让加密难倒你,Python爬虫攻克加密网站的实战教程!

送交者: wecode[☆★声望品衔8★☆] 于 2024-09-01 13:24 已读 1709 次  

wecode的个人频道

+关注

今天有个朋友向我求助,希望我帮他爬取一个网站上的内容。网站内容如下:



aHR0cHM6Ly93d3cuY2NwcmVjLmNvbS9uYXZDcXpyLyMvCg==


打开上述网址,进入开发者模式,这些数据的请求接口,正常逻辑是通过搜索页面上内容进行锁定请求接口。但是,进行搜索时,发现什么都搜索不到。



通过上图发现,这些数据只请求了一个接口,当我点击负载响应这两个标签,发现数据是被加密了,所以,我们搜索不了页面的内容。


负载加密内容


响应加密内容


浏览器为啥是明文?

这时相信小伙伴,心中都有一个疑问浏览器为啥是明文?  浏览器在收到数据后,会自动采用服务器返回的资源文件对加密内容进行解密并显示明文,这也是我们能够在页面上看到正常内容的原因。



如何定位到加密资源文件

通过XHR/提取断点,该方法是通过匹配URL包括请求路径关键字进行断点,具体配置如下图:



这时我们重新刷新网页,如下图所示,网站就成功进入我们上一步设置的断点中。



其中,h就是加密后的请求体参数,然后我们从调用堆栈中一步步往前推。至于如何找呢?这里是有一个技巧的,我们需要找到前一步请求体还没加密,后一步请求体就加密成功了。


请求体加密后


请求体加密前


其中上图o就是请求体加密之前的参数,s就是加密后的参数。chunk-common.a25fd3ce.js就是进行加密的js。通过点击堆栈的js名称就可以定位到对应的地方。


扣取代码

经过上一步分析,我们知道o就是加密之前的参数,就在js代码找o定义的位置,如下图所示:



下面代码就是请求体的参数,通过上述代码发现id是通过uuid方法生成的。


{


    "id": "rtmhwib79r4ytdgn",


    "projectKey": "honsan_cloud_ccprec",


    "clientKey": "rtmhwialwggc91l6",


    "token": null,


    "clientDailyData": {},


    "acts": [


        {


            "id": "rtmhwib65mon96h1",


            "fullPath": "/cloud.sys.tomcatV11/api/v1/template/getPages",


            "args": [


                {


                    "yuPiLou": {


                        "templateId": "32d3044760964ed8927bad49e545ba4b",


                        "pageNo": 1,


                        "pageSize": 20,


                        "where": {


                            "projecttype": "PG3",


                            "state": "42"


                        }


                    }


                }


            ]


        }


    ]


}


接着我们需求扣取这个uuid方法。通过鼠标悬停在这个方法上面,就会弹出面板,如下图所示:



点击后就会调到uuid方法定义的地方,如下图所示:



把这段代码扣取下面,如下所示:


uuid = function (t, n) {


    void 0 === t && (t = 16),


        void 0 === n && (n = !1),


        !n && t < 16 && (console.error("uuid useCase=false 时 len 不能小于 16"),


            t = 16),


        n && t < 12 && (console.error("uuid useCase=true 时 len 不能小于 12"),


            t = 12);


    var i = ((new Date).getTime() + 1e14).toString();


    return i += ("000" + (++e.uuidCount).toString()).substr(-3, 3),


        i = n ? parseInt(i).to62() : parseInt(i).toString(36),


        i += randomStr(t),


        i = i.substr(0, t),


        i


}


this关键的全部删除它。


然后通过node进行运行,如下图所示报错了e没有定义。



于是,我们再去源码中找改值是什么?通过选中该值,经过几次的确认。该值是NaN,如下图所示:



我们再自己扣取的代码写死它,再次运行。如下图所示:



发现这是报randomStr没有定义,我们再去源码找这个方法进行补环境。通过搜索发现了randomStr方法,该方法有调用了random。于是我们两个方法一起扣取下来。



再次运行,没有报错了,成功打印了uuid,如下图所示:



把之前扣取下来的请求体,id字段固定值替换成uuid函数生成的动态值,如下图所示:



最重要的一步就是扣取加密的JS代码啦, 在请求体参数附近查看this.aes.encode(a)加密方法,如下图所示:



通过上面介绍的方面快速定位到这个加密的方法,如下图所示:



该方法又调用了另外一个方法this.encryptCode,通过关键搜索也找到了encryptCode方法,如下图所示:


加密方法


按照编程习惯,附近也会有对应的解密方法的,如下图所示:


解密方法


现在加密和解密的方法都找到了,我们把它全部扣取下面进行调试,发现缺什么方法再进行补。重新定义一个方法生成加密请求头,后续让python调用这个方法并传入分页参数。如下图所示:



测试该方法是否能正常生成加密请求头,执行如下命令:


console.log(encrypt())


执行上述方法后,输入如下图所示:



通过python模拟请求

这里介绍一个非常快捷的方式用python模拟一个浏览器请求,首先我们先在开发者模式选择这条请求,然后右击选择**将所有列表复制为cURL(Bash)**,如下图所示:



然后,来的这个工具网站[1],粘贴刚才复制的cURL信息,就可以根据自己喜欢的编程语言生成模拟浏览器请求的代码,如下图所示:



然后,把生成的代码拷贝下来,进行修改。通过python的第三方库execjs调用js代码并执行对应的方法。


jscode=open("./test.js",'r',encoding='utf-8').read()


以读的模式打开test.js并赋值给jscode


data = execjs.compile(jscode).call("encrypt",page)


通过execjs调用jscode对象,并通过call方法调用encrypt加密方法,并传入分页参数page


下图是python中的完整代码

执行上述代码后,成功获取网站的数据如下图所示:


遇到的问题

在python中使用execjs库,出现UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xac in position 244: illegal multibyte sequence,一般遇见编码问题先看看代码里写没写encoding='utf-8',没写的话写加上试试。加了也不行。通过在python代码中加入如下代码


import subprocess


from functools import partial


subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")





脚本获取方式

上述脚本已经上传上传到gitee,有需要的小伙伴可以自行获取。gitee上的仓库主要是分享一些工作中常用的脚本。小伙伴可以frok或者watch仓库,这样有更新可以及时关注到。



仓库地址:


https://gitee.com/didiplus/script

喜欢wecode朋友的这个贴子的话, 请点这里投票,“赞”助支持!

内容来自网友分享,若违规或者侵犯您的权益,请联系我们

所有跟帖:   ( 主贴楼主有权删除不文明回复,拉黑不受欢迎的用户 )

真实地体验---点赞! (无内容) - jiliyacui (0 bytes) 09/21/24

用户名: 密码: [--注册ID--]

标 题:

粗体 斜体 下划线 居中 插入图片插入图片 插入Flash插入Flash动画


     图片上传  Youtube代码器  预览辅助

打开微信,扫一扫[Scan QR Code]
进入内容页点击屏幕右上分享按钮

楼主前期社区热帖:

>>>>查看更多楼主社区动态...



[ 留园条例 ] [ 广告服务 ] [ 联系我们 ] [ 个人帐户 ] [ 创建您的定制新论坛频道 ] [ Contact us ]