整体思路:
1、查看js中的检测特征,检查什么,对什么进行修改; 如:cdc、window.navigator.webdriver、开发者模式等。 修改的途径包括exe源码、mitmproxy拦截
2、翻页过多引发的滑块问题,涉及到风控;
即使把window.navigator.webdriver(js检测特征之一)设置为"undefined"了,还是不能通过。
这时候全局搜索一下js,如果网站js里面有一段代码,那很可能就是对selenium的webdriver进行验证的了:
1、chromedriver.exe的反爬:
!function(n) {
function r() {
return "$cdc_asdjflasutopfhvcZLmcfl_"in u || f.webdriver
}
可以把webdriver.exe拖动到ide里面去看看,搜索这个字符串“$cdc_asdjflasutopfhvcZLmcfl_”。可以找到真的有在这里面。
字符串上面有个注释:|key| is a long random string, unlikely to conflict with anything else.(|键|是一个很长的随机字符串,不太可能与其他任何字符串发生冲突。)
$cdc_asdjflasutopfhvcZLmcfl_特征
webdriver.exe里面同样有这段一样的字符串,可以用pycharm打开搜索看到,但不能够用pycharm来修改,否则会使这exe文件无法使用。
修改方法:
win平台下可以使用notepad++来打开,直接修改,然后关闭保存就好了。
这里把“$cdc_asdjflasutopfhvcZLmcfl_”更改为“$chr_fajfjafjasifjsiaSsdjdl_”。
linus平台可用vim来进行修改。
2、window.navigator.webdriver反爬
一开始的js代码里面还有一段“|| f.webdriver”,或者是f的webdriver属性,根据测试,这正是浏览器的window.navigator.webdriver属性,正常的浏览器时这样的。
打开webdriver浏览器,不进行任何设置是这样的:
下面来添加一下初始设置选项。
1、关闭“正受到自动测试软件的控制“的显示
# chrome_options 初始化选项
chrome_options = webdriver.ChromeOptions()
# 设置浏览器初始 位置x,y & 宽高x,y
chrome_options.add_argument(f'--window-position={217},{172}')
chrome_options.add_argument(f'--window-size={1200},{1000}')
# 关闭自动测试状态显示 // 会导致浏览器报:请停用开发者模式
# window.navigator.webdriver还是返回True,当返回undefined时应该才可行。
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
加了这段代码后会提示:”请停用开发者模式“。
那我们继续关闭开发者模式,并测试一下网站。
2、关闭开发者模式
# 关闭开发者模式
chrome_options.add_experimental_option("useAutomationExtension", False)
chrome.get('www.baidu.com')
可以看到这次浏览器没有受控制的提示了,但是.webdriver的特征还是存在的。
最后我们通过提前运行js的方法,把window.navigator.webdriver设为"undefined"
3、将window.navigator.webdriver属性设置为"undefined"
# 通过浏览器的dev_tool在get页面钱将.webdriver属性改为"undefined"
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})""",
})
在get网页前,让driver执行这个js脚本,这样就可以把window.navigator.webdriver设为"undefined"了。
下面放一下我初始化webdriver的代码:
def InitialBrowser():
# 驱动器地址
f = r'C:\Users\Administrator\Downloads\Compressed\chromedriver.exe'
# chrome_options 初始化选项
chrome_options = webdriver.ChromeOptions()
# 设置浏览器初始 位置x,y & 宽高x,y
chrome_options.add_argument(f'--window-position={217},{172}')
chrome_options.add_argument(f'--window-size={1200},{1000}')
# 关闭自动测试状态显示 // 会导致浏览器报:请停用开发者模式
# window.navigator.webdriver还是返回True,当返回undefined时应该才可行。
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
# 关闭开发者模式
chrome_options.add_experimental_option("useAutomationExtension", False)
# 禁止图片加载
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs", prefs)
# 设置中文
chrome_options.add_argument('lang=zh_CN.UTF-8')
# 更换头部
chrome_options.add_argument(
'user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"')
# 隐藏浏览器
chrome_ options.add_argument('--headless') #隐藏浏览器
# 部署项目在linux时,其驱动会要求这个参数
chrome_ options.add_argument('--no-sandbox')
# 创建浏览器对象
driver = webdriver.Chrome(f, options=chrome_options)
# 设置执行js代码转换模式
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})""",
})
# 打开网站 测试
# driver.get('https://www.baidu.com/')
return driver
last:
修改完上述两点,基本就可以通过滑块验证了。如果有什么不对的地方,各位大佬请指教指教哟!