V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kristpan
V2EX  ›  程序员

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

  •  
  •   kristpan ·
    panqiincs · 2019-04-21 16:19:20 +08:00 · 4532 次点击
    这是一个创建于 2045 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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