母亲节:我给老妈写了一个自动抓取养生谣言并预警的脚本

给老妈写脚本这事儿,得从她上周转发给我的那条“喝绿豆汤能根治高血压”说起。我盯着那个花里胡哨的公众号页面,血压先上来了。跟她解释一百遍,不如直接让机器把源头给她掐了。所以这个脚本的核心不是爬,是“潜伏”和“识别”,得在那些养生号发现我之前,把新文章都薅下来。

反反爬这块,这次玩得比较深。早几年用个User-Agent轮换、搞点IP代理池就觉得自己是黑客了,现在这些网站,尤其是流量大的养生号,防御体系跟铁桶一样。他们不光看你的HTTP头,还跑JavaScript来收集浏览器指纹。比如你的Canvas渲染指纹、WebGL指纹、字体列表,甚至你屏幕的颜色深度和分辨率排列组合,都能生成一个唯一ID。你用一个固定的Selenium驱动去跑,头两次可能还行,第三次绝对给你封得死死的。

所以我这次的核心武器是“动态指纹浏览器”的底层逻辑,但不是用现成的商业软件,那太笨重。我用的是Puppeteer-extra加上stealth-plugin打底,这能模拟一个近乎真实的Chrome环境。但关键在“动态”二字。我写了个指纹池,里面预置了二十套不同的硬件配置信息——从2015年的MacBook Air到最新的Win11游戏本,显卡型号、CPU核心数、内存大小都对应上。每次启动脚本,随机选一套“穿上”。光这样还不够,每次访问的浏览器窗口大小、视口尺寸都要在合理范围内随机波动,不能是固定的1024×768那种傻子数字。

最麻烦的是行为模拟。你不能像传统爬虫那样,抓到链接就拼命发请求。得模仿真人阅读:随机滚动页面,停顿时间要符合对数正态分布,偶尔还要模拟鼠标在某个图片上悬停。我用了一个贝叶斯优化算法来调整这些行为参数的权重,目标函数就是“在单位时间内成功抓取的文章数最大化,同时触发验证码的概率最小化”。调试这个过程花了整整两个通宵,不断地看日志,看是在哪个环节被识别出来的。

这种对抗带来一种奇怪的孤独豪迈感。深夜,我一个人对着四块屏幕,上面滚动着密密麻麻的日志。一个脚本实例在华东的服务器上伪装成家庭主妇的iPad,慢慢滑动页面;另一个在华南的VPS上扮作退休教师的台式机,正在解析文章正文里的关键词。我像是一个指挥官,但手下不是士兵,是一堆没有生命却承载着我意志的代码字符串。它们不知疲倦,不会抱怨,只要我的策略正确,就能持续地从信息洪流中打捞出我需要的碎片。老妈觉得我给她装了个“防火墙”,其实我在背后运营着一支沉默的、不断进化以适应环境的数字特工小队。

脚本跑起来以后,预警逻辑反而简单。我用了一个轻量级的本地BERT模型做文本分类,训练数据是我自己手动标注的八百多条“养生谣言”和“正常科普”。模型不大,但准确率够用,能识别出“绝对化用词”(根治、百分百)、“虚假权威”(某国际组织未公开的秘密)和“恐吓营销”(再不XXX就晚了)这些典型模式。一旦命中,脚本会通过微信的测试号API,给老妈的微信发一条结构化的消息:标题、风险点、还有我预设好的科普辟谣链接。她一开始还嫌烦,后来发现给她推送的真是她常看的那些号里的新文章,慢慢就信了。

这大概就是2020年的我吧,困在团队管理和项目交付的无尽扯皮里,身心俱疲。只有在深夜面对这些具体的技术难题时——如何绕过Cloudflare的5秒盾,如何让WebDriver产生的流量更像真人——才能感觉到一种确切的、近乎原始的掌控感。给老妈写脚本,表面是解决她的问题,其实是我在给自己找一个还能安静写代码、还能“解决一个问题”的借口。这支一个人的军队,守护的或许不只是老妈的朋友圈,还有我自己那份对技术最直接的、还没被商业和人际耗尽的热情。

© 版权声明
THE END
喜欢就支持一下吧
点赞68 分享