如何从 Nginx 日志中识别爬虫的访问?

2019-04-21 16:19:20 +08:00
 kristpan

我的博客用的 Nginx 做服务器,我用 Python 写了个日志过滤器,目的是把所有搜索引擎、网络爬虫等流量过滤掉,只展现普通用户的访问。Nginx 的日志记录主要分为如下几种:

  1. 普通用户
  2. DNSPod
  3. 搜索引擎
  4. RSS 订阅

上面这几种可以从 User-Agent 分辨出来。但有些 IP,我在 ipip.net 上查询,发现指向一些机房,并说明是机器人,像这种该怎么过滤出来呢?

大家有什么思路,欢迎分享。

4531 次点击
所在节点    程序员
9 条回复
jugelizi
2019-04-21 16:39:43 +08:00
看有没有 js css 的日志
大部分机器还没必要开浏览器
所以一个 IP 重来不请求 js 文件几乎确认是爬虫
hakono
2019-04-21 16:47:50 +08:00
一个是请求频率,再一个是请求路径是否正常
请求频率这个没啥好说的
路径这个,比如如果一个 ip 按着 /book/1 /book/2 /book/3 这种普通用户不会采用的访问姿势路访问下去,那 100%是爬虫。或者在页面里放入蜜罐地址,爬虫识别的到但用户看不到,有时候写爬虫的可能不在乎这点就掉坑里了

再一个非常有效的方法就是后台偷偷换个新 api,但保留旧 api。
前端使用新 api,而旧 api 因为没有被关闭,爬虫还能正常读取,如果不是直接从页面里提取 api 的爬虫,代码不会立刻更新,那么更新上线后依旧在用旧 api 的 100%是爬虫。

再一个就是上面说的,检测 js css favo.ico 这些文件。没采用 headless 浏览器的爬虫,用这方式检测一抓一个准
hakono
2019-04-21 16:51:22 +08:00
至于那些采用了 headless 浏览器的爬虫,这就是完全另外的思路了
比如想办法找漏洞,看看能不能检测到浏览器的环境
如果个点比较难,剩下的就是大数据,ai 分析这条路了。看到过几个大公司就有招聘识别用户操作是否合规的 ai 工程师,顺便还能抓外挂
lasuar
2019-04-21 17:07:26 +08:00
* useragent 是否合法
* 请求频率是否稳定
* 请求路径是否有规律,楼上说的 /book/1,/book/2 这种
* 是否某一段时间有大量 IP 短时高频请求服务器(反常行为)
如果以上都正常,即使是爬虫也不妨碍服务器运行。
kristpan
2019-04-21 19:26:52 +08:00
@jugelizi 这个方法应该可行,多谢了!
kristpan
2019-04-21 19:28:39 +08:00
@hakono 我的博客用的别人的框架,没有学过前端的知识,不会修改啊。还是一楼提出的简单方法简单实用。
kristpan
2019-04-21 19:29:29 +08:00
@lasuar 其实爬虫没怎么影响服务器运行,就是想从日志过滤出有用的信息。
lasuar
2019-04-21 22:06:52 +08:00
@kristpan 用户通过网页加载完页面后,进行翻页浏览数据时还需要请求 js 文件吗?如果只是判断有没有请求过 js 文件这根本不可行的,写爬虫之前都会使用浏览器对页面进行分析,之后再通过代码爬取。 所以你还得通过其他方式来判断,如果你只想筛出爬虫的请求,这其实很难(对于高级爬虫),也没必要。
kristpan
2019-04-21 23:54:06 +08:00
@lasuar 我试过了,加载完一个页面之后,打开后面的页面不会再请求 js 文件。我是这样处理的:用户一旦有请求过 js 文件,我会将它的 IP 记录下来,标记为非爬虫。因为我是对日志进行操作,这个过程很简单。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/557251

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX