Python爬虫入门:spiderdemo题解及详细思路(入门篇)

查看 49|回复 9
作者:mysticz   
声明
本文写于2025年10月16日,仅做技术学习交流。本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
一、前言
网站:https://www.spiderdemo.cn/
入门篇题解,有些朋友做题知其然而不知其所以然,因此我们拆开内容,看题目是怎么反爬的
二、简单题
1).T1 请求头检测挑战
第一题可以看到我们开启f12就会报检测到爬虫模式,访问被拒绝


1.png (256.68 KB, 下载次数: 2)
下载附件
2025-10-17 15:48 上传

其实此题检测很简单,我们只需要勾掉禁用缓存即可,然后保持headers头顺序即可用request


2.png (48.6 KB, 下载次数: 2)
下载附件
2025-10-17 15:48 上传

可以看到勾掉后就可以了,同理request的时候删掉no_cache即可
2).T8 字体反爬虫挑战
核心就是取GlyphID,然后数值减1即可。
for map_elem in root.findall('.//GlyphID'):
    code = map_elem.get('id')
    name = map_elem.get('name')
    if '.notdef' not in name:
        glyph_outlines[name] = int(code) - 1
3).T21 哈希值挑战
没有啥加密反爬手段啥的,核心函数如下
function geturldata(page) {
    t = [
        "/page/"+page+"/",
        page
    ]
    const n = parseInt(t[1])
        , s = "hash_challenge"
        , a = Date.now()
        , k = r(n, s, a);
    XRequestToken = k.hmac,
    XVerifyCode = k.md5;
    url = "/page/"+page+"/?challenge_type=hash_challenge"
    const c = url.includes("?") ? "&" : "?";
    url += `${c}sign=${k.sha256}&code=${k.sha3_256}&t=${a}`
    console.log(url)
    return {'token':XRequestToken,'code':XVerifyCode,'url':url}
}
4).T22 对称加密
没有啥加密反爬手段啥的,核心函数如下
function geturldata(page) {
    var url = "/page/"+page+"/?challenge_type=symmetry_challenge"
    var n, t, r;
    var o = ["/page/"+page+"/", page]
    var a = parseInt(o[1])
        , c = "symmetry_challenge"
        , s = Date.now()
        , i = "".concat(a, "_").concat(c, "_").concat(s);
        XAesToken = (n = i,
        t = CryptoJS.enc.Utf8.parse("1234567890123456"),
        r = CryptoJS.enc.Utf8.parse("abcdefghijklmnop"),
        CryptoJS.AES.encrypt(n, t, {
            iv: r,
            mode: CryptoJS.mode.CTR,
            padding: CryptoJS.pad.NoPadding
        }).toString()),
        XDesToken = l(i);
        var p = function (e) {
        var n = CryptoJS.enc.Utf8.parse("12345678901234567890123456789012")
            , t = CryptoJS.enc.Utf8.parse("abcdefghijklmnop");
        return CryptoJS.AES.encrypt(e, n, {
            iv: t,
            mode: CryptoJS.mode.OFB,
            padding: CryptoJS.pad.NoPadding
        }).toString()
    }(i)
        , f = l(i + "_param")
        , d = url.includes("?") ? "&" : "?";
    url += "".concat(d, "aes_sign=").concat(encodeURIComponent(p), "&des_sign=").concat(encodeURIComponent(f), "&t=").concat(s)
    return {'destoken':XDesToken,'aestoken':XAesToken,'url':url}
}
5).T11 第一代验证码1
没有啥加密反爬手段啥的,利用ddddocr即可。
这时候就有朋友问了,明明他用ddddocr识别不了,为啥你能识别。
核心思路就是切割图片,然后放大,即可
核心代码如下
crop_box = (53, 20, 95, 36)
cropped_img = img.crop(crop_box)
scale_factor = 2  
width, height = cropped_img.size
resized_img = cropped_img.resize((width * scale_factor, height * scale_factor), Image.LANCZOS)
resized_img.save("resized.png")
三、入门题
1).T4 WASM挑战
直接,调用wasm即可,但是题目要求是过hook。核心检测代码如下
知道他怎么检测了就能知道怎么hook
function recordBehavior(_0x57bedd, _0x1d62c8) {
  console["log"]("行为记录:", {
    "action": _0x57bedd,
    "data": _0x1d62c8,
    "timestamp": Date["now"]()
  });
}
function _ÿijjji() {
  try {
    if (console["table"]["toString"]() !== "function table() { [native code] }") {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (console["table"]["toString"]() !== Function["prototype"]["toString"]["call"](console["table"])) {
      location["href"] = "https://yuanshen.com/";
      document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
      return true;
    };
    if (console["clear"]["toString"]() !== "function clear() { [native code] }") {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (setInterval["toString"]() !== "function setInterval() { [native code] }") {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (setTimeout["toString"]() !== "function setTimeout() { [native code] }") {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (setInterval["toString"]() !== Function["prototype"]["toString"]["call"](setInterval)) {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (setTimeout["toString"]() !== Function["prototype"]["toString"]["call"](setTimeout)) {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (Date["now"]["toString"]() !== "function now() { [native code] }") {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            };
    if (performance["now"]["toString"]() !== "function now() { [native code] }") {
              location["href"] = "https://yuanshen.com/";
              document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
              return true;
            }
    if (console["log"]["toString"]() !== "function log() { [native code] }") {
      location["href"] = "https://yuanshen.com/";
      document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
      return true;
    }
    return false;
  } catch (_0x43ee34) {
    location["href"] = "https://yuanshen.com/";
    document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
    return true;
  }
}
function _ÿbgbad() {
  var _0x1d1aeb = performance["now"]();
  _ÿijjji();
  var _0x29fa91 = Array(1000)["fill"]()["map"](function (_0x31947b, _0x3b4860) {
            return {
              "id": _0x3b4860,
              "name": "test" + _0x3b4860,
              "value": Math["random"]()
            };
          });
  console["table"](_0x29fa91);
  console["clear"]();
  var _0x1a88d8 = performance["now"]();
  var _0x33304b = _0x1a88d8 - _0x1d1aeb;
  console["log"]("执行时间:", _0x33304b);
  if (_0x33304b > 10) {
    recordBehavior("debugger_detected", {
              "executionTime": _0x33304b,
              "timestamp": Date["now"]()
            });
    location["href"] = "https://yuanshen.com/";
    document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。";
  }
}
_ÿaedfa = setInterval(_ÿbgbad, 1000);
2).T5 柳暗花明又一墙
实体debugger直接不执行就行
检测代码如下
  const _fnStr_check = OoO0ooo0["toString"]();
  const _first50_check = "debugger;";
  if (!_first50_check["includes"]("deb")) {
    throw new Error("检测到反调试代码被修改");
  }
过掉检测核心代码也没啥,如下
function O0o0O0O0() {
  const config = {
    url: "/authentication/api/ob1_challenge/page",
    params: {
      float: "down",
      genre: "5000",
      device: "iphone",
      type: "one",
      brand: "paid",
    },
  };
  function encodeBase64(str) {
    const encoded = encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (_, hex) =>
      String.fromCharCode("0x" + hex)
    );
    return btoa(encoded);
  }
  function xorEncrypt(text, key) {
    key = key || buildCookie();
    const textArr = text.split("");
    for (let i = 0; i  v !== undefined)
    .sort()
    .join("");
  const base64Params = encodeBase64(params);
  const joined =
    base64Params +
    delimiter +
    config.url +
    delimiter +
    offset +
    delimiter +
    3;
  const randomKey = "xyz517cda96efgh" + Math.floor(Math.random() * 10);
  const encrypted = encodeBase64(xorEncrypt(joined, randomKey));
  const result = btoa(encrypted + Date.now());
  return result;
}
// console.log(O0o0O0O0());
3).T13 计算题验证码
没有啥加密反爬手段啥的,利用ddddocr即可。
核心思路跟上面一样就是切割图片,然后放大,即可
核心代码如下
crop_box = (53, 20, 95, 36)
cropped_img = img.crop(crop_box)
scale_factor = 2  
width, height = cropped_img.size
resized_img = cropped_img.resize((width * scale_factor, height * scale_factor), Image.LANCZOS)
resized_img.save("resized.png")
3).T23 非对称加密
核心检测代码如下
let debug_str = "debugger";
function debug() {
    if (setInterval["toString"]() !== "function setInterval() { [native code] }") return location["href"] = "https://yuanshen.com/", document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。", true;
    if (setInterval["toString"]() !== Function["prototype"]["toString"]["call"](setInterval)) return location["href"] = "https://yuanshen.com/", document["body"]["innerHTML"] = "检测到调试环境,页面已被保护。", true;
    Function(debug_str)["call"]();
    Function(debug_str)["apply"]();
    Function(debug_str)["bind"]()();
    Function(debug_str + ';' + Date["now"]());
    eval(debug_str + ';' + Date["now"]());
    Function["constructor"]("debugger")();
    (function () {
        return true;
    })["constructor"]("debugger")();
}
setInterval(debug, 500);
还有一个检测,总共两个
fetch(window.location.href).then(function(e) {
        return e.text()
    }).then(function(e) {
        var n = CryptoJS.SHA256(e).toString();
        "299e4d96f573e044dcfc6fb07052d1bd5821ff9acde1b7ac9fb54c832225023d" !== n && "4625c53d967b825be9f7780fe44ec9ea4ec8d0c3a8ea0bf284f2914a040c472e" !== n && (window.location.href = "https://yuanshen.com/")
    }).catch(function(e) {
        "HTML integrity check failed" === e.message || console.warn("HTML 完整性校验失败(网络错误):", e)
    })
加密代码如下,没啥混淆
function geturldata(page) {
       var n, t, r = [
            "/page/"+page+"/",
            page
        ];
       var url= '/page/'+page+'/?challenge_type=fsymmetry_challenge'
        if (r) {
            var c = parseInt(r[1])
              , a = new URLSearchParams(url.split("?")[1] || "").get("challenge_type") || "fsymmetry_challenge"
              , o = Date.now()
              , s = "".concat(c, "_").concat(a, "_").concat(o);
            XAuthKey= u(s),
            XSignature = (n = s,
            (t = new JSEncrypt).setPrivateKey("-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQC1vKwZUIv7pgpJUXXPpDlD4+VEon3a0ANOrNmqAESrcGfkmYzD\nCo2JeuYezhBGjBNjwVmSct/Y3BBOCRGT2bvtCJGdS12RMvHbFcdbwS/Adh48+rhL\niMNYXLm+7pI3e2k6TlScxKa7EeeZpVtew/Cv5z6ol0llNPp6BdqAlOa8DwIDAQAB\nAoGAS0GaWI9AsFAFEXBgoz/jkMf14DKTgEFEJVexeNLMnNuawhCNuBSOIMCaO2Zk\nWfpWaygdUeYs6M3UGKRruXhf92g/BRmJK5FzR0kWW4qw6WwlYob3TPc3c9MFOjmp\nVtWQ0VSeEPrnBNoQRccKl0dGBnToHGuV+KEuKx8oWZc/JM0CQQDH/cvlx0BKz2zN\n6PM8FidAvc+Wgon8YW81KJgC7iJIrK9FOpctOE3L1pdF7guOQNVGRqN4HCIgLfHE\ncqxWJKJtAkEA6KIkwHe/Q23uWH5GP8DHtVkLVfohTumYkpb0rk05EYQ0dsWSNzWH\nXDH/kD6ayNq+fscnS8g+59onzvfhJ0bq6wJBAKNFkDEHenWY4js481sauvEgBVnb\nOMvSv/emLHQ39cVfNbhPHRzN2rWPe/CbZtO8GmJFSS/FyBZ9a+P1uryZLAECQAaw\nApZ12s25b0yj9KkIhbU05hqGokZ+eKBeLpKELcvPHSL88wMbStTfqxUed5ymjStf\n1kVbcFOB9fsBLTvP0hkCQFCON0l1VjFli+vqfN0lypgIqCf85V6FZFN19creGCCd\n76pX/X2FIBbUSDN1z48SM5I/RKdCkTx7FY+509q2Mek=\n-----END RSA PRIVATE KEY-----"),
            t.sign(n, CryptoJS.SHA256, "sha256") || "");
            var i = function(e) {
                return CryptoJS.HmacSHA256(e, "dsa_secret_key_2025").toString()
            }(s)
              , l = u(s + "_param")
              , f = url.includes("?") ? "&" : "?";
            url += "".concat(f, "data=").concat(encodeURIComponent(l), "&verify=").concat(i, "&t=").concat(o)
            // console.log(url)
    return {'XAuthKey':XAuthKey,'XSignature':XSignature,'url':url}
}}
中等及后面还没看,有时间再看吧
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号联系作者立即删除!

已被, 检测到

yinuo2012   

学习了,谢谢!
zyj2025   

感谢分享
aaron505   

学习到了
leestrong   

好文章,顶上去
longshao2025   

Python爬虫入门:spiderdemo题解及详细思路(入门篇 什么价位吗想学
bfbzfbz   

奈何自己看不懂
m_h   

  吾爱破解  也有防火墙 爬猛了 也不行。
Lyss07   

内容很细,写的太好了!
a2908   

好东西 分享给好基友看看[让我看看]
您需要登录后才可以回帖 登录 | 立即注册

返回顶部