怎么阻止爬虫访问已经不存在的目录

浏览: 170 次浏览 作者: 去年夏天 分类: Ubuntu,技术文章,碎碎谈 发布时间: 2022-08-18 17:00

怎么阻止爬虫访问已经不存在的目录

前言

起因其实非常简单,
我有建立一个共享盘,
主要是对Pixiv站点每日排行Top50的搬运整理。
这意味着一个很简单的情况,接近10年的图片量,
意味着会出现巨量的子目录
大概是十几万级别的

作为一个个人小站,出现这么多的子目录是很少见的。

然后某些“数据统计公司”的爬虫,特别 智能 会定期访问所有曾经记录过的路径

虽然他们承诺的是“我们会考虑对方的负载问题,20秒内同一个(IP的)爬虫不会再次爬取同一个站”
但他们没说的是:
1. 他们有很多爬虫,可以同时爬取同一个站
2. 哪怕那个路径已经403,301了多年了还会坚持访问。
3. 如果改中间路径,比如从tjsky.net/图片/等十万个图片的具体路径.jpg改成tjsky.net/pic/等十万个图片的具体路径.jpg,那就意味着,爬虫对本站的爬取量,增加了一倍。爬虫不但会爬取新的目录,还是继续爬取已经不存在的目录。哪怕我设置301给他定向到新路径,他也坚持多年一直访问不存在的旧路径

我都不好说是老外太实诚,还是老外太精明了。
最终实际效果就是,这就是个对本站每秒2~3次的DDOS攻击 ,虽然这么点点负荷倒也不至于让服务器扛不住,但是这毕竟是极大的资源浪费嘛。

然后研究了一下发现,返回403,401,402和30X系列,50X系列状态都不会阻止爬虫们持续的访问,只有给他返回444,直接由服务器中断连接,不会向客户端再返回任何消息,爬虫才会确信这个路径已经无了


以下的命令均添加到server段内,修改nginx配置之前务必做好备份,修改完毕后需要重载一次nginx配置,否则不会生效。(如果你用的是面板的话,比如知名的宝塔,BT面板会在你点保存按钮时,自动重载一次配置)

方案一 通过对UA的识别阻断

    if ($http_user_agent ~* (SemrushBot|python|MJ12bot|AhrefsBot|AhrefsBot|hubspot|opensiteexplorer|leiki|webmeup)) 
    {
     return 444;
    }

方案二 通过对访问不存在的目录的行为阻断

     if ($uri ~* ^/pic/(pic|pic_r)/.*\.(jpg|png)$)
     #如果访问形如“”你的域名/pic/pic/XXX/YYY/ZZZ.jpg”则返回444状态
     {
     return 444;
     }

用 WordPress 的博客可以使用一些安全插件解决,比如Wordfence

  • 插件市场安装Wordfence
  • 进入Wordfence设置页,选择防火墙项目,再点击限速选项。
  • 找到 如果爬虫找不到的页面(404s)请求超过 改为你想要的数值,后面选择屏蔽它
    注意:请确保你的网站本身没什么404页面,不然你的屏蔽会阻止正常爬虫对你站点的抓取

其他说明

  1. 修改nginx配置之前务必做好备份!
  2. if和(之间有个空格,不然nginx无法正确识别
  3. ~*是指的正则匹配且不区分大小写
  4. 如果你前端有防火墙或者CDN的话,大部分服务都会有针对性阻拦特定UA和访问路径的设置,这里就不展开说了。

发表回复

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据