无头浏览器中的爬虫与反爬虫
一些网站为了防止数据的爬取,一般会检测访问我们的web程序是否为无头浏览器, 以及他们的一些反检测的方法;
因为浏览器跟反爬虫方式时时刻刻都会更新,所以可能当你看到这篇文章的时候,有的方式已经不能用了,但是核心点还是要善于观察与对比。
所有的形式都可以有伪装与绕过的方法。大致思路都相差不多。
Webdriver检测
一般来说,如果是无头浏览器模式下, navigator.webdriver
会返回true
// 1.最简单的检测方式
if (navigator.webdriver) {
// 针对无头浏览器的操作
}
webdriver in navigator
// 1.绕过方法
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined,
})
// 2.使用defineProperty删除webdriver后如何检测
navigator.hasOwnProperty("webdriver")
// 2.绕过方法
// 直接删掉webdriver属性,这是我目前验证成功的方法. 目前其他网上找到的方法已经无效.
await page.evaluateOnNewDocument(() => {
const newProto = navigator.__proto__;
delete newProto.webdriver;
navigator.__proto__ = newProto;
});
chrome属性检测
在无头浏览器模式下,全局对象下的chrome对象是没有runtime
属性的
// 检测方法
if (!window.chrome || !window.chrome.runtime) {
// 无头浏览器模式...
}
// 绕过方法
window.navigator.chrome = {
runtime: {}
};
// 如果是Puppeteer,则可以使用下面的方法
await page.evaluateOnNewDocument(() => {
window.navigator.chrome = {
runtime: {}
};
});