DEV Community

wxfwxf911
wxfwxf911

Posted on

反爬不是玄学:我被 6 个平台毒打后,总结的一套破解方法论

做自动化、爬数据的人,最常问的一句话是:「为什么同一个脚本,在别人那儿能跑,到我这就不行?」

其实反爬不是玄学。它本质是平台在判断「你到底是不是人」,而识别手段翻来覆去就那几类。我把踩过的坑归成四类,每一类给一套破解套路。摸清楚这四类,市面上大部分站你都能啃下来。

第一类:前端框架拦截(React 系)——你以为改好了,它根本不认

典型症状:你 innerHTML 塞进去的内容,一提交就丢了,或者点按钮没反应。

知乎的编辑器底层是 Draft.js(React 富文本框架)。它内部维护着自己的 state,你直接改 DOM,React 完全不知道,下次渲染又给你盖回去。

破解套路:别直接改 DOM,把输入「喂」给框架。React 认合成事件,不认原生赋值。比如:

await page.click('.DraftEditor-root');
await page.keyboard.insertText(content);
Enter fullscreen mode Exit fullscreen mode

insertText() 会触发 React 的合成事件,Draft.js 这才认这笔输入。一句话:框架维护状态的场景,一律走事件,不走赋值。

第二类:DOM 隔离(Shadow DOM / 微前端)——querySelector 全是 null

典型症状:元素肉眼可见,但 document.querySelector() 一个都找不到。

微信视频号用了个叫 wujie 的微前端框架,页面全塞在 <wujie-app> 的 Shadow DOM 里。普通的 CSS 选择器全部失效,你会怀疑自己是不是打开了错误的页面。

破解套路:先穿透 shadowRoot,拿到真正的根节点,再往下找:

const shadowRoot = await page.evaluate(() =>
  document.querySelector('wujie-app').shadowRoot
);
Enter fullscreen mode Exit fullscreen mode

记住:选择器失效时,先检查是不是被 Shadow DOM 隔开了,别急着怀疑反爬。

第三类:WAF / 网关拦截——请求直接给你打回来

典型症状:整个页面都进不去,统一返回个 4xx,或者一直转圈。

思否上了 Safeline WAF,自动化请求统一回 HTTP 468。我试过 headless、headful、换 UA、加 stealth,全被 JS Challenge 卡在门外。

破解套路:先分清是「JS Challenge」还是「IP 封禁」——这俩解法完全不同。

  • JS Challenge:只能真浏览器 + human-like 慢速操作 + stealth 插件,让它觉得你是人。
  • IP 封禁:换代理,本地直连基本无解。

这类最考验判断力。硬刚不动的时候,别死磕,绕过或者人工兜底,效率反而更高。

第四类:复杂异步流程——你以为传完了,其实没有

典型症状:文件「上传成功」了,结果发布是空的。

B站视频上传是分片的,你等 input 事件触发没用——文件传上去之后,它还要在后台转码。得等到「重新上传」按钮出现,才算真正传完:

await page.waitForSelector('.upload-reencode-btn', { timeout: 300000 });
Enter fullscreen mode Exit fullscreen mode

破解套路永远用状态信号,不用固定 sleep。 固定 sleep 要么浪费时间,要么还没好就继续跑。等「完成」标志出现,才是真的完成。


这四类对应了四种反爬思路:前端事件拦截、DOM 隔离、WAF 拦截、复杂异步。做自动化的,几乎都会撞上其中一两个。核心其实就一句:反爬打的是「识别你是脚本」,你打的牌是「装得像人」——走事件、穿 DOM、真浏览器、等状态,这套组合拳能破大半。

如果你也被某个平台的反爬卡住,或者想找人代做数据采集、自动化脚本、多平台内容分发,欢迎私聊交流。我平时也接这类私活,有需求可以直接私信,或者到我闲鱼上看看。


Top comments (0)