Web机器人入门
本文介绍了 Web 机器人(Web bot)是什么?是做什么的?有哪些类型?
什么是 Web 机器人?
定义
能够在网络运行自动化任务的程序。
作用
提高吞吐量,降低成本。
使用场景
- 自动化测试
- 网络欺诈
- 证书填充(credential stuffing)
- 爬虫
Web 机器人分类
可以通过使用的技术,将 Web 机器人分为三类:
- 使用 HTTP 框架
- 使用真正的浏览器
- 使用无头浏览器
简单的 HTTP 请求库
如使用 Python 的urlllib
或是 Node.js 的http
模块。
优点:占用 CPU 和内存少。
缺点:无法加载动态内容,或单页面应用(SPA),不能执行 JavaScript 代码,通常需要借助别的库来解析 HTML,如:Beautiful Soup、Cheerio。
使用了 Selenium/puppeter 的真正的浏览器
Selenium 和 Puppeteer 是浏览器自动化框架。它们能够运行自动化程序,例如加载页面、移动鼠标或输入文本等。
Puppeteer 主要通过 Node.js 来控制 Chrome 和 Headless Chrome。
Selenium 可以控制常见的浏览器,如 Firefox、 Chrome 和 Safari,并且能够使用不同的编程语言(Node.js、Python 和 Java)。
优点:能够执行 JavaScript,并且使用真正的浏览器。
缺点:占用较多的 CPU 和内存,不能直接在服务器上使用,因为通常需要显示器。
无头(Headless)浏览器
无头浏览器是没有图形界面的浏览器。最早流行的无头浏览器之一是 PhantomJS(已不再维护,最后一个稳定版本是 2016 年发布的)。
2017 年谷歌发布了 Headless Chrome,几乎支持所有普通 Chrome 的功能。
优点:能执行 JavaScript,并且占用较少的 CPU 和内存资源。
识别 Web 机器人
行为检测(Behavioral detection)
该方法通过检测用户的行为,如鼠标移动、浏览速度等来检测是不是真人。
服务端特征
- Session 期间所浏览的页面数
- 总请求数
- 浏览页面的顺序,机器人往往有某种模式,而人类会更加混乱。
- 浏览两个连续页面的平均时间。
- 页面加载的资源类型,机器人可能会因为节省带宽而屏蔽 CSS、图片、广告等。
客户端特征
- 鼠标移动轨迹
- 鼠标点击
- 滚动
- 按键,连续按键的时间间隔
基于指纹识别的检测(Fingerprinting-based detection)
指纹识别通过设备或浏览器相关的信息进行检测。既可以进行身份验证,也可以检测机器人。
该方法的思路:收集设备、操作系统、浏览器信息;然后对手机代码进行混淆和加密,否则会被机器人开发人员发现检测原理。
浏览器指纹识别(Browser fingerprinting)
- PhantomJS
window.callPhantom
window._phantom
window.phantom
- Nightmare
window.__nightmare
- webdriver
navigator.webdriver
- Selenium
document.__selenium_unwrapped
document.__webdriver_evaluate
document.__driver_evaluate
浏览器一致性(Browser consistency)
用来验证 UA 是否造假
eval.toString().length
// Chrome返回33
// Firefox、Safari返回37
// IE返回39
操作系统一致性(OS consistency)
UA 和 navigator.platform 的是否值一致
- Linux -> Linux i686, Linux x86_64
- Windows -> Win32, Win64
- iOS -> iPhone, iPad
- Android -> Linux armv71, Linux i686
- macOS -> MacIntel
- FreeBSD -> FreeBSD amd64, FreeBSD i386
不一致行为(Inconsistent feature behavior)
通过权限检测 Headless Chrome
navigator.permissions
.query({ name: 'notifications' })
.then(function (permissionStatus) {
if (
Notification.permission === 'denied' &&
permissionStatus.state === 'prompt'
) {
console.log('This is Chrome headless')
} else {
console.log('This is not Chrome headless')
}
})
Red pills
Red pills allow programs to detect if their execution environment is a CPU emulator or a virtual machine.
CAPTCHAs
Completely Automated Public Turing test to tell Computers and Humans Apart
CAPTCHAs 利用图灵测试,比如图像和音频识别来区分机器人和人类。