怎么阻止爬虫访问已经不存在的目录
怎么阻止爬虫访问已经不存在的目录
前言
起因其实非常简单,
我有建立一个共享盘,
主要是对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页面,不然你的屏蔽会阻止正常爬虫对你站点的抓取
其他说明
- 修改nginx配置之前务必做好备份!
- if和(之间有个空格,不然nginx无法正确识别
- ~*是指的正则匹配且不区分大小写
- 如果你前端有防火墙或者CDN的话,大部分服务都会有针对性阻拦特定UA和访问路径的设置,这里就不展开说了。