说明
第一次爬问卷星,做半天数据处理,好不容易从题库中解析出答案,填完了准备提交收工,结果给我杀出个智能验证,实在是崩溃。终于在网上找到了解决办法和验证原理,突然发现这个方法也可以解决许多不同平台检测的问题。
智能验证
-
原理
– 检测基本原理是检测当前浏览器窗口下window.navigator对象中是否包含webdriver这个属性。如果你是采用selenuim自然免不了webdriver,这个时候window.navigator对象中就会包含webdriver属性,但是在我们平常使用浏览器时,这个属性是undefined,一旦被网站上的JS判断出这个属性的不同,就露馅了。。。 -
解决方式
– 在加载网页之前加入下行代码
# 这行代码的作用是将webdriver这个属性置为undefined
bro.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
- 整体的放置位置我举个例子
chrome_options = Options()
# chrome_options.add_argument('--headless') # 关闭可视化
chrome_options.add_argument('--disable-gpu') # 禁用gpu加速
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
}
bro = webdriver.Chrome(executable_path='./driver/chromedriver.exe', options=chrome_options)
bro.maximize_window()
# 代码在这,放在get()之前
bro.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
bro.get('www.baidu.com')