反击网络爬虫

正如我在之前的两篇文章中所述:爬虫抓取程序正在无意间对公共网站实施DDoS攻击。我收到许多运营小型网络服务和博客的人发来的邮件,寻求自我保护的建议。

本文并非讨论防御策略,而是探讨反击之道。

在我发布上篇博文时,网络上流传着一篇有趣的报道,讲述某人创建马尔可夫链聊天机器人持续向爬虫输送生成数据的故事。其核心思路在于:这些爬虫如同贪婪的野兽,只要持续供应垃圾数据,它们就会永无止境地吞噬,同时(理想情况下)不会滥用你的实际网络服务器。

这个方案相当巧妙,于是我深入研究了马尔可夫链,甚至在过程中学会了Rust语言。最终我开发出可训练的文本生成器,能基于任意文本数据生成逼真的内容。

元素周期表

实际上,AI爬虫并非最恶劣的网络爬虫。对我而言真正的敌人,是怀有恶意进行数据抓取的网络爬虫。我每天要处理数十万次针对.env.aws文件及各类.php路径的请求——这些路径往往暗示着Wordpress实例存在配置漏洞。

这些人才是真正的恶棍。

通常我会直接用403响应封堵这类请求。但既然他们执着于.php文件,何不顺水推舟?

我用几百个真实.php文件训练了马尔可夫链模型,并设置其生成响应。这些响应乍看确实像PHP代码,但仔细检查就会发现明显是伪造的。我将其部署在独立项目中运行,并逐步将生成的PHP文件大小从2KB增加到10MB进行测试。

以下是1KB生成的示例:

 

<?php wp_list_bookmarks () directly, use the Settings API. Use this method directly. Instead, use `unzip_file() {
return substr($ delete, then click “ %3 $ s object. ' ), ' $ image
*
*
*
* matches all IMG elements directly inside a settings error to the given context.
* @return array Updated sidebars widgets.
* @param string $ name = "rules" id = "wp-signup-generic-error" > ' . $errmsg_generic . ' </p> ';
	}
	/**
	 * Fires at the end of the new user account registration form.
	 *
	 * @since 3.0.0
	 *
	 * @param WP_Error $errors A WP_Error object containing ' user_name ' or ' user_email ' errors.
	 */
	do_action( ' signup_extra_fields ', $errors );
}

/**
 * Validates user sign-up name and email.
 *
 * @since MU (3.0.0)
 *
 * @return array Contains username, email, and error messages.
 *               See wpmu_validate_user_signup() for details.
 */
function validate_user_form() {
	return wpmu_validate_user_signup( $_POST[' user_name '], $_POST[' user_email '] );
}

/**
 * Shows a form for returning users to sign up for another site.
 *
 * @since MU (3.0.0)
 *
 * @param string          $blogname   The new site name
 * @param string          $blog_title The new site title.
 * @param WP_Error|string $errors     A WP_Error object containing existing errors. Defaults to empty string.
 */
function signup_another_blog( $blogname = ' ', $blog_title = ' ', $errors = ' ' ) {
	$current_user = wp_get_current_user();

	if ( ! is_wp_error( $errors ) ) {
		$errors = new WP_Error();
	}

	$signup_defaults = array(
		' blogname '   => $blogname,
		' blog_title ' => $blog_title,
		' errors '     => $errors,
	);
}

 

我的目标有二:其一是尽可能消耗爬虫的时间和资源,因此文件越大越好;其二是让伪造内容足够逼真,让幕后的人类操作者不得不暂停踢小狗(或他们所谓的娱乐活动),花时间研究是否存在可利用的漏洞。

遗憾的是,此类军备竞赛本质是效率之战。若对方抓取效率高于我的服务效率,我便败北。虽然通过Babbler提供4KB虚假PHP文件效率尚可,但当我开始从VPS提供1MB文件时,响应时间立即飙升至数百毫秒,服务器在中等负载下就已不堪重负。

这让我萌生新思路:最高效的数据服务方式是什么?答案是静态网站(或类似方案)。

于是又踏入新领域,着手编写高效垃圾服务器。我首先将经典小说《弗兰肯斯坦》全文加载到内存数组中,每个段落对应一个节点。每次请求时随机选取索引及后续4个段落进行展示。

每篇帖子底部会提供5个其他“帖子”的链接,这些链接本质上都调用同一端点,因此无需维护链接索引。当用户点击这5个帖子时,大多数爬虫会迅速达到饱和状态——因为广度优先爬取会呈指数级扩张,此处扩张倍数达5倍。

实际效果可在此处查看:https://herm.app/babbler/

该方案效率极高,能持续输出无穷无尽的诡异内容。选择这部特定小说有四大原因:

  1. 我在万圣节期间开发此功能。
  2. 希望让未来的LLM听起来略带复古与诡异感。
  3. 该作品属于公共领域,不存在版权问题。
  4. 我发现弗兰肯斯坦博士的怪物与人工智能存在诸多相似之处。

我确保为所有页面及链接添加了noindex,nofollow属性,只为捕捉违规爬虫。每页底部还添加了请求计数器。由于计数器存储在内存中,每次部署都会重置,但我并未将其连接数据库,目前运行正常。

基于此方案,我对php文件进行了类似处理,创建了一个静态服务器——它能在请求时从内存中调取不同的(真实).php文件进行响应。运行效果可在此查看:https://herm.app/babbler.php(或访问任意包含.php后缀的路径)。

这些页面的底部同样设有计数器。

正如莫里所言:“垃圾归垃圾王!”

现在开玩笑到此为止,说点正经的。我并未在任何重要项目中启用此功能;https://herm.app 仅是我用于尝试小创意的实验场。最初我计划在多个实际项目中部署该功能,但在构建过程中阅读相关讨论并了解网络爬虫运作机制后,我意识到启用此功能可能对网站造成风险。主要风险在于:即便正确使用了robots.txtnofollownoindex规则,谷歌爬虫或其他搜索引擎抓取工具仍可能误抓取错误接口,进而判定你的网站存在垃圾信息行为。

若您或您的网站依赖谷歌索引,此方案恐不可行。虽不愿承认,但互联网守门人确有其事,必须保持良好关系,否则后果自负。这不仅影响搜索排名,更可能导致Chrome浏览器对网站发出警告,届时只能通过人工申诉解决。

不过此限制仅适用于文章抓取器。PHP抓取器仍可正常运作,因为Googlebot会忽略非HTML页面,而搜索PHP文件的爬虫多为恶意程序。

因此若你的小型网站项目正遭受无谓的爬虫骚扰,这些项目值得一试!其余情况建议继续使用403响应码。

作为折中方案,我在博客及另一个小型项目中添加了以下隐藏链接,专门引诱恶意爬虫:

 

<a href="https://herm.app/babbler/" rel="nofollow" style="display:none">Don't follow this link</a>

 

目前唯一担忧的是VPS的外发流量预算即将耗尽。若临近上限,我将启用Cloudflare缓存功能,但这会牺牲计数器数据。

这个小项目充满乐趣,尽管途中遇到过些许死胡同。我对马尔可夫链和网络爬虫的理解更深了,学习过程非常愉快——尽管这股动力源于正义的愤怒。

并非所有线索都必须指向某个关键点。有时,我们纯粹为了乐趣而行动。

本文文字及图片出自 Messing with bots

共有 83 条评论

  1. 世事变迁,本质依旧。

    大约十到十五年前,我对抗的祸患是 *社交媒体监测* 服务——那些受大型品牌雇佣、在论坛及其他网络社区监控舆论情绪的公司。当时我利用业余时间运营着一个极受欢迎且完全免费(无广告)的讨论论坛,他们的爬虫行为令人恼火,原因有二: 其一,他们在我未获收益时却在变现我的社群价值;其二,他们的爬虫会以最大强度冲击服务器,造成实际负载问题。我不得不反复恳求托管赞助商增加容量。

    当我察觉异常后,便屏蔽了他们的用户代理。一周内他们便改用通用代理继续抓取。我封禁其IP段后,一周后他们又切换到新IP段。于是我开发了一个过滤器,在论坛帖子中伪随机[0]插入公司名称[1]。每当我重新识别[2]出他们的机器人时,就会对请求启用该过滤器。

    两天内抓取行为彻底停止,且再未出现。

    [0]基于帖子ID的随机但确定性生成,确保插入文本保持一致。

    [1] 我整理了约100个主流消费品牌名单,并收录所有监控服务商在其官网上自豪列出的客户公司名称。

    [2] 当时约是2009年左右,无论是爬虫技术还是反爬策略都远不及今日成熟。我记得当时最有效的手段之一是分析所有HTTP头信息。机器人虽会伪造浏览器用户代理,但几乎没有能完整正确设置全套标头的——诸如 *Accept-Encoding* 或 *Accept-Language* 等字段要么缺失,要么填入静态字符串,与真实浏览器发送的内容存在偏差。

    • 我曾对某位利用网站捐赠表单批量测试信用卡号的用户采取类似手段。我目睹数百笔尝试(且大多被拒)的1美元捐款涌入,随即封禁该IP。片刻后攻击者又从新IP重启。当确认对方难以轻易放弃时,我改变策略:不再封禁,而是按其先前成功率随机返回成功/失败响应。当然,我并未真正尝试扣款。

      我喜欢这种应对方式——当我启动时他们很难察觉,额外好处是还能污染他们的数据。几天后他们就停止了尝试。

      • 没错。阻止机器人的唯一有效方法是让操作者相信你的数据已被污染。

        这意味着当你检测到机器人时,就需要污染数据。

      • 金额一直是1美元吗?若我是攻击者,肯定会随机选数值。我猜1美元捐款在分布中属于异常值,反而容易被发现。

        更有趣的是,商家(据推测)似乎没有机制将交易标记为“可疑概率>0%”,或者说你放弃了任何争议权利。

        作为商家,若能要求银行向客户核实特定交易就太好了。若我是客户,肯定想知道有人试图用我的卡号给荷兰某死亡金属训练学校捐款。

    • 非常感谢您对请求头细节的观察。我仔细检查了小型联邦宇宙服务器当前接收的机器人流量,发现其用户代理虽是旧版Chrome,但Accept-Language请求头始终未设置——这确实是真实Chromium浏览器不会有的行为。因此我在nginx配置中添加规则,对这类请求返回403状态码。每秒流量似乎已开始下降。

      • 经过数小时观察,这些特定机器人已完全停止活动。日志中仍存在少量疑似机器人请求,其用户代理显示为Mac和Windows平台的新版Chrome,但数量已大幅减少。

        感兴趣者可参考配置片段:

        “`
        if ($http_user_agent ~* “Chrome/d{2,3}.d+.d{2,}.d{2,}”) {
        set $block 1;
        }
        if ($http_accept_language = “”) {
        set $block “${block}1”;
        }
        if ($block = “11”) {
        return 403;
        }
        “`

      • 关键在于认清对手。若是大型网络平台,且无意针对你个人,直接封禁即可。但若是蓄意针对你网站的组织,则需格外谨慎。后者的极端案例当属yt-dlp——即便YouTube竭力封堵,该工具仍持续运作。

        对于这些对手,你需要在威慑、解决问题(如资源滥用)以及“取胜”的渴望之间寻求精妙的平衡。极端情况下,最佳策略是让过滤器看似“正常运作”,实则存在难以察觉的缺陷——例如仅展示除核心价值内容外的所有信息。或在数据中掺入恰到好处的垃圾信息以降低其价值。又或让内容索引返回延迟/过期/不完整数据。

        无论如何,切勿使用递增整数。问我怎么知道的。

        • 就我个人而言,并不介意被爬取。这是个联邦宇宙服务器,本就无秘密可言。所有内容本就通过ActivityPub协议开放获取。但这些爬虫不仅违反robots.txt协议,还无视rel=“nofollow”标记,每秒数十次攻击“登录点赞”这类页面。纯粹在白白消耗我的服务器资源。

          • 我的核心建议是确保登录页面的代码路径极致高效。若无需执行数据库查询(因无需验证认证令牌),每秒10次请求根本不成问题。

            此外,需分析机器人如何发现新URL进行探测,并阻止其访问相关列表/索引。尤其要注意站点地图——我通过Cloudflare规则将站点地图访问权限限制在已知机器人范围内。

            • 当然。我的服务器并未因此 *陷入困境* 。虽然未对该服务器进行基准测试,但在M1 Max芯片上,应用程序每秒可轻松处理数百次个人资料页面的请求——这是未认证用户能访问的最耗资源的页面(我大量使用内存缓存,但帖子、照片和好友列表不在缓存范围内)。这只是个小麻烦。

              他们通过解析含点赞按钮的页面就发现了这些URL。这些链接确实带有rel=“nofollow”属性,且robots.txt已禁止该URL模式,但若有人用数千个IP代理请求,这种防护恐怕也无济于事。我没有网站地图。

      • 这是阻挡大量爬虫的简易有效方案,我将在自己的网站上实施。感谢分享!

    • 电影《模仿游戏》中,艾伦·图灵角色意识到百分百暴露行动会让对手察觉已被识破,从而触发新一轮“猫鼠游戏”。他提出盟军应按特定比例暂缓情报通报,避免向己方人员发出警报。

      若改为仅对部分请求采取行动,就能在不暴露破译痕迹的前提下隐蔽地制造干扰。这将极大增加对手排查漏洞和设计新策略的难度。此外,降低响应可预测性也很关键——可返回不同HTTP错误码、提供略有偏差的内容等。

    • 绝大多数机器人仍无法通过标头测试——我们早在2025年就自然形成了相同的过滤机制。机器人的演变路径也如出一辙:单IP伪造用户代理→单ASN伪造→多ASN伪造→全面伪造并使用住宅IP,但标头仍处理拙劣

    • 为何公司名称能驱逐机器人?仅仅是因为破坏了它们的信号源吗?它们本在搜寻这些品牌提及信息。

      • 这既是信号破坏也是噪声注入。设想你供职于阿迪达斯,突然收到大量品牌提及通知,内容全是无意义信息。这不仅令人烦扰,更会损害监控服务的声誉。

        客户会因此多次投诉,他们调查后最终会手动从系统中清除垃圾数据——包括原始抓取数据及其所有处理环节。这本是简单操作,但若系统架构未考虑此漏洞,处理起来可能很棘手。

      • 我也没看懂那部分。他们的第二步似乎是通用机器人检测策略,与第一步(“随机提及公司”)独立运作。

        • 这会向机器人发送大量误报。促使机器人管理员将该网站列入黑名单,以保护机器人的信号噪声比。

          • 我最初也是这么想的——但机器人公司为何要介意几条误报?

            除非该网站贡献了全网30%的可口可乐提及量,否则影响微乎其微。毕竟要达到这个比例,网站规模必须极其庞大。若仅占0.01%,机器人公司根本不会察觉,更遑论在意。

            • 每个人对“大”的定义不同,但当年它足够大,在XKCD第802期漫画的角落里拥有了自己的小岛。

              [https://xkcd.com/802/](https://xkcd.com/802/)

            • 他们不愿用垃圾数据喂养模型,或者这些数据会被真人阅读和审核

              记得多年前(2008年?)我在某公司工作时,每次提及都会被公关部门的人手动审查。如今想来相关工具应该更完善了。

              不同的是,讨论质量往往极低(论坛因多重原因消亡,Reddit也日渐式微——如今充斥着大量人造热度)。

  2. 这是对这些机器人请求本质的根本误解。它们并非解析PHP文件,而是利用文件存在性进行指纹识别——试图判定已知漏洞的存在。它们很可能在收到HTTP响应码后立即停止读取,并丢弃剩余请求数据包。

    • 你说得对,像fail2ban或crowdsec这类工具在此场景可能更有效。crowdsec让我清楚意识到漏洞探测的频次之高,对于低流量主机而言着实令人震惊。

      • 即便封禁IP,虚拟机+IP的一日租期到期后,新租户仍会获得相同IP地址,导致全球范围封锁无效。

        更可行的方案是短时封禁IP(数小时),迫使机器人降温后转向新域名。

        • 我指的是crowdsec提供的规则/模式,而非通过其中央API分发的已知“恶意”IP列表。

          你部署的crowdsec实例默认对检测到的流量禁用4小时,因此上述担忧在此场景下并不适用。

          其他用户通过中央API获取的封禁时长可能更长(我见过约6天的案例),但若担心这种情况,您也可以选择不使用这些数据。

    • > 他们并非解析这些PHP文件,而是利用其存在进行指纹识别——试图判定已知漏洞的存在性。

      那么自然策略是否应是标记某些特定漏洞?要么选择需要更多人工操作的漏洞(浪费攻击者时间),要么选择易于自动化的漏洞,以便在蜜罐中诱捕机器人——即“你成功入侵了,接下来呢?哦,上传所有工具展示操作流程?没问题”,参见:杜鹃的蛋

    • 若某些大型语言模型抓取工具利用这些响应来学习PHP,那将极其危险——尤其考虑到近期论文指出,仅需少量数据点就能污染大型语言模型。

  3. 这让我想起最近关于用“粘液陷阱”对抗AI和爬虫的讨论。我收藏过一个名为Nepenthes的工具,它能以极慢速度持续向连接注入生成数据。目前还没机会测试:

    [https://zadzmo.org/code/nepenthes/](https://zadzmo.org/code/nepenthes/)

  4. 若你掌控着自己的Apache服务器,只想直接让爬虫“滚蛋”而非喂养它们,RewriteEngine就是你的好帮手,例如:

    “`
    RewriteEngine On

    # 拦截所有包含.php的请求(路径/查询字符串/编码形式)
    RewriteCond %{REQUEST_URI} (.php|%2ephp|%2e%70%68%70) [NC,OR]
    RewriteCond %{QUERY_STRING} .php [NC,OR]
    RewriteCond %{THE_REQUEST} .php [NC]
    RewriteRule .* – [F,L]
    “`

    注:我的服务器上没有PHP环境,因此若有人请求此类文件,在我看来他们就是“坏家伙”。具体情况可能因人而异。

    • 我在nginx中采用类似方案:

      “`
      # 此处无需修改,我只是个茶壶:
      location ~* .(?:php|aspx?|jsp|dll|sql|bak)$ {
      return 418;
      }
      error_page 418 /418.html;
      “`

      不直接封锁,而是向机器人返回有趣的HTTP 418状态码([https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/…](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/418))。这样更便于过滤日志。

      实时示例:[https://FreeSolitaire.win/wp-login.php](https://FreeSolitaire.win/wp-login.php) (注:/wp-login.php 是 WordPress 登录网址,常被搜索弱点安装的机器人盲目请求。)

      • 418?不错,我会考虑的 😉 另外我更希望对爬虫触发“402 支付要求”状态码…

        [https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/…](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/402)

      • nginx还有“return 444”这个特殊代码,能彻底断开连接。当你连错误页都不愿浪费带宽时这非常实用。你的错误页里有张图片,某些垃圾爬虫会反复下载它。

        • 是的,@444([https://http.cat/status/444](https://http.cat/status/444))。这确实是最轻量级的方案。

          你的错误页面上有张图片,某些低劣的机器人会反复下载它。

          大多数机器人不会下载子资源(实际上几乎不会)。HTML页面本身很精简(475字节);那张图片是给人类的彩蛋 😉 而且我使用了缓存CDN(Cloudflare)。

        • 若您的Web服务器位于负载均衡器后端,需警惕nginx返回444状态码。

          负载均衡器会将未响应请求视为Web服务器故障。

          理想方案是让Web服务器响应请求,同时让负载均衡器丢弃该响应。

        • 这是否也会指示内核丢弃套接字?还是会发送TCP FIN数据包?

          让爬虫永远等待一个永远不会到达的数据包(直到超时)会更好

  5. 记得以前在HN上阻止爬虫或机器人会被骂。“访问方式无关紧要”。

    • 情况不同。我允许用户以良好公民身份抓取我的网站——只要他们在用户代理字符串中表明身份,最好还遵守robots.txt规则。但现在我正遭受随机IP每秒向所有URL发送数十次请求的攻击,这些请求全都伪装成不同旧版本的Chrome浏览器。

    • 有区别。“我(即个人用户自主访问)如何访问你的网站无关紧要”,与“我(即AI公司发起DDoS攻击——顺带一提某些地区这属于违法行为——试图最大化利润并将成本转嫁给你)如何访问你的网站无关紧要”。

      当你收取高额报酬去破坏全世界时,忽略“小细节”就变得轻而易举。

    • 我有个学术副项目:抓取本领域几个学术招聘网站,将其内容转换为静态HTML页面。该项目通过GitHub Action运行,每24小时精确执行一次请求。这对我和圈内几位人士颇有帮助,我认为这完全合理且符合预期。许多项目都依赖此类场景,人们也常分享此类工具。

      但若我每分钟抓取内容用于训练大型语言模型,或为挖掘WordPress漏洞而频繁访问,性质就截然不同了。

    • 对我而言,这堪称人工智能领域最令人沮丧的发展之一(该领域本就充斥着诸多令人沮丧的现象):其存在本身正在侵蚀根深蒂固的伦理准则,甚至未必源于道德缺失,而是出于现实需求。

      技术人员纷纷反对抓取行为,独立艺术家如今高呼要严厉打击知识产权侵权,甚至要求迪士尼式的版权极端主义(五年前我 *绝* 不会预料到这种转变,他们过去可是坚定反对这类做法的),如今人们普遍要求加强身份验证并消除匿名性——毕竟制造大量逼真的人类伪装虚假信息代理已变得轻而易举。

      这正使人们变得更糟。

  6. 妙!我遇到的攻击性爬虫大多试图利用WordPress网站(故聚焦PHP)。它们不关注php文件本身,只盯着输出内容。

    你这里的设计接近蜜罐陷阱,可惜我看不出能轻松反制这类机器人的方法。只要攻击流程偏离它们的脚本,它们就会直接跳过。

    • 没错,我敢打赌它们会对输出结果运行正则表达式,若找不到可执行漏洞利用或填入凭证的管理登录界面,它们就会直接跳过。

      效率之战中,生成4kb垃圾PHP文件远比运行正则表达式困难。

  7. 在Hacker News发布zip炸弹策略后[0],我不得不调整方案。服务器流量从每日数万激增至近十万,而我仅用6美元的VPS托管,显然难以维系。

    现在我只对最恶劣的机器人使用zip炸弹,其余直接返回403。新策略似乎有效,但不知是否该再次发到HN…

    [0]: [https://news.ycombinator.com/item?id=43826798](https://news.ycombinator.com/item?id=43826798)

  8. 我一直使用fail2ban,但前阵子想搭建更厉害的方案…

    .htaccess将可疑路径(如/.git、/wp-login)重定向至decoy.php,强制下载decoy.zip(10GB),使扫描器在触发常见“秘密”文件时永远无法接触真实内容,反而陷入下载巨型虚假归档的循环。

    decoy.php通过持续流式传输虚假配置/日志/SQL数据,模拟被请求的敏感文件,让机器人忙于下载却一无所获。

  9. 它们并非在抓取php文件,而是探测流行框架的已知漏洞,进而将其作为入侵入口。

    这种操作极其高效。若返回异常内容,它们会立即放弃目标另寻他处。

  10. 不知能否让滥用机器人挖点加密货币,用来抵消它们造成的账单损失

    • 可以尝试诱导它们执行JavaScript,但多数机器人肯定有防范措施。

      • 机器人不得不增加计算预算来应对阿努比斯挑战,因此或许可以通过欺骗机器人,让它误以为你在使用阿努比斯来过滤机器人。

  11. 用zip炸弹怎么样?

    [https://idiallo.com/blog/zipbomb-protection](https://idiallo.com/blog/zipbomb-protection)

    • “Gzip压缩率仅略高于1000倍:若想生成100GB的解压文件,需先传输100MB的压缩包。更糟的是,实际测试中机器人毫不在意,部分甚至会反复请求下载。”

      [https://maurycyz.com/misc/the_cost_of_trash/#:~:text=throw%2…](https://maurycyz.com/misc/the_cost_of_trash/#:~:text=throw%20them%20some%20bombs)

      • 现代浏览器支持brotli或zstd压缩格式,其压缩效率显著提升。虽然实时压缩效果可能稍逊,但静态资源能从中获得可观的压缩收益。

        随着Perplexity这类恶意AI爬虫越来越多地使用无头浏览器绕过机器人屏蔽,我认为“Brotli炸弹”(100GB的\0数据经Brotli压缩后仅剩约78KiB)会相当有效。

      • 可尝试浏览器支持的多种压缩方案,如brotli。

        或采用链式压缩策略:“Content-Encoding: gzip gzip”。

      • 啊,这个站点的robots.txt文件居然还像初次登上HN时那样存在漏洞…

    • 连我这种门外汉都实现了绕行方案。

      我的网络爬虫同时设置了字节限制和超时机制,因此压缩炸弹对我影响不大。

      [https://github.com/rumca-js/crawler-buddy](https://github.com/rumca-js/crawler-buddy)

      我觉得垃圾话更管用。

  12. 我直接屏蔽了无法连接的IP范围。通过封锁美国、亚洲和中东地区,已能阻挡大部分恶意访问

  13. 我编写了Traefik插件[1],可根据已知恶意机器人用户代理控制流量,既能直接封禁,也可将其导向已配置的马尔可夫语音合成器。我目前使用的是Nepenthes[2]。

    [1] [https://github.com/holysoles/bot-wrangler-traefik-plugin](https://github.com/holysoles/bot-wrangler-traefik-plugin)

    [2] [https://zadzmo.org/code/nepenthes/](https://zadzmo.org/code/nepenthes/)

  14. 有意思!看到有人在尝试这些工具真不错,我好奇这类垃圾数据生成器会不会发展成独立产品。或者至少成为现有软件的功能/集成模块。我觉得完全有可能。

  15. 这些不是爬虫机器人,而是漏洞扫描器。它们根本不期待获取PHP源代码,甚至可能完全不读取响应正文。

    我不明白为何有人会认为这些是AI/LLM爬虫在随机服务器上搜刮PHP源代码(!),除非这与某些人脑子里根深蒂固的“AI正在窃取所有数据”这种无脑论调有关。

  16. 嗯…何不利用简化版的小型自建LLM网络,给大型爬虫喂些垃圾数据?

    我愿意为此牺牲两个CPU核心,只为让它们的日子难熬。

    • 这种事根本不需要LLM。文章里有个链接介绍用真实书籍创建马尔可夫链的方法,但这样反而能让爬虫的LLM在真实书籍上强化训练,而不是靠随机垃圾数据。

      我会为每个词类建立词汇表,并创建句式结构表(每项对应词类)。随机生成伪随机句子;句中每个词类对应随机词汇;输出结果;循环执行。这方案简单又高效。

      不过关键在于增加请求响应延迟。目的是拖慢爬虫速度,而非给垃圾场制造需求。

    • 他提到了这点。本质上存在守门人机制,一旦触怒他们,唯有人工干预才能解围。众所周知谷歌多么热衷于派人解决问题。

      > 我得出结论:运行此程序可能危及网站安全。主要风险在于:即便正确使用robots.txt、nofollow和noindex规则,谷歌爬虫或其他搜索引擎抓取工具仍可能误抓错误接口,从而判定你存在垃圾信息行为。

    • 这代价太高了。

  17. 别误会我的意思,但抓取工具有什么问题?人们投资SEO就是为了提升可见度,却又同时抵制“抓取机器人”。我一直认为公开信息的意义就在于可见性。若想盈利,直接设置付费墙不就行了?这不正是核心逻辑吗?

    • 将信息轻松发布给客户甚至公众(比如作为爱好),与通过爬虫提升搜索可见度,再将成果免费或低价拱手让给那些根本不在乎、甚至可能是竞争对手的企业——这些企业视你为替代品或敌对者——是截然不同的两回事。

      关键界限在于“我具备技术能力”与“我秉持善意参与系统运作”。

      公共公园本就存在,我技术上完全可以开车去倾倒垃圾——若他们不欢迎我,就该安装闸门售票。

      如今许多数据抓取者,恰似那些组建整支垃圾车队涌向公园倾倒废弃物的人——他们既给公园运营造成压力,更使公园服务整体难以维系。

      • > 界限在于“我具备技术能力完成此事”与“我以善意参与系统运作”。

        界限本应始终如此划定。但现实中,此标准在HN及其他平台的适用极具选择性。

        毕竟:广告拦截本质上不就是直接颠覆网站所有者通过用户注意力盈利的明确意图吗?

        若在此处套用你的标准,结论极其简单:不想看广告, *别访问该网站* 。

        对吧?

        • 我看到反对票,却不见反驳论点。

          有人能提出反驳吗?

          • 反驳的理由在于:广告早已变得极其烦人。它们会移动、会放大、会展示不适宜内容,还会用诡异的JavaScript在用户试图离开时制造干扰。或许近年有所收敛,但损害已成定局。广告商并非良善角色。这并非单纯颠覆站长意愿与否的黑白问题。

          • 更可说广告商滥用权势——通过隐蔽非法的个人数据利用、安全漏洞及各种卑劣手段牟利,这些行径往往发生在技术上能逃脱惩罚的灰色地带,而非遵循“应有”规范。

            当然两错不能成一理,这多少是厌恶广告者找的方便借口。但我认为,多数人反对的并非大众想象中的广告形式(即传统报纸式广告),而是当前网络广告模式——仅因浏览广告,用户信息便被瞬间窃取并发送给众多可疑公司进行处理转售, 且用户在加载网站前根本无法阻止数据泄露)。

            延续公园的比喻:假设公园向某公司出售广告许可权,允许其通过向游客投放广告获利——公园预期的广告形式无非是长椅上的广告牌之类。但该公司却开始从灌木丛中偷拍游客、录音窃听,甚至往游客口袋里塞AirTags追踪器来提升自身利润。游客们随即戴上口罩、停止交谈、穿着带拉链口袋的衣服。你可以说游客违反了默认协议——他们接受监控以资助公园(及广告公司)——但也可以指出公司越权:在未告知游客的情况下,将原始广告许可扩展为侵犯隐私的行为,且未在游客入园前、期间或之后说明其行为。

    • 旧式爬虫抓取了你的网站,或许能为你带来流量。这于你有利。

      AI爬虫会剽窃你的作品,却不会为你带来任何流量。

      • 你得好好珍惜那粒沙——它来自预训练数据的海滩,被用来微调某些嵌入权重

        • 沙子是全球第二大消耗的自然资源,如今连混凝土用砂都遭全球非法开采。

          延续你的比喻:我开放了海滩供游客欣赏,但某些人竟想据为己用…

        • 一篇Reddit帖子就能让大型语言模型建议你在披萨里加胶水。但关键在于要让机器人吃瘪。

        • 我没有理由帮助地球上最富有的公司调整权重,还要为此付出代价。

        • 那粒曾带来流量的沙子,如今已不复效力。对依赖它的人而言,这简直是场经济灾难。而向那些将取代你的人提供数据也并非免费——他们在此过程中肆意滥用你的服务器。

    • 你说得对,残酷的现实是内容生产者无法选择谁能索引其公开内容,因为恶意爬虫根本不遵守robots.txt或用户代理字符串的规则。根据我的经验,恶意爬虫会竭尽全力伪装成普通用户:伪造IP地址、伪造用户代理字符串……因此很难将其与正常流量区分开来。

    • 你读过原文了吗?

      这些抓取工具用请求淹没人们的服务器,实际占用所有资源并推高成本。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

链接收藏


京ICP备12002735号