反爬虫中chrome无头浏览器的几种检测与绕过方式
Posted FserSuN
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反爬虫中chrome无头浏览器的几种检测与绕过方式相关的知识,希望对你有一定的参考价值。
chrome无头浏览器的几种检测方式
本文测试使用的chrome版本为 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/70.0.3514.2 Safari/537.36
1.UserAgent检测
无头模式下的UA会带有HeadlessChrome关键字
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/70.0.3521.2 Safari/537.36
因此可以检查UA中的关键字
if (/HeadlessChrome/.test(navigator.userAgent))
// headless...
2.Webdriver检测
无头模式下navigator.webdriver为true,因此可以进行如下检测。
// Webdriver Test
if (navigator.webdriver)
// headless...
为了绕过这个检测,重新设置该属性即可。
Object.defineProperty(navigator, 'webdriver',
get: () => false,
);
建议通过原型删除该属性
delete navigator.__proto__.webdriver;
补充说明:大麦网或淘宝网的滑块验证码首先就会检测环境,
通常会利用sufei_data文件检测当前浏览器信息,其中检测webdriver代码如下
function r()
return "$cdc_asdjflasutopfhvcZLmcfl_"in u || f.webdriver
// 完整的检测代码,这个文件会经常升级
// https://g.alicdn.com/secdev/sufei_data/3.6.8/index.js
因此在尝试拖动滑块的时候,先要修改该属性。不然如何修改路径都会提示错误,并要求重试。
document.$cdc_asdjflasutopfhvcZLmcfl_通常在使用selenium时会出现
3.chrome属性检测
在无头模式下window.chrome属性是undefined,而在正常有界面模式下,定义如下。
csi: ƒ ()
embeddedSearch: searchBox: …, newTabPage: …
loadTimes: ƒ ()
app: (...)
runtime: (...)
webstore: (...)
get app: ƒ nativeGetter()
set app: ƒ nativeSetter()
get runtime: ƒ nativeGetter()
set runtime: ƒ nativeSetter()
get webstore: ƒ nativeGetter()
set webstore: ƒ nativeSetter(
因此可以进行如下形式检测
if (!window.chrome || !window.chrome.runtime)
// headless...
绕过检测修改属性即可
window.navigator.chrome =
runtime: ,
// etc.
;
4.Permissions检测
(async () =>
const permissionStatus = await navigator.permissions.query( name: 'notifications' );
if(Notification.permission === 'denied' && permissionStatus.state === 'prompt')
// headless
)();
无头模式下Notification.permission与navigator.permissions.query会返回相反的值。
因此绕过的方式如下。
// Pass the Permissions Test.
await page.evaluateOnNewDocument(() =>
const originalQuery = window.navigator.permissions.query;
return window.navigator.permissions.query = (parameters) => (
parameters.name === 'notifications' ?
Promise.resolve( state: Notification.permission ) :
originalQuery(parameters)
);
);
5. Plugins长度检测
无头模式下navigator.plugins.length返回0
if (navigator.plugins.length === 0)
// headless
绕过方式如下
Object.defineProperty(navigator, 'plugins',
get: () => [1, 2, 3, 4, 5],
);
注意:反爬除了检查长度,还会检查内容。如果你设置了长度,别忘了再设置内容。防止被反爬。
6.The Languages检测
navigator.languages检测方法
if (!navigator.languages || navigator.languages.length === 0)
// headless
绕过方法
Object.defineProperty(navigator, 'languages',
get: () => ['en-US', 'en'],
);
7.原文地址
https://intoli.com/blog/not-possible-to-block-chrome-headless/
https://intoli.com/blog/making-chrome-headless-undetectable/
https://github.com/infosimples/detect-headless
https://stackoverflow.com/questions/19877924/what-is-the-list-of-possible-values-for-navigator-platform-as-of-today
以上是关于反爬虫中chrome无头浏览器的几种检测与绕过方式的主要内容,如果未能解决你的问题,请参考以下文章
爬虫04 /asyncioselenium规避检测动作链无头浏览器
Python 爬虫篇 - 通过urllib.request伪装成浏览器绕过反爬虫爬取网页所有连接实例演示,urllib2库的安装