滑动滑块的反爬 整体思路

整体思路:

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:
修改完上述两点,基本就可以通过滑块验证了。如果有什么不对的地方,各位大佬请指教指教哟!
 

上一篇:浏览器提供的对象


下一篇:JavaScript学习笔记三