最近一个星期日常对网站进行运维,从一周前开始断断续续开始看到网站的payjs支付接口被调用了很多次,但是都是被调用而没有正常的走完支付流程,所以确定了这是不守规矩的垃圾爬虫,因为网站的robots.txt中已经禁止爬虫对payjs的类似接口进行爬取,百度、google和必应的爬虫都是按照规矩来的,我从网站日志中查了一下

106.54.210.33 - - [11/Sep/2023:08:22:29 +0800] "GET /wp-content/plugins/erphpdown/buy.php?postid=1455×tamp=1693351264 HTTP/1.1" 200 1448 "-" "Apache-HttpClient/4.5.13 (Java/11)"
111.229.16.246 - - [11/Sep/2023:08:22:30 +0800] "GET /wp-content/plugins/erphpdown/payment/payjs.php?ice_post=901&redirect_url=https%3A%2F%2Fwww.stubbornhuang.com%2F901%2F%3Ftimestamp%3D1694353904 HTTP/1.1" 200 1945 "-" "Apache-HttpClient/4.5.13 (Java/11)"
122.51.230.150 - - [11/Sep/2023:08:22:30 +0800] "GET /wp-content/plugins/cp-link-open/link.php?a=aHR0cHM6Ly9kZXZlbG9wZXIubnZpZGlhLmNvbS96aC1jbi90ZW5zb3JydD90ZXJtPVRlbnNvclJU HTTP/1.1" 200 821 "-" "Apache-HttpClient/4.5.13 (Java/11)"

这个垃圾佬应该是挂了个代理ip池,不过都是Apache-HttpClient/4.5.13 (Java/11),就只有这种脑残采集爬虫才会无脑遍历网站上的所有链接。既然不遵守robots.txt这种君子协定,那就只能在nginx端进行限制了。nginx可以禁止特定的User-Agent、空User-Agent访问网站。

1 修改nginx配置

如果没有使用宝塔面板,则修改相关的conf文件;如果是使用的宝塔面板,在宝塔面板 - 网站 - 设置 - 配置文件进行修改,如下图

nginx – 禁止特定User-Agent或者空User-Agent等垃圾爬虫爬取网站、爆破接口-StubbornHuang Blog

在对应的网站的conf中增加以下配置代码。

1.1 禁止Scrapy等工具的爬取

if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
     return 403;
}

1.2 禁止非GET、HEAD、POST方式的抓取

if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 403;
}

1.3 禁止指定User-Agent及User-Agent为空的访问

if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|^$" ) {
     return 403;
}

修改完成之后,如果是宝塔面板保存即可,如果是使用原生nginx则重新加载nginx,比如

 /usr/local/nginx/sbin/nginx -s reload

2 测试

对nginx的配置完成之后,我们可以使用curl模拟User-Agent对网站进行访问

(1) 模拟User-Agent为空的爬虫访问

curl -I -A '' www.stubbornhuang.com

输出

HTTP/1.1 403 Forbidden
Server: nginx
Date: Mon, 11 Sep 2023 02:11:30 GMT
Content-Type: text/html
Content-Length: 146
Connection: keep-alive

(2) 模拟Python-urllib的爬虫访问

curl -I -A 'Python-urllib' www.stubbornhuang.com

输出

HTTP/1.1 403 Forbidden
Server: nginx
Date: Mon, 11 Sep 2023 02:13:19 GMT
Content-Type: text/html
Content-Length: 146
Connection: keep-alive

(3) 模拟百度、google等正常蜘蛛访问

curl -I -A 'Baiduspider' www.stubbornhuang.com #百度
curl -I -A 'Googlebot' www.stubbornhuang.com #Google
curl -I -A 'bingbot' www.stubbornhuang.com #必应

输出

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 11 Sep 2023 02:14:27 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: wp-editormd-lang=zh-CN; path=/
Strict-Transport-Security: max-age=31536000

从上述的测试结果看,空的User-Agent或者特定被屏蔽的User-Agent返回的都是403,而百度、google、必应的蜘蛛都是正常访问的,说明设置生效了。

参考