Python反反爬之JS混淆---动态Cookie(持续更新详细教程)

Python爬虫如何搞定动态Cookie?小白也能学会! Chrome DevTools Protocol (CDP) 是Chrome浏览器提供的一套调试协议,允许开发者与浏览器进行深度交互,包括检查和控制页面元素、网络请求、性能分析等。通过这个协议 ,我们可以实时监听浏览器的Network事件,包括Cookie的生成和变化。接入CDP通常需要借助支持此协议的库 ,如Python的pyppeteer或,这些库提供了与Chrome DevTools Protocol交互的高级API。以下以pyppeteer为例说明如何开始:首先,安装pyppeteer。 阅读详情

写在前面

第一题JS混淆—源码乱码

经过上一题的练习JS混淆—源码乱码,我们已经对JS混淆有了大致的了解,这次我们再来练习一道同类型的题目,只不过这次是动态Cookie

首先,让我们了解一下什么是Cookie
Cookie 并不是它的原意“甜饼”的意思, 而是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性, 因此它可以帮助我们实现记录用户个人信息的功能, 而这一切都不必使用复杂的CGI等程序

举例来说, 一个 Web 站点可能会为每一个访问者产生一个唯一的ID, 然后以 Cookie 文件的形式保存在每个用户的机器上。如果使用浏览器访问 Web, 会看到所有保存在硬盘上的 Cookie。在这个文件夹里每一个文件都是一个由“名/值”对组成的文本文件,另外还有一个文件保存有所有对应的 Web 站点的信息。在这里的每个 Cookie 文件都是一个简单而又普通的文本文件。透过文件名, 就可以看到是哪个 Web 站点在机器上放置了Cookie(当然站点信息在文件里也有保存)

简单理解就是,Cookie相当于你浏览Web站点时,相对于这个站点的身份证号,如果说身份证号错误,肯定是不能正常访问这个站点的;这也是这次题目的考察内容

文章原链接https://syjun.vip/archives/279.html

题目

题目部分截图
题目网址点我去刷题
提取全部5页发布日热度的值,计算所有值的加和,并提交答案

分析网页

由于是动态Cookie,为了避免其他Cookie的影响,所以使用浏览器的无痕模式进行调试,按f12并选中【Preserve log】

【Preserve log】:保留请求日志,跳转页面的时候勾选上,可以看到跳转前的请求(可以让我看到更详细的请求)

我们还是首先查看一下【XHR】里面的内容


可以很清楚的看到,页面当中的发布日热度值,就来源于这条链接 【http://match.yuanrenxue.com/api/match/2】

我们尝试着在浏览器中打开这条链接,会得到这么一条信息

通过Unicode编码转换工具,翻译过来是:{“error”: “出错啦~嘤嘤嘤”}
可以看得出,开发者还是挺会玩的,嘿嘿

出现这样的错误,也在意料之中,因为这道题目考的是动态Cookie,你去请求包含信息的链接时,Cookie不对,肯定是会报错的

我们继续查看XHR里面的内容,可以发现确实存在Cookie这么一个值的,而且这个加密的值跟上次的题目很像

那么这个Cookie是怎么生成的呢?

Cookie从何而来

我们回到调试工具,这次我们查看所有的请求信息,看看有没有其他的花样

可以发现,有两个名为【2】的请求
我们分别查看这两个请求,可以发现,第一个请求是不带Cookie的,第二个请求是带Cookie
不带Cookie
带Cookie

那么,我们就可以大胆的猜测,是不是第一个名为2的请求,执行了什么操作,让第二个名为2的请求带了Cookie

使用Fiddler.exe抓包

要想知道,第一个名为2的请求,到底发生了什么,我们可以使用Fiddler抓包软件,进行抓包查看
首先,我们打开这个软件(网上搜索就可以直接下载使用)
接着,打开无痕浏览器,进入到刷题网站,也就是这个链接【http://match.yuanrenxue.com/match/2】
最后,我们回到Fiddler软件,会得到如下的信息

可以看到,熟悉的名为【2】的请求,也在当中

经过上面的猜测,我们知道,很有可能是第一个请求在暗地里做了些不为人知的操作
我们点击第一个【2】请求,点击response里面的Textview按钮,可以看到一段被混淆过的JS代码

看到这里的小伙伴可能就大概明白了,当发起第一个名为2的请求时,服务器端返回了一段JS代码,然后在浏览器里面执行了
现在我们只需要将这段混淆过的JS代码翻译一下,就能知道第一个请求到底做了些什么了

翻译混淆代码

我们将返回的JS代码复制下来,记得不要复制开头的script和结尾的/script
然后,我们来到猿人学提供的翻译混淆代码的工具点我进入工具
我们将复制下来的代码,粘贴到第一个文本框,点击【一键解混淆】就行啦

接着,我们将翻译好的代码,复制到Notepad++里面,使用JS插件格式化一下

整段代码差不多200多行代码,而且这些函数名和变量名都非常奇怪,不过这些都不影响我们静下心来分析整段代码

分析JS代码

我们大致的浏览一下,全部代码,可以发现,大多数都是定义的函数,但是真正执行的只有最后的【 W(X());】

我们分析W()函数可以发现

function W(Y, Z) {
        document["cookie"] = "m" + M() + "=" + V(Y) + "|" + Y + "; path=/";
        location["reload"]();
    }

w()函数定义了两个形参,而执行的函数【 W(X());】,是传入一个参数的,而这个参数就是上面的X()函数

function X(Y, Z) {
        return Date["parse"](new Date());
    }

我们在谷歌调试工具里面执行X()函数就可以看到,返回的是一个时间戳,那么这个函数也会返回一个时间戳


X()函数我们弄清楚后,我们再来研究一下W()函数

分析W()函数

function W(Y, Z) {
        document["cookie"] = "m" + M() + "=" + V(Y) + "|" + Y + "; path=/";
        location["reload"]();
    }

看到【 document[“cookie”] 】,我想大家已经明白了,Cookie是如何被设置的了
而后面的【 location"reload"; 】,非常关键
这行代码的意思就是:刷新当前文档,也就是按了一下浏览器上的刷新页面按钮

现在我们重新理一下思路

  1. 网页向服务器发送请求,返回了两个名为【2】的结果
  2. 第一个没有Cookie,而第二个有Cookie
  3. 第一个虽然没有Cookie,但是却执行了一段JS代码
  4. 而这段JS代码给网页中的Cookie赋了值,接着刷新了整个页面
  5. 最后,呈现在我们眼前的网页,也就是第二个名为【2】的结果,有了Cookie

所以说,Cookie是怎么来的,我就不再赘述了,我们接着分析W()函数里面的代码
在分析代码之前,我们先对比一下,Cookie和这段代码

m=36674c3718305e203ee914bf011045c5|1609132022000
document["cookie"] = "m" + M() + "=" + V(Y) + "|" + Y + "; path=/";

最后面的【"; path=/"】字符串,是页面信息(第几页),在其他地方肯定是会处理的,这里我们可以省略
通过对比,赋值过程和赋值结果,我们可以发现赋值过程中的【 M() 】函数返回的一个应该是个空值
我们可以去分析一下M()函数

分析M()函数

话不多说,直接上代码

function M(Y, Z) {
        var a4 = B(this, function () {
            var a5 = function () {
                var a6 = a5["constructor"]("return /\" + this + \"/")()["compile"]("^([^ ]+( +[^ ]+)+)+[^ ]}");
                return !a6["test"](a4);
            };

            return a5();
        });
        a4();
        K();
        qz = [10, 99, 111, 110, 115, 111, 108, 101, 32, 61, 32, 110, 101, 119, 32, 79, 98, 106, 101, 99, 116, 40, 41, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 10, 32, 32, 32, 32, 119, 104, 105, 108, 101, 32, 40, 49, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 40, 105, 61, 48, 59, 105, 60, 49, 49, 48, 48, 48, 48, 48, 59, 105, 43, 43, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 104, 105, 115, 116, 111, 114, 121, 46, 112, 117, 115, 104, 83, 116, 97, 116, 101, 40, 48, 44, 48, 44, 105, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 10, 125, 10, 99, 111, 110, 115, 111, 108, 101, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 91, 111, 98, 106, 101, 99, 116, 32, 79, 98, 106, 101, 99, 116, 93, 39, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 402, 32, 116, 111, 83, 116, 114, 105, 110, 103, 40, 41, 32, 123, 32, 91, 110, 97, 116, 105, 118, 101, 32, 99, 111, 100, 101, 93, 32, 125, 39, 10];
        eval(L(qz));

        try {
            if (global) {
                console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
            } else {
                while (1) {
                    console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
                    debugger;
                }
            }
        } catch (a5) {
            return navigator["vendorSub"];
        }
    }

首先,我们可以看到函数里面还包含着两个函数分别是【 a4() 】和【 K() 】
而这个【 a4() 】函数,也定义在M()内,但是执行【 a4() 】函数的时候,并没有传入参数,所以说,这段代码是没用的

接着,我们看一下K()函数

function K(Y, Z) {
        if (Z) {
            return J(Y);
        }

        return H(Y);
    }

需要传入参数,而执行的时候,又没有传入,所有这段代码也是是没用的
我们简化一下M()函数

function M(Y, Z) {
        qz = [10, 99, 111, 110, 115, 111, 108, 101, 32, 61, 32, 110, 101, 119, 32, 79, 98, 106, 101, 99, 116, 40, 41, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 10, 32, 32, 32, 32, 119, 104, 105, 108, 101, 32, 40, 49, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 40, 105, 61, 48, 59, 105, 60, 49, 49, 48, 48, 48, 48, 48, 59, 105, 43, 43, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 104, 105, 115, 116, 111, 114, 121, 46, 112, 117, 115, 104, 83, 116, 97, 116, 101, 40, 48, 44, 48, 44, 105, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 10, 125, 10, 99, 111, 110, 115, 111, 108, 101, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 91, 111, 98, 106, 101, 99, 116, 32, 79, 98, 106, 101, 99, 116, 93, 39, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 402, 32, 116, 111, 83, 116, 114, 105, 110, 103, 40, 41, 32, 123, 32, 91, 110, 97, 116, 105, 118, 101, 32, 99, 111, 100, 101, 93, 32, 125, 39, 10];
        eval(L(qz));

        try {
            if (global) {
                console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
            } else {
                while (1) {
                    console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
                    debugger;
                }
            }
        } catch (a5) {
            return navigator["vendorSub"];
        }
    }

eval()函数又出现了,做过第一道题的时候,我们知道eval()可以间接的改变一些变量的值,那么这里的eval()是否对cookie有所改变呢?
我们来看看eval()中的L()函数

function L(Y, Z) {
        let a0 = "";

        for (let a1 = 0; a1 < Y["length"]; a1++) {
            a0 += String["fromCharCode"](Y[a1]);
        }

        return a0;
    }

L()函数可以传入两个参数,eval()执行的时候确实是传入一个参数的,这个参数是一个数组,正好用于L()函数中的for循环
for循环里面的内容就是将,传入的数组中的每一个值,通过【 String[“fromCharCode”] 】这个方法翻译拼接着成一个字符串并返回
我也尝试着运行了这个函数,结果并没有什么卵用,就是一串字符串而已,感兴趣的同学可以去试试
这种就是典型的开发者挖坑,我们去踩

我们继续读下面的代码

        try {
            if (global) {
                console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
            } else {
                while (1) {
                    console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
                    debugger;
                }
            }
        } catch (a5) {
            return navigator["vendorSub"];
        }

try…catch 这个语法,我相信稍微学了点编程的同学,都知道是什么意思,我这里也不再阐述,不懂的同学可以问问百度
try里面的内容还是有点意思,直接进来就报错
我为什么这么说呢,是因为,global这个变量根本就没有定义,所有会直接报错,进入catch里面,虽然说传入了【a5】变量,但是在下面的代码并没有引用,可以不管
最后,直接return navigator[“vendorSub”]

而这个navigator主要是包含有关浏览器的信息,它通过数组取值的方式取值,大概率返回的任然是空值.如果不是我们可以回来继续分析


那么,简化后的赋值代码可以这么写

cookie = "m" + "=" + V(Y) + "|" + Y;
          m=36674c3718305e203ee914bf011045c5|1609132022000
V(Y) = 36674c3718305e203ee914bf011045c5

所以说,我们现在就知道了,加密的值来源于【 V(Y) 】

在代码中分析【 V(Y) 】其实没必要,加密的过程过于复杂,我们直接使用鬼鬼JS调试工具,先验证一下我们猜想到达正不正确

验证猜想

我们将Notepad++里面的代码复杂粘贴到鬼鬼调试工具,记得删除第一行代码和最后一行代码
这是因为第一行是一个大函数,包含了很多小函数和变量,删除后,方面我们在工具中调试

在运行之前,我们先对代码进行如下的修改

  • 删除第一行代码和最后一行代码
  • 将代码中的let改为var,可以通过搜索let,进行修改
  • 删除104行左右的【 setInterval(M(), 500); 】这行代码,而这行代码的主要作用就是:每500毫秒,执行M(),而这个函数,我们在上面的推断是返回空所有没什么用,可以直接删掉
  • 在代码的开头定义 【 var navigator = {}; 】(这个navigator包含有关浏览器的信息,在运行代码的时候,由于执行了M()这个函数,而navigator没有定义(因为是在鬼鬼调试器中运行),会报错)
  • M()函数中,qz上面的多余代码直接删除,并没有什么卵用
  • W()函数中的内容,需要改写成下图的内容

接着,我们写一个get_cipher()函数用来返回【 W(X()) 】的值

可以看到,下面给出的执行结果是有值的,但是这还不严谨
我们还需要通过最后一个步骤进行验证
将Fiddler抓包工具,得到的m值后面的时间戳,复杂下来在调试工具中运行一下

m=36674c3718305e203ee914bf011045c5|1609132022000 (Fiddler抓包工具得到的值)

芜湖起飞,结果一模一样,我们可以愉快地写Python代码进行爬取数据啦!

最后的爬虫和解出答案

通过上面的一顿操作,我们可以编写一个JS文件,用于生成链接后面的密文
在Python代码中可以通过第三方库execjs,执行这个JS文件,得到密文
由于代码太多,我直接上链接
https://wwx.lanzoux.com/iV6n7jsvotg

话不到多,直接上爬虫代码,很简单,写了一些注释,我就不详细赘述了

# @BY     :Java_S
# @Time   :2020/12/26 12:14
# @Slogan :够坚定够努力大门自然会有人敲,别怕没人赏识就像三十岁的梵高

import requests
import execjs
import time

def get_cipher_value():
    # 导入JS,读取需要的js文件
    with open(r'JS/jsCookie.js',encoding='utf-8',mode='r') as f:
        JsData = f.read()
    # 加载js文件,使用call()函数执行,传入需要执行函数即可获取返回值
    psd = execjs.compile(JsData).call('get_cipher')
    return psd

def get_data(page_num,cipher):
    url = f'http://match.yuanrenxue.com/api/match/2?page={page_num}'
    headers = {
        'Host': 'match.yuanrenxue.com',
        'User-Agent':'yuanrenxue.project',
        'Cookie':cipher
    }
    print(f'加密密文--->{cipher}')
    response = requests.get(url,headers = headers)
    return response.json()


if __name__ == '__main__':

    sum_num = 0

    for page_num in range(1, 6):
        info = get_data(page_num, get_cipher_value())
        price_list = [i['value'] for i in info['data']]
        print(f'第{page_num}页发布日热度的值:{price_list}')
        sum_num += sum(price_list)
        time.sleep(1)

    print(f'发布日热度值总和:{sum_num}')

“JS逆向 | Python爬虫 | 动态cookie如何破~” 如果你觉得文章还不错,请大家下,因为这将是我持续输出更多优质文章的最强动力! 阅读详情

相关推荐

Python 实战:动态 Cookie 加密的 JS 逆向分析与破解

本文详细解析了动态Cookie加密的JS逆向分析与Python破解实战,涵盖加密原理、Chrome调试工具使用、JS反混淆处理及Python调用JS加密函数等核心技巧。通过电商网站和视频平台的实际案例,展示如何应对动态密钥、浏览器指纹检测等高级反爬策略,为爬虫开发者提供实用解决方案。

kkk56的博客 640

动态cookie-ob混淆

动态cookie剖析心得 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录动态cookie剖析心得前言一、动态cookie是什么?二、如何确定该网站是否是动态cookie1.浏览器清除cookie后刷新网页,监控请求状态2.直接requests请求三、如何破局1、扣js2、解析js1)格式序列化js2)查找cookie3) 改写js3、代码中修改js总结 前言 现在好多网站都开始使用动态cookie加载web,今天我就边写边记,带大家一起了解动态cookie,并学习如何根据其

weixin_42963347的博客 2540

Python Playwright实战:拦截动态API实现爬虫降维打击

在数据采集领域,动态网站爬取是常见的技术挑战。其核心原理在于现代Web应用(如SPA)普遍采用异步数据加载技术,通过XHR或Fetch API与后端服务器通信,导致传统基于静态HTML解析的方法失效。理解并掌握网络请求拦截技术,对于构建高效、稳定的数据采集方案具有重要价值。它允许开发者绕过资源密集型的页面渲染过程,直接与数据源头对话,从而在工程实践中实现效率的飞跃。这一技术尤其适用于电商价格监控、社交媒体数据分析等需要处理大量动态内容的场景。本文以Python Playwright为工具,详细演示了如何通过

weixin_30546189的博客 410

猿人学爬虫攻防大赛 | 第二题: js 混淆 - 动态Cookie

猿人学爬虫攻防大赛 | 第二题: js 混淆 - 动态Cookie 开局直接F12,由于题目都说好是动态Cookie了,我们直接看Cookie,第一个请求中没有set-cookie,第二个请求中的Cookie就产生了一个m=593289d3022cb6f1d4ebb3075d836f7f|1606978187000,猜测是通过js生成的Cookie。 打开Fiddler,重新载入我们的第二题,果然第一个请求是调用了一个脚本,但是这个脚本明显是被混淆了,注意到:开头定义一个数组,那我们可以大胆猜测是ob混淆

爬虫进击之路 1051

JS逆向实战:从Hook定位到算法还原,破解Boss直聘__zp_stoken__

在Web数据采集与安全研究领域,JavaScript逆向工程是一项核心技能,它专注于分析前端代码的加密与混淆逻辑。其基本原理是通过动态调试和静态分析,定位关键函数并还原其算法,从而理解数据在客户端被处理的全过程。这项技术的核心价值在于,它能帮助开发者构建通用的反爬虫对抗框架,应对诸如动态令牌生成、接口签名等常见防护手段。在实际应用场景中,无论是分析主流招聘平台的数据接口,还是应对滑块验证等交互式验证,掌握从网络请求追踪到本地算法实现的完整链路都至关重要。本文以Boss直聘的`__zp_stoken__`参数

weixin_34166472的博客 386

基于Playwright与异步Python构建高效政务网站爬虫实战指南

网络爬虫作为自动化获取互联网公开数据的关键技术,其核心原理在于模拟浏览器行为或直接发送HTTP请求来解析网页内容。在动态网页日益普及的今天,传统的静态请求库已难以应对JavaScript渲染的内容,而浏览器自动化工具的价值因此凸显。这类技术能完整执行页面脚本,精准获取渲染后的DOM结构,极大地提升了数据抓取的准确性和覆盖率。在工程实践中,结合异步并发架构,可以成倍提升大规模、多目标网站的采集效率,有效解决信息聚合的瓶颈问题。这尤其适用于需要实时追踪多源、异构公开信息的场景,例如本文聚焦的**公务员招考公告*

weixin_33769125的博客 450

python反反爬_Python反反爬之JS混淆---动态Cookie(持续更新详细教程)

写在前面经过上一题的练习JS混淆---源码乱码,我们已经对JS混淆有了大致的了解,这次我们再来练习一道同类型的题目,只不过这次是动态Cookie首先,让我们了解一下什么是CookieCookie 并不是它的原意“甜饼”的意思, 而是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些...

weixin_34867001的博客 401

逆向Shopee反爬虫:破解af-ac-enc-dat参数与实战策略

在Web数据采集领域,反爬虫机制是数据工程师常遇到的挑战,其核心原理是通过客户端动态生成加密参数来验证请求合法性。以非对称加密算法为基础,结合环境指纹收集与实时计算,这类技术能有效拦截简单的自动化请求,保护网站数据安全。其技术价值在于平衡数据开放性与安全防护,广泛应用于电商价格监控、市场分析和竞品研究等场景。本文以Shopee平台的af-ac-enc-dat参数为例,深入解析其生成逻辑,并提供从浏览器自动化到算法复现的完整解决方案,帮助开发者应对类似的反爬虫体系。

weixin_29323493的博客 1000

携程酒店数据采集实战:动态接口破解与反反爬策略

在数据采集领域,动态接口破解是绕不开的核心技能,尤其面对携程这类高反爬强度的平台,仅靠静态页面抓取根本无法获取完整的酒店价格与房态信息。真实的数据藏在异步加载的接口背后,请求参数被加密签名,流量行为受风控实时监控,这要求爬虫开发者具备从浏览器网络面板定位接口、逆向JS生成签名、以及构建反反爬策略的完整能力。本文从Python爬虫的实战视角出发,系统梳理了从抓包分析、参数分类、签名复现代码实现,到Cookie管理、IP代理池构建、请求频率随机化等落地技巧,同时覆盖嵌套JSON解析、多接口数据关联、增量调度及常

weixin_34275734的博客 425

Selenium无头模式爬取动态页面实战:以51job招聘数据为例

在Web数据采集领域,动态渲染页面因其数据通过JavaScript异步加载而成为传统爬虫的难点。其核心原理在于,现代前端框架(如React、Vue)往往在初始HTML中仅包含基础框架,具体内容需通过API请求获取并在客户端渲染完成。针对这一技术挑战,**浏览器自动化工具**提供了一种高效的解决方案:通过模拟真实用户操作,等待页面完全渲染后再提取数据,从而绕过复杂的API逆向工程。这种方法在**数据采集**和**自动化测试**场景中价值显著,尤其适用于结构稳定但交互复杂的网站。以招聘信息聚合为例,爬取51jo

452

手把手教你用TUSB2E22中继器实现eUSB2与USB 2.0互转(附实测数据对比)

本文详细介绍了如何利用TUSB2E22中继器实现eUSB2与USB 2.0的高效互转,包括技术背景、硬件设计要点、信号完整性测试方法及故障排查策略。通过实测数据对比,展示了TUSB2E22在信号延迟、功耗和眼图性能上的显著优势,为工程师提供了实用的工程方案。

weixin_29199873的博客 283

前端加密逆向实战:从JS解密到Python爬虫的完整解决方案

在Web开发与数据采集领域,前端加密技术已成为保护数据传输安全、防止内容被轻易抓取的重要手段。其核心原理在于,服务器将敏感数据(如文本、用户信息)通过特定算法(如AES、RSA)加密后传输至浏览器,由前端JavaScript代码在客户端完成解密与渲染。这种技术不仅提升了数据安全性,也增加了自动化数据采集的难度。对于开发者而言,理解并逆向这套流程,即通过分析网络请求、追踪JS调用栈、定位解密函数,最终在本地复现解密逻辑,是一项极具价值的工程实践技能。它广泛应用于数据合规采集、安全审计、以及理解现代Web应用架

weixin_30546189的博客 467

代码审计工具学习之Seay(安装以及初步认识)

目录 1.1名词解释 1.2代码审计的重要性 1.3代码审计的步骤 1.4代码审计的内容 1.5常见的代码审计工具 2 Seay 2.1什么是Seay 2.2Seay的安装过程 3典型漏洞分析 3.1什么是命令注入漏洞 3.2 如何理解命令注入漏洞 3.3 如何防御命令注入漏洞 4 利用工具对命令注入漏洞进行分析 4.1DVWA靶场命令注入漏洞分析 4.2 Pikachu靶场命令注入漏洞分析 1.1名词解释 软件代码审计是对编程项目中源代码的全面...

weixin_52515588的博客 2万+

Shopee反爬逆向实战:破解x-sap-ri与x-sap-sec动态加密请求头

在Web数据采集领域,反爬虫机制与爬虫技术的对抗不断升级。传统基于请求频率控制和User-Agent验证的防护已逐渐被更复杂的动态加密方案取代,这些方案的核心原理在于对客户端环境指纹的采集、加密签名算法的应用以及请求唯一性验证。其技术价值在于有效区分自动化脚本与真实用户行为,大幅提高了数据采集的技术门槛。典型的应用场景包括电商平台商品信息监控、价格追踪和市场竞争分析等。本文聚焦于Shopee平台采用的最新反爬策略,该策略通过x-sap-ri和x-sap-sec这对动态加密请求头构建防护。其中,x-sap-r

dianwei5413的博客 371

OV5640摄像头DVP与MIPI接口配置实战:从30Hz到60Hz的性能优化指南

本文详细解析了OV5640摄像头在DVP与MIPI接口下的60Hz性能优化方法,重点解决720p分辨率下帧率仅30Hz的常见问题。通过精确配置时钟树、传感器寄存器和接口参数,提供DVP与MIPI接口的实战配置代码,并分享调试工具与性能验证技巧,帮助开发者实现稳定的60fps输出。

weixin_29223603的博客 1301

从仿真到真机:如何将XTDrone的VINS-Fusion+RTABMap建图方案部署到真实无人机上?

本文详细介绍了如何将XTDrone的VINS-Fusion+RTABMap建图方案从仿真环境迁移到真实无人机上。内容涵盖硬件选型、传感器配置、VINS-Fusion调优、RTABMap性能优化以及系统集成等关键步骤,特别针对三维稠密重建在真实环境中的挑战提供了实用解决方案。

weixin_29056781的博客 242

Python爬虫进阶:Selenium实战破解动态渲染反爬

在Web数据抓取领域,动态渲染技术是现代网站广泛采用的反爬机制。其核心原理在于,服务器初始返回的HTML仅为空壳页面,关键数据需通过客户端JavaScript执行AJAX请求后动态注入DOM,这导致传统HTTP客户端(如requests库)无法直接获取完整内容。该技术的工程价值在于提升了网站交互体验,但也对数据采集提出了挑战。面对新闻资讯、电商评论、社交媒体等应用场景中日益复杂的动态内容,开发者需要更强大的工具来模拟真实浏览器环境。Selenium作为浏览器自动化框架,通过驱动真实浏览器执行JavaScri

weixin_33676492的博客 415

可维护的 SAP UI5 Theming 策略:从 CSS 级联与特性选择器到 UI Theme Designer 的工程化落地

摘要:SAP UI5主题化是一个涉及CSS级联、选择器特异性和主题参数的系统工程,与应用逻辑解耦以实现品牌化和无障碍适配。轻量级调整优先使用附加CSS,重大改动才考虑创建新主题。样式冲突需通过特异性原则解决,避免滥用!important。动态添加样式应使用addStyleClass而非直接操作DOM。主题可通过bootstrap参数、URL或运行时API设置,企业级主题推荐使用UI Theme Designer。自定义内容应消费主题变量以实现一致性,避免直接修改控件内部结构或内联样式。工程化落地需规范分层和

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 307

Libvio.link反爬机制深度解析与突破策略

Libvio.link的反爬体系代表了当前动态网站的典型防御水平,其核心难点在于前端环境真实性验证与行为模式识别。未来对抗将更依赖AI驱动的动态模拟技术(如基于强化学习的行为生成)与去中心化爬取网络(如P2P节点池)。作为开发者,需在技术突破与合规采集间寻求平衡——建议通过官方API申请数据访问权限,或采用"低频率+模拟人类行为"的温和抓取策略。毕竟,可持续的数据获取能力,远比一次性的技术突破更具价值。思考问题。

zzywxc787的博客 5508

cursor AI代码编辑器IDE对接deepseek模型api;字节ai编辑器trae

参考: https://www.cursor.com/ https://platform.deepseek.com/https://www.cursor.com/下载安装后,注册账号登录即可 再高级里选择设置 再模型这注册模型: 模型名称一定要填正确,url地址填好,最后填上秘钥验证

weixin_42357472的博客 1万+

MISRA C 详解 · 专栏06:2023 与 2025 更新总览(相对 2012 的差异)

本专栏 01~05 篇基于(143 规则 + 16 指令)。这六年间标准又前进了两步——(大改)和(微调)。本文补充说明「相对 2012,标准变在哪」,并给出新增规范的代表性示例。

XavierKong的博客 73

Python自动化抢票实战:从零构建演唱会票务机器人

网络爬虫与浏览器自动化是当今Web数据采集和交互模拟的核心技术。其原理是通过程序模拟用户行为,自动访问网页、提取数据或执行操作,从而突破人工操作的效率瓶颈。在工程实践中,这些技术能够显著提升数据获取和任务执行的自动化水平,广泛应用于市场监测、数据分析和流程自动化等场景。以演唱会票务为例,面对供需失衡和高度自动化的黄牛脚本,普通用户手动操作往往难以成功。通过Python结合Selenium或Playwright等工具,可以构建稳定高效的抢票系统,模拟真人操作流程,实现从监控、选座到提交订单的全自动化。本文聚焦

weixin_34306593的博客 454

YOLOv11的物理信息神经网络(PINN):引入物理规律约束目标运动预测

本文介绍了YOLOv11目标检测与PINN物理信息神经网络的融合技术。YOLOv11采用增强特征提取和参数优化架构,在保持实时性的同时提升检测精度。PINN通过将物理方程嵌入损失函数,实现数据高效学习。两者的结合可显著提升运动预测准确性和遮挡处理鲁棒性。文章详细阐述了环境配置、YOLOv11模型验证方法,并提供了基础PINN框架代码实现,展示了物理约束如何通过自动微分整合到神经网络中。该融合技术适用于自动驾驶、无人机导航等需要物理规律建模的视觉感知场景。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 423

政务网站数据采集实战:逆向分析签名接口与Python爬虫实现

网络爬虫技术是数据采集与分析领域的基础工具,其核心原理在于模拟浏览器行为,与目标服务器进行自动化数据交互。在工程实践中,面对采用前后端分离架构的现代网站,尤其是政务类服务平台,直接解析静态HTML往往无法获取动态加载的数据,这就需要通过浏览器开发者工具进行逆向分析,定位承载真实数据的API接口。这类接口常采用签名(Sign)机制作为关键的反爬虫手段,通过特定算法对请求参数和密钥进行计算,以验证请求的合法性。理解并逆向签名算法,对于构建稳定、合规的数据采集管道具有重要技术价值。本文以公共资源交易平台为例,深入

weixin_33675507的博客 369

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Python爬虫实战:破解企查查反爬的三种核心方法与工程实践

网络爬虫是自动化获取互联网公开数据的关键技术,其核心原理是通过模拟HTTP请求与解析响应来提取结构化信息。在数据驱动决策的背景下,高效、稳定地获取企业工商信息等商业数据具有重要价值,广泛应用于市场分析、风险控制等场景。然而,以企查查为代表的商业数据平台部署了复杂的反爬机制,如请求头校验、IP频率限制和动态参数加密,对传统爬虫构成了严峻挑战。为应对这些挑战,本文聚焦于三种经过实战检验的工程化解决方案:一是通过逆向分析JavaScript进行请求模拟与参数复现,直接构建有效请求;二是利用无头浏览器自动化工具(如

weixin_30832405的博客 385

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Scrapling框架解析:如何实现Python爬虫的智能自愈与抗干扰

网络爬虫作为数据采集的核心技术,其核心原理是通过模拟HTTP请求获取网页内容并解析提取结构化信息。然而,在实际工程实践中,目标网站的反爬机制和频繁的页面结构变动常导致传统爬虫维护成本激增。为解决这一痛点,智能爬虫框架应运而生,它通过机器学习驱动的异常检测、动态策略调度和状态持久化等机制,赋予爬虫自适应与自愈能力,显著提升长期运行的稳定性。这类技术尤其适用于电商监控、舆情分析等需要7x24小时持续采集的场景。以Scrapling框架为例,其基于语义指纹的页面变化检测和多线索模糊匹配机制,能够自动适应CSS选择

weixin_33859231的博客 396

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: Python反反爬之JS混淆---源码乱码(详细教程)
Java_S12138
博客等级 码龄7年 42粉丝 5原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值