Python如何过WebDriver检测

升级了最新版的浏览器后发现之前写的代码好像是出问题了、思考再三觉得可能是被检测WebDriver了、网上找了一些文章、最终这个有点效果、但是还是有问题,贴出来大家参考下

一、使用pyppeteer过WebDriver检测

最主要的是添加下面的代码

await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
                                     '{ webdriver:{ get: () => false } }) }')

下面的是完整的代码,可以检测是否成功

import asyncio
from pyppeteer import launch

# 测试检测webdriver
async def main():
    browser = await launch(headless=False, args=['--disable-infobars'])
    page = await browser.newPage()
    # 下面的主要是为了伪装下,很多会进行屏蔽
    await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
                                     '{ webdriver:{ get: () => false } }) }')
    # 上面的主要是为了伪装下,很多会进行屏蔽
    await page.setUserAgent("Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)")
    await page.setViewport(viewport={'width': 1920, 'height': 1080})
    await page.goto('https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html')
    print(await page.content())
    await asyncio.sleep(25)
    await browser.close()
# asyncio.get_event_loop().run_until_complete(main())
if __name__ == "__main__":
    asyncio.run(main())

运行后的结果

仅供参考吧 

二、补充知识:

1、chrome检测地址

这是chrome的真正检测网址: https://bot.sannysoft.com

为什么要强调绕过webdriver属性检测?
有些网址通过webdriver检测使得Selenium无法获取元素、无法控制按钮等情况

2、selenium 浏览器启动参数

不同机器不同电脑不同情况需要设置的参数完全不同。

参数设置:  chrome_options = Options()

option = webdriver.ChromeOptions() 老版本,已弃用

经典参数

参数名称作用
options.add_argument(‘window-size=1920x3000’)指定浏览器分辨率
chrome_options.add_argument(‘–disable-gpu’)不启用 GPU 谷歌文档提到需要加上这个属性来规避bug
options.add_argument(‘–hide-scrollbars’)隐藏滚动条, 应对一些特殊页面
options.add_argument(‘blink-settings=imagesEnabled=false’)不加载图片, 提升速度
options.add_argument(‘–headless’)浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
options.add_argument(‘–no-sandbox’)以最高权限运行
option.add_argument(“–disable-javascript”)禁用JavaScript
options.add_experimental_option(‘excludeSwitches’, [‘enable-automation’])设置开发者模式启动,该模式下webdriver属性为正常值

指定浏览器位置

options.binary_location = r" " 

加请求头

chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) /ppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36')

常见的检测是根据window.navigator.webdriver属性是否为True来判断的、如果谷歌浏览器是79版本以前的、可以通过启用开发者模式来规避这个检测

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

options = ChromeOptions()
options.add_experimental_option('excludeSwitches',[''enable-automation])
driver = Chrome(options = options,excuteable_path='')

如果是79版本以后,chrome修复了开发者模式下window.navigator.webdriver未定义的问题,所以需要覆盖掉webdriver为True的属性

from selenium import webdriver
from selenium.webdriver.chrome.options import Options


chrome_options = Options()
chrome_options.add_experimental_option('useAutomationnExtension',False)
chrome_options.add_argument("disable-blink-features")
chrome_options.add_argument("disable-blink-features=AutomationControlled")
driver = webdriver.Chrome()
driver.get("https://bot.sannysoft.com/")

四、亲测可用

用 selenium 有很多种被别的平台侦测出的办法,所以,这一篇讲讲述,如何隐藏 selenium 的各种特性。有些网址通过 webdriver 检测使得 Selenium 无法获取元素、无法控制按钮等情况

普通的浏览器打开是这样子的

webdriver打开是这样子的

附相应的代码 

from selenium import webdriver

class WebDriverChrome(object):

    def __init__(self):
        self.driver = self.StartWebdriver()

    def StartWebdriver(self):
        options = webdriver.ChromeOptions()
        options.add_argument("start-maximized")
        options.add_experimental_option("excludeSwitches", ["enable-automation"])
        options.add_experimental_option("useAutomationExtension", False)
        driver = webdriver.Chrome(options=options)
        return driver

    def RunStart(self):
        self.driver.get('https://bot.sannysoft.com')
        # time.sleep(10)
        # self.driver.quit()

if __name__ == '__main__':
    Crawl = WebDriverChrome()
    Crawl.RunStart()

 通过Js注入真正绕过webdriver的检测属性

from selenium import webdriver

class WebDriverChrome(object):

    def __init__(self):
        self.driver = self.StartWebdriver()

    def StartWebdriver(self):
        options = webdriver.ChromeOptions()
        options.add_argument("start-maximized")
        options.add_experimental_option("excludeSwitches", ["enable-automation"])
        options.add_experimental_option("useAutomationExtension", False)
        driver = webdriver.Chrome(options=options)
        with open('./stealth.min.js') as f:
            js = f.read()
        driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": js
        })
        return driver

    def RunStart(self):
        self.driver.get('https://bot.sannysoft.com')
        # time.sleep(10)
        # self.driver.quit()


if __name__ == '__main__':
    Crawl = WebDriverChrome()
    Crawl.RunStart()

stealth.min.js 生成 (需要安装node.js) 

npx extract-stealth-evasions

# 就会在你执行命令的文件夹下面生成一个 stealth.min.js 文件

除了使用 js 注入之外, chrome 还提供很多参数,来隐藏,来达到相同的效果,具体可以参考: 三、修改检测参数

测试没问题

 

posted @ 2023-05-11 11:20  知数网络  阅读(93)  评论(0编辑  收藏  举报  来源