• Selenium隐藏浏览器特征


    Selenium特征

    我们使用 Selenium 对网页进行爬虫时,如果不做任何处理直接进行爬取,会导致很多特征是暴露的
    对一些做了反爬的网站,做了特征检测,用来阻止一些恶意爬虫

    来源网址:
    https://blog.csdn.net/m0_67695717/article/details/128866017
    https://blog.csdn.net/m0_67695717/article/details/130687622
    https://blog.csdn.net/houmenghu/article/details/120489611

    1. CDP

    CDP 全称为 Chrome Devtools-Protocol

    https://chromedevtools.github.io/devtools-protocol/

    通过执行 CDP 命令,可以在网页加载前运行一段代码,进而改变浏览器的指纹特征

    比如,window.navigator.webdriver 在 Selenium 直接打开网页时返回结果为 true;而手动打开网页时,该对象值为 undefined

    因此,我们可以利用 CDP 命令修改该对象的值,达到隐藏指纹特征的目的

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.chrome.service import Service
    import time
    
    chrome_options = Options()
    
    s = Service(r"chromedriver.exe路径")
    
    driver = webdriver.Chrome(service=s, options=chrome_options)
    
    # 执行cdp命令,修改(window.navigator.webdriver )对象的值
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
                Object.defineProperty(navigator, 'webdriver', {
                  get: () => undefined
                })
                """
    })
    
    driver.get(url='URL')
    
    driver.save_screenshot('result.png')
    
    # 保存
    source = driver.page_source
    with open('result.html', 'w', encoding='utf-8') as f:
        f.write(source)
    
    time.sleep(200)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    需要指出的是,浏览器的指纹特征很多,使用该方法存在一些局限性

    2. stealth.min.js

    该文件包含了常用的浏览器特征,我们只需要读取该文件,然后执行 CDP 命令即可

    下载地址:

    https://github.com/berstend/puppeteer-extra/tree/stealth-js

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    import time
    
    chrome_options = Options()
    
    # 无头模式
    # chrome_options.add_argument("--headless")
    
    # 添加请求头
    chrome_options.add_argument(
        'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36')
    
    s = Service(r"chromedriver.exe路径")
    
    driver = webdriver.Chrome(service=s, options=chrome_options)
    
    # 利用stealth.min.js隐藏浏览器指纹特征
    # stealth.min.js下载地址:https://github.com/berstend/puppeteer-extra/tree/stealth-js
    with open('./stealth.min.js') as f:
        driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": f.read()
        })
    
    driver.get(url='URL')
    # driver.get(url='https://bot.sannysoft.com/')
    
    # 保存图片
    driver.save_screenshot('result.png')
    
    time.sleep(200)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    3. undetected_chromedriver

    这是一个防止浏览器指纹特征被识别的依赖库,可以自动下载驱动配置再运行

    项目地址:https://github.com/ultrafunkamsterdam/undetected-chromedriver

    首先,我们安装依赖库

    # 安装依赖
    pip3 install undetected-chromedriver
    
    • 1
    • 2

    然后,通过下面几行代码就能完美隐藏浏览器的指纹特征

    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.chrome.service import Service
    import time
    import undetected_chromedriver as uc
    
    chrome_options = Options()
    # chrome_options.add_argument("--headless")
    
    s = Service(r"chromedriver.exe")
    
    driver = uc.Chrome(service=s, options=chrome_options)
    
    driver.get(url='URL')
    # driver.get(url='https://bot.sannysoft.com/')
    
    driver.save_screenshot('result.png')
    time.sleep(100)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4. 操作已开启的浏览器

    如何利用 Selenium 对已打开的浏览器进行爬虫!

    我们只需要通过命令行启动一个浏览器

    import subprocess
    
    # 使用当前浏览器
    # "C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222
    # 创建一个全新配置的浏览器, 一个文件夹只会创建一次
    # "C:\Program Files\Google\Chrome\Application\chrome.exe"  --remote-debugging-port=9222 --user-data-dir="随便找个空文件夹路径"
    
    cmd = 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\\selenum\\user_data"'
    subprocess.run(cmd)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    然后,利用 Selenium 直接操作上面的浏览器即可模拟正常操作浏览器的行为

    from selenium.webdriver import Chrome
    from selenium.webdriver.chrome.options import Options
    
    chrome_options = Options()
    chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
    # 注意我把chromedriver文件放到了当前文件夹里面,所以可以这样调用
    # 如果你是windows电脑,你需要使用./chromedriver.exe
    driver = Chrome(options=chrome_options)
    
    driver.get('http://exercise.kingname.info/exercise_login_success')
    input('输入任意内容继续')
    driver.get('https://www.kingname.info')
    input('输入任意内容继续')
    driver.get('http://exercise.kingname.info/exercise_login_success')
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4. 常见的隐藏Selenium特征的方法

    隐藏Selenium特征是实现自动化网页测试的关键。通过以下三种方法,我们可以让浏览器看起来更像正常的用户,避免被网站检测到并拒绝访问。综合下面的几种selenium特征隐藏方式,以采集大众点评的评论为案例,结合实际爬虫采集过程中需要使用的代理IP池,提供如下demo:

    4.1 修改navigator.webdriver标志

    navigator.webdriver是一个浏览器提供的属性,用于表示浏览器是否由webdriver控制。默认情况下,如果浏览器由Selenium驱动,这个标志的值为true,否则为false。我们可以通过execute_cdp_cmd命令来执行Google Chrome DevTools命令,从而修改这个标志的值为false或者undefined,以隐藏Selenium的特征。

    4.2 改变user-agent

    user-agent是一个浏览器发送给网站的字符串,用于表示浏览器的类型和版本。有些网站会根据user-agent来判断用户的设备和操作系统,如果发现user-agent不符合正常的范围,就会怀疑是Selenium驱动的浏览器。我们可以通过execute_cdp_cmd命令来设置Network.setUserAgentOverride参数,从而改变user-agent为任意我们想要的值,以隐藏Selenium的特征
    enable-automation和useAutomationExtension是两个常见的Selenium相关开关,它们会影响浏览器的行为和外观,比如在浏览器窗口上显示“Chrome正在受到自动软件的控制”的提示。我们可以通过Chrome选项来添加或删除这些开关,从而让浏览器看起来更像正常的浏览器,以隐藏Selenium的特征。

    4.3 排除或关闭一些Selenium相关的开关

    enable-automation和useAutomationExtension是两个常见的Selenium相关开关,它们会影响浏览器的行为和外观,比如在浏览器窗口上显示“Chrome正在受到自动软件的控制”的提示。我们可以通过Chrome选项来添加或删除这些开关,从而让浏览器看起来更像正常的浏览器,以隐藏Selenium的特征。

    4.4 代码展示

      from selenium import webdriver
      from selenium.webdriver.common.proxy import Proxy, ProxyType
      # 亿牛云爬虫加强版代理IP 地址、端口号、用户名和密码
      proxy_address = 'www.16yun.cn'
      proxy_port = '3100'
      proxy_username = '16YUN'
      proxy_password = '16IP'
      # 设置Chrome选项,包括隐藏Selenium特征、设置代理IP和排除或关闭一些Selenium相关开关
      options = webdriver.ChromeOptions()
      options.add_argument('--disable-blink-features=AutomationControlled')
      options.add_argument('--disable-extensions')
      options.add_argument('--disable-gpu')
      options.add_argument('--disable-infobars')
      options.add_argument('--disable-notifications')
      options.add_argument('--disable-popup-blocking')
      options.add_argument('--disable-web-security')
      options.add_argument('--ignore-certificate-errors')
      options.add_argument('--no-sandbox')
      options.add_argument('--start-maximized')
      options.add_argument('--user-data-dir=/dev/null')
      options.add_argument('--proxy-server={}'.format(proxy_address + ':' + proxy_port))
      options.add_argument('--proxy-auth={}:{}'.format(proxy_username, proxy_password))
      options.add_experimental_option('excludeSwitches', ['enable-automation', 'useAutomationExtension'])
      # 初始化Chrome浏览器,并使用上述选项
      driver = webdriver.Chrome(options=options)
      # 隐藏navigator.webdriver标志,将其值修改为false或undefined
      driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
          'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
      })
      # 设置user-agent,改变user-agent的值
      user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
      driver.execute_cdp_cmd("Network.setUserAgentOverride", {"userAgent": user_agent})
      # 访问大众点评中商品的评论页面
      url = 'https://www.dianping.com/shop/1234567/review_all'
      driver.get(url)
      # 在此处添加其他代码来执行您想要的任务
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    4.5 总结

    此代码将使用Chrome浏览器,并在启动浏览器时使用选项隐藏Selenium特征、设置用户名和密码方式的代理IP和排除或关闭一些Selenium相关开关。然后,使用execute_cdp_cmd命令来执行Google Chrome DevTools协议中的命令,将navigator.webdriver标志的值修改为false或undefined。使用execute_cdp_cmd命令来设置Network.setUserAgentOverride参数,将user-agent更改为指定的user-agent字符串。最后,访问大众点评中商品的评论页面,并在此处添加其他代码来执行您想要的任务。

  • 相关阅读:
    Redis<一>-redis简介与安装
    使用vite搭建vue3
    pytorch 1.6.0源码编译问题
    Nacos配置中心用法详细介绍
    Java基础系列(八)——线程池详解
    Unity游戏Mod/插件制作教程02 - 开发环境准备
    K8s ingress-controller中nginx文件上传大小的限制
    LeetCode每日一题——1752. 检查数组是否经排序和轮转得到
    KVM Cloud云平台
    如何解决工业交换机出现温度过高问题?
  • 原文地址:https://blog.csdn.net/weixin_44388373/article/details/133026472