产业政策大数据 spolicy 爬虫逆向 解密 Py代码获取数据 较难 2023版

本文详细介绍了如何使用爬虫技术解析spolicy网站的加密数据,包括调试方法、加密位置的确定以及最终的Py代码实现。在调试过程中,通过hook过无限DEBUG,确定请求拦截器中的加密步骤,并提取关键的webpack代码,最终实现数据的解密和获取。
摘要由CSDN通过智能技术生成

http://www.spolicy.com/detail?id=64e42c4c46da919979b41299

目录

1 调试

1.1 f12无效的调试

1.2 用hook过无限DEBUG

2 加密位置确定

2.1 在XHR里面进行搜索定位

2.2 观察明文到密文

3 最终代码


1 调试

1.1 f12无效的调试

该网页直接按键盘f12无调试页面出来,chrome浏览器需要鼠标右键随后点击“检查"选项进入调试页面

1.2 用hook过无限DEBUG

进入调试页面后会有一个无限DEBUG

我们输入如下hook代码过点击三角过掉DEBUG

let AAA=Function.prototype.constructor


Function.prototype.constructor=function(x){
    console.log(x)
    if(X!="debugger") {
        return AAA(x)
    };
    return function(){};
}

2 加密位置确定

2.1 在XHR里面进行搜索定位

这里我们发送的报文r已经是加密后的一串数字了,我们需要找到原始加密报文

经过点击多次单步调试后,发现会在一个axiosInstance处停留

经过查看混淆的代码发现他是一个response拦截器

我们需要找到requeset的拦截器,可以看到这里有8个 axiosInstance,我们在可疑处打上断点

我们可以看到在request之处断住

2.2 观察明文到密文

接下来一步很重要,

我们需要关闭当前页面,重新打开页面,重新过无限DEBUGGER后断到request这步,我们观察最右边的e变量,现在e变量还没有data属性 

我们再次点击一下三角按钮,可以看到出现一个data属性,这个就是我们要加密的数据

多次点击单步调试发现在此处data会变成密文,这里无法跟栈,我们需要重新debug调试

重新调试时候我们发现如下这步是加密步骤

我们还原后是,我们需要获取f['encode']方法

f['encode'](data)['finish']()['slice']()

我们进入方法

这里需要过w这个加密方法 

我们点击进入

进入以后是一段webpack我们扣下这段webpack 

3 最终代码

代码结构如下 我们需要补一个环境commonjsGlobal

最终js代码

window = global
commonjsGlobal = window

var _temp
!function(g) {
            var r, e, t, i;
            r = {
                1: [function(e, t, n) {
                    t.exports = function(e, t) {
                        for (var n = Array(arguments.length - 1), o = 0, r = 2, i = !0; r < arguments.length; )
                            n[o++] = arguments[r++];
                        return new Promise((function(r, s) {
                                n[o] = function(e) {
                                    if (i)
                                        if (i = !1,
                                            e)
                                            s(e);
                                        else {
                                            for (var t = Array(arguments.length - 1), n = 0; n < t.length; )
                                                t[n++] = arguments[n];
                                            r.apply(null, t)
                                        }
                                }
                                ;
                                try {
                                    e.apply(t || null, n)
                                } catch (a) {
                                    i && (i = !1,
                                        s(a))
                                }
                            }
                        ))
                    }
                }
                    , {}],
                2: [function(e, t, n) {
                    n.length = function(e) {
                        var t = e.length;
                        if (!t)
                            return 0;
                        for (var n = 0; 1 < --t % 4 && "=" == (e[0 | t] || ""); )
                            ++n;
                        return Math.ceil(3 * e.length) / 4 - n
                    }
                    ;
                    for (var o = Array(64), r = Array(123), i = 0; i < 64; )
                        r[o[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;
                    n.encode = function(e, t, n) {
                        for (var r, i = null, s = [], a = 0, c = 0; t < n; ) {
                            var l = e[t++];
                            switch (c) {
                                case 0:
                                    s[a++] = o[l >> 2],
                                        r = (3 & l) << 4,
                                        c = 1;
                                    break;
                                case 1:
                                    s[a++] = o[r | l >> 4],
                                        r = (15 & l) << 2,
                                        c = 2;
                                    break;
                                case 2:
                                    s[a++] = o[r | l >> 6],
                                        s[a++] = o[63 & l],
                                        c = 0
                            }
                            8191 < a && ((i = i || []).push(String.fromCharCode.apply(String, s)),
                                a = 0)
                        }
                        return c && (s[a++] = o[r],
                            s[a++] = 61,
                        1 === c && (s[a++] = 61)),
                            i ? (a && i.push(String.fromCharCode.apply(String, s.slice(0, a))),
                                i.join("")) : String.fromCharCode.apply(String, s.slice(0, a))
                    }
                    ;
                    var s = "invalid encoding";
                    n.decode = function(e, t, n) {
                        for (var o, i = n, a = 0, c = 0; c < e.length; ) {
                            var l = e.charCodeAt(c++);
                            if (61 == l && 1 < a)
                                break;
                            if ((l = r[l]) === g)
                                throw Error(s);
                            switch (a) {
                                case 0:
                                    o = l,
                                        a = 1;
                                    break;
                                case 1:
                                    t[n++] = o << 2 | (48 & l) >> 4,
                                        o = l,
                                        a = 2;
                                    break;
                                case 2:
                                    t[n++] = (15 & o) << 4 | (60 & l) >> 2,
                                        o = l,
                                        a = 3;
                                    break;
                                case 3:
                                    t[n++] = (3 & o) << 6 | l,
                                        a = 0
                            }
                        }
                        if (1 === a)
                            throw Error(s);
                        return n - i
                    }
                        ,
                        n.test = function(e) {
                            return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e)
                        }
                }
                    , {}],
                3: [function(e, t, n) {
                    (t.exports = function e(t, n) {
                            "string" == typeof t && (n = t,
                                t = g);
                            var o = [];
                            function r(t) {
                                if ("string" != typeof t) {
                                    var n = i();
                                    if (e.verbose && console.log("codegen: " + n),
                                        n = "return " + n,
                                        t) {
                                        for (var s = Object.keys(t), a = Array(s.length + 1), c = Array(s.length), l = 0; l < s.length; )
                                            a[l] = s[l],
                                                c[l] = t[s[l++]];
                                        return a[l] = n,
                                            Function.apply(null, a).apply(null, c)
                                    }
                                    return Function(n)()
                                }
                                for (var u = Array(arguments.length - 1), d = 0; d < u.length; )
                                    u[d] = arguments[++d];
                                if (d = 0,
                                    t = t.replace(/%([%dfijs])/g, (function(e, t) {
                                            var n = u[d++];
                                            switch (t) {
                                                case "d":
                                                case "f":
                                                    return "" + +("" + n);
                                                case "i":
                                                    return "" + Math.floor(n);
                                                case "j":
                                                    return JSON.stringify(n);
                                                case "s":
                                                    return "" + n
                                            }
                                            return "%"
                                        }
                                    )),
                                d !== u.length)
                                    throw Error("parameter count mismatch");
                                return o.push(t),
                                    r
                            }
                            function i(e) {
                                return "function " + (e || n || "") + "(" + (t && t.join(",") || "") + "){\n  " + o.join("\n  ") + "\n}"
                            }
                            return r.toString = i,
                                r
                        }
                    ).verbose = !1
                }
                    , {}],
                4: [function(e, t, n) {
                    function o() {
                        this.t = {}
                    }
                    (t.exports = o).prototype.on = function(e, t, n) {
                        return (this.t[e] || (this.t[e] = [])).push({
                            fn: t,
                            ctx: n || this
                        }),
                            this
                    }
                        ,
                        o.prototype.off = function(e, t) {
                            if (e === g)
                                this.t = {};
                            else if (t === g)
                                this.t[e] = [];
                            else
                                for (var n = this.t[e], o = 0; o < n.length; )
                                    n[o].fn === t ? n.splice(o, 1) : ++o;
                            return this
                        }
                        ,
                        o.prototype.emit = function(e) {
                            var t = this.t[e];
                            if (t) {
                                for (var n = [], o = 1; o < arguments.length; )
                                    n.push(arguments[o++]);
                                for (o = 0; o < t.length; )
                                    t[o].fn.apply(t[o++].ctx, n)
                            }
                            return this
                        }
                }
                    , {}],
                5: [function(e, t, n) {
                    t.exports = i;
                    var o = e(1)
                        , r = e(7)("fs");
                    function i(e, t, n) {
                        return t = "function" == typeof t ? (n = t,
                            {}) : t || {},
                            n ? !t.xhr && r && r.readFile ? r.readFile(e, (function(o, r) {
                                    return o && "undefined" != typeof XMLHttpRequest ? i.xhr(e, t, n) : o ? n(o) : n(null, t.binary ? r : r.toString("utf8"))
                                }
                            )) : i.xhr(e, t, n) : o(i, this, e, t)
                    }
                    i.xhr = function(e, t, n) {
                        var o = new XMLHttpRequest;
                        o.onreadystatechange = function() {
                            if (4 !== o.readyState)
                                return g;
                            if (0 !== o.status && 200 !== o.status)
                                return n(Error("status " + o.status));
                            if (t.binary) {
                                if (!(e = o.response))
                                    for (var e = [], r = 0; r < o.responseText.length; ++r)
                                        e.push(255 & o.responseText.charCodeAt(r));
                                return n(null, "undefined" != typeof Uint8Array ? new Uint8Array(e) : e)
                            }
                            return n(null, o.responseText)
                        }
                            ,
                        t.binary && ("overrideMimeType"in o && o.overrideMimeType("text/plain; charset=x-user-defined"),
                            o.responseType = "arraybuffer"),
                            o.open("GET", e),
                            o.send()
                    }
                }
                    , {
                        1: 1,
                        7: 7
                    }],
                6: [function(e, t, n) {
                    function o(e) {
                        function t(e, t, n, o) {
                            var r = t < 0 ? 1 : 0;
                            e(0 === (t = r ? -t : t) ? 0 < 1 / t ? 0 : 2147483648 : isNaN(t) ? 2143289344 : 34028234663852886e22 < t ? (r << 31 | 2139095040) >>> 0 : t < 11754943508222875e-54 ? (r << 31 | Math.round(t / 1401298464324817e-60)) >>> 0 : (r << 31 | 127 + (r = Math.floor(Math.log(t) / Math.LN2)) << 23 | 8388607 & Math.round(t * Math.pow(2, -r) * 8388608)) >>> 0, n, o)
                        }
                        function n(e, t, n) {
                            return t = 2 * ((e = e(t, n)) >> 31) + 1,
                                n = e >>> 23 & 255,
                                e &= 8388607,
                                255 == n ? e ? NaN : 1 / 0 * t : 0 == n ? 1401298464324817e-60 * t * e : t * Math.pow(2, n - 150) * (8388608 + e)
                        }
                        function o(e, t, n) {
                            d[0] = e,
                                t[n] = f[0],
                                t[n + 1] = f[1],
                                t[n + 2] = f[2],
                                t[n + 3] = f[3]
                        }
                        function c(e, t, n) {
                            d[0] = e,
                                t[n] = f[3],
                                t[n + 1] = f[2],
                                t[n + 2] = f[1],
                                t[n + 3] = f[0]
                        }
                        function l(e, t) {
                            return f[0] = e[t],
                                f[1] = e[t + 1],
                                f[2] = e[t + 2],
                                f[3] = e[t + 3],
                                d[0]
                        }
                        function u(e, t) {
                            return f[3] = e[t],
                                f[2] = e[t + 1],
                                f[1] = e[t + 2],
                                f[0] = e[t + 3],
                                d[0]
                        }
                        var d, f, p, h, m;
                        function v(e, t, n, o, r, i) {
                            var s, a = o < 0 ? 1 : 0;
                            0 === (o = a ? -o : o) ? (e(0, r, i + t),
                                e(0 < 1 / o ? 0 : 2147483648, r, i + n)) : isNaN(o) ? (e(0, r, i + t),
                                e(2146959360, r, i + n)) : 17976931348623157e292 < o ? (e(0, r, i + t),
                                e((a << 31 | 2146435072) >>> 0, r, i + n)) : o < 22250738585072014e-324 ? (e((s = o / 5e-324) >>> 0, r, i + t),
                                e((a << 31 | s / 4294967296) >>> 0, r, i + n)) : (e(4503599627370496 * (s = o * Math.pow(2, -(o = 1024 === (o = Math.floor(Math.log(o) / Math.LN2)) ? 1023 : o))) >>> 0, r, i + t),
                                e((a << 31 | o + 1023 << 20 | 1048576 * s & 1048575) >>> 0, r, i + n))
                        }
                        function g(e, t, n, o, r) {
                            return t = e(o, r + t),
                                r = 2 * ((o = e(o, r + n)) >> 31) + 1,
                                t = 4294967296 * (1048575 & o) + t,
                                2047 == (n = o >>> 20 & 2047) ? t ? NaN : 1 / 0 * r : 0 == n ? 5e-324 * r * t : r * Math.pow(2, n - 1075) * (t + 4503599627370496)
                        }
                        function W(e, t, n) {
                            p[0] = e,
                                t[n] = h[0],
                                t[n + 1] = h[1],
                                t[n + 2] = h[2],
                                t[n + 3] = h[3],
                                t[n + 4] = h[4],
                                t[n + 5] = h[5],
                                t[n + 6] = h[6],
                                t[n + 7] = h[7]
                        }
                        function y(e, t, n) {
                            p[0] = e,
                                t[n] = h[7],
                                t[n + 1] = h[6],
                                t[n + 2] = h[5],
                                t[n + 3] = h[4],
                                t[n + 4] = h[3],
                                t[n + 5] = h[2],
                                t[n + 6] = h[1],
                                t[n + 7] = h[0]
                        }
                        function b(e, t) {
                            return h[0] = e[t],
                                h[1] = e[t + 1],
                                h[2] = e[t + 2],
                                h[3] = e[t + 3],
                                h[4] = e[t + 4],
                                h[5] = e[t + 5],
                                h[6] = e[t + 6],
                                h[7] = e[t + 7],
                                p[0]
                        }
                        function C(e, t) {
                            return h[7] = e[t],
                                h[6] = e[t + 1],
                                h[5] = e[t + 2],
                                h[4] = e[t + 3],
                                h[3] = e[t + 4],
                                h[2] = e[t + 5],
                                h[1] = e[t + 6],
                                h[0] = e[t + 7],
                                p[0]
                        }
                        return "undefined" != typeof Float32Array ? (d = new Float32Array([-0]),
                            m = 128 === (f = new Uint8Array(d.buffer))[3],
                            e.writeFloatLE = m ? o : c,
                            e.writeFloatBE = m ? c : o,
                            e.readFloatLE = m ? l : u,
                            e.readFloatBE = m ? u : l) : (e.writeFloatLE = t.bind(null, r),
                            e.writeFloatBE = t.bind(null, i),
                            e.readFloatLE = n.bind(null, s),
                            e.readFloatBE = n.bind(null, a)),
                            "undefined" != typeof Float64Array ? (p = new Float64Array([-0]),
                                m = 128 === (h = new Uint8Array(p.buffer))[7],
                                e.writeDoubleLE = m ? W : y,
                                e.writeDoubleBE = m ? y : W,
                                e.readDoubleLE = m ? b : C,
                                e.readDoubleBE = m ? C : b) : (e.writeDoubleLE = v.bind(null, r, 0, 4),
                                e.writeDoubleBE = v.bind(null, i, 4, 0),
                                e.readDoubleLE = g.bind(null, s, 0, 4),
                                e.readDoubleBE = g.bind(null, a, 4, 0)),
                            e
                    }
                    function r(e, t, n) {
                        t[n] = 255 & e,
                            t[n + 1] = e >>> 8 & 255,
                            t[n + 2] = e >>> 16 & 255,
                            t[n + 3] = e >>> 24
                    }
                    function i(e, t, n) {
                        t[n] = e >>> 24,
                            t[n + 1] = e >>> 16 & 255,
                            t[n + 2] = e >>> 8 & 255,
                            t[n + 3] = 255 & e
                    }
                    function s(e, t) {
                        return (e[t] | e[t + 1] << 8 | e[t + 2] << 16 | e[t + 3] << 24) >>> 0
                    }
                    function a(e, t) {
                        return (e[t] << 24 | e[t + 1] << 16 | e[t + 2] << 8 | e[t + 3]) >>> 0
                    }
                    t.exports = o(o)
                }
                    , {}],
                7: [function(t, i, n) {
                    function r(t) {
                        try {
                            var i = eval("require")(t);
                            if (i && (i.length || Object.keys(i).length))
                                return i
                        } catch (t2) {}
                        return null
                    }
                    i.exports = r
                }
                    , {}],
                8: [function(e, t, n) {
                    var o = (n = n).isAbsolute = function(e) {
                            return /^(?:\/|\w+:)/.test(e)
                        }
                        , r = n.normalize = function(e) {
                            var t = (e = e.replace(/\\/g, "/").replace(/\/{2,}/g, "/")).split("/")
                                , n = o(e);
                            e = "";
                            n && (e = t.shift() + "/");
                            for (var r = 0; r < t.length; )
                                ".." === t[r] ? 0 < r && ".." !== t[r - 1] ? t.splice(--r, 2) : n ? t.splice(r, 1) : ++r : "." === t[r] ? t.splice(r, 1) : ++r;
                            return e + t.join("/")
                        }
                    ;
                    n.resolve = function(e, t, n) {
                        return n || (t = r(t)),
                            !o(t) && (e = (e = n ? e : r(e)).replace(/(?:\/|^)[^/]+$/, "")).length ? r(e + "/" + t) : t
                    }
                }
                    , {}],
                9: [function(e, t, n) {
                    t.exports = function(e, t, n) {
                        var o = n || 8192
                            , r = o >>> 1
                            , i = null
                            , s = o;
                        return function(n) {
                            return n < 1 || r < n ? e(n) : (o < s + n && (i = e(o),
                                s = 0),
                                n = t.call(i, s, s += n),
                            7 & s && (s = 1 + (7 | s)),
                                n)
                        }
                    }
                }
                    , {}],
                10: [function(e, t, n) {
                    n.length = function(e) {
                        for (var t, n = 0, o = 0; o < e.length; ++o)
                            (t = e.charCodeAt(o)) < 128 ? n += 1 : t < 2048 ? n += 2 : 55296 == (64512 & t) && 56320 == (64512 & e.charCodeAt(o + 1)) ? (++o,
                                n += 4) : n += 3;
                        return n
                    }
                        ,
                        n.read = function(e, t, n) {
                            if (n - t < 1)
                                return "";
                            for (var o, r = null, i = [], s = 0; t < n; )
                                (o = e[t++]) < 128 ? i[s++] = o : 191 < o && o < 224 ? i[s++] = (31 & o) << 6 | 63 & e[t++] : 239 < o && o < 365 ? (o = ((7 & o) << 18 | (63 & e[t++]) << 12 | (63 & e[t++]) << 6 | 63 & e[t++]) - 65536,
                                    i[s++] = 55296 + (o >> 10),
                                    i[s++] = 56320 + (1023 & o)) : i[s++] = (15 & o) << 12 | (63 & e[t++]) << 6 | 63 & e[t++],
                                8191 < s && ((r = r || []).push(String.fromCharCode.apply(String, i)),
                                    s = 0);
                            return r ? (s && r.push(String.fromCharCode.apply(String, i.slice(0, s))),
                                r.join("")) : String.fromCharCode.apply(String, i.slice(0, s))
                        }
                        ,
                        n.write = function(e, t, n) {
                            for (var o, r, i = n, s = 0; s < e.length; ++s)
                                (o = e.charCodeAt(s)) < 128 ? t[n++] = o : (o < 2048 ? t[n++] = o >> 6 | 192 : (55296 == (64512 & o) && 56320 == (64512 & (r = e.charCodeAt(s + 1))) ? (++s,
                                    t[n++] = (o = 65536 + ((1023 & o) << 10) + (1023 & r)) >> 18 | 240,
                                    t[n++] = o >> 12 & 63 | 128) : t[n++] = o >> 12 | 224,
                                    t[n++] = o >> 6 & 63 | 128),
                                    t[n++] = 63 & o | 128);
                            return n - i
                        }
                }
                    , {}],
                11: [function(e, t, n) {
                    var o = e(14)
                        , r = e(33);
                    function i(e, t, n, r) {
                        if (t.resolvedType)
                            if (t.resolvedType instanceof o) {
                                e("switch(d%s){", r);
                                for (var i = t.resolvedType.values, s = Object.keys(i), a = 0; a < s.length; ++a)
                                    t.repeated && i[s[a]] === t.typeDefault && e("default:"),
                                        e("case%j:", s[a])("case %i:", i[s[a]])("m%s=%j", r, i[s[a]])("break");
                                e("}")
                            } else
                                e('if(typeof d%s!=="object")', r)("throw TypeError(%j)", t.fullName + ": object expected")("m%s=types[%i].fromObject(d%s)", r, n, r);
                        else {
                            var c = !1;
                            switch (t.type) {
                                case "double":
                                case "float":
                                    e("m%s=Number(d%s)", r, r);
                                    break;
                                case "uint32":
                                case "fixed32":
                                    e("m%s=d%s>>>0", r, r);
                                    break;
                                case "int32":
                                case "sint32":
                                case "sfixed32":
                                    e("m%s=d%s|0", r, r);
                                    break;
                                case "uint64":
                                    c = !0;
                                case "int64":
                                case "sint64":
                                case "fixed64":
                                case "sfixed64":
                                    e("if(util.Long)")("(m%s=util.Long.fromValue(d%s)).unsigned=%j", r, r, c)('else if(typeof d%s==="string")', r)("m%s=parseInt(d%s,10)", r, r)('else if(typeof d%s==="number")', r)("m%s=d%s", r, r)('else if(typeof d%s==="object")', r)("m%s=new util.LongBits(d%s.low>>>0,d%s.high>>>0).toNumber(%s)", r, r, r, c ? "true" : "");
                                    break;
                                case "bytes":
                                    e('if(typeof d%s==="string")', r)("util.base64.decode(d%s,m%s=util.newBuffer(util.base64.length(d%s)),0)", r, r, r)("else if(d%s.length)", r)("m%s=d%s", r, r);
                                    break;
                                case "string":
                                    e("m%s=String(d%s)", r, r);
                                    break;
                                case "bool":
                                    e("m%s=Boolean(d%s)", r, r)
                            }
                        }
                        return e
                    }
                    function s(e, t, n, r) {
                        if (t.resolvedType)
                            t.resolvedType instanceof o ? e("d%s=o.enums===String?types[%i].values[m%s]:m%s", r, n, r, r) : e("d%s=types[%i].toObject(m%s,o)", r, n, r);
                        else {
                            var i = !1;
                            switch (t.type) {
                                case "double":
                                case "float":
                                    e("d%s=o.json&&!isFinite(m%s)?String(m%s):m%s", r, r, r, r);
                                    break;
                                case "uint64":
                                    i = !0;
                                case "int64":
                                case "sint64":
                                case "fixed64":
                                case "sfixed64":
                                    e('if(typeof m%s==
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福爱娃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值