Selenium绕过浏览器指纹的九种方法

发表于:2023-2-17 09:41

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:THMAIL    来源:CSDN

  方法一、使用stealth.min.js
  去https://github.com/berstend/puppeteer-extra下载。
  反正我是没成功,大家仅供参考:
  def mergeStealthJS(self, browser):
      # https://bot.sannysoft.com/
      if not os.path.exists('stealth.min.js'):
          url = 'https://cdn.jsdelivr.net/gh/requireCool/stealth.min.js/stealth.min.js'
          resp = requests.get(url)
          with open('stealth.min.js', 'w+') as f:
              f.write(resp.text)
      with open('stealth.min.js', 'r') as f:
          content = f.read()
      browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': content})
      return browser
  方法二、关闭一些特征
  没成功,大家参考下:
      option = ChromeOptions()
      option.add_experimental_option('excludeSwitches', ['enable-automation'])
      option.add_argument("disable-blink-features=AutomationControlled")
      option.add_experimental_option('useAutomationExtension', False)
      browser = webdriver.Chrome(options=option)
      # browser = webdriver.Firefox()
      browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
          'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
      })
      with open('stealth.min.js') as f:
          js = f.read()
      browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
          "source": js
      })
      stealth(browser,
              languages=["en-US", "en"],
              vendor="Google Inc.",
              platform="Win32",
              webgl_vendor="Intel Inc.",
              renderer="Intel Iris OpenGL Engine",
              fix_hairline=True,
              )
      browser.get("https://bot.sannysoft.com/")
      time.sleep(100)
  方法三、使用selenium-stealth
  我也没成功,大家可以试试:
  pip3 install selenium-stealth
  from selenium import webdriver
  from selenium.webdriver.chrome.options import Options
  from selenium.webdriver.chrome.service import Service
  from selenium_stealth import stealth
  options = Options()
  options.add_argument("start-maximized")
  # Chrome is controlled by automated test software
  options.add_experimental_option("excludeSwitches", ["enable-automation"])
  options.add_experimental_option('useAutomationExtension', False)
  s = Service('C:\\BrowserDrivers\\chromedriver.exe')
  driver = webdriver.Chrome(service=s, options=options)
  # Selenium Stealth settings
  stealth(driver,
        languages=["en-US", "en"],
        vendor="Google Inc.",
        platform="Win32",
        webgl_vendor="Intel Inc.",
        renderer="Intel Iris OpenGL Engine",
        fix_hairline=True,
    )
  driver.get("https://bot.sannysoft.com/")
  方法四:方法1+2+3组合使用
  试了,没用,大家可以自行测试下。
  方法五: 中间人代理mitmproxy
  太繁琐了,没测试,而且各种值的修改需要你自己写代码一行行替换,稍有更新就不行了,极不推荐。
  方法六:pyppeteer
  对我无效,大家自行测试。
  puppeteer,这玩意儿是一个基于node.js的chrome官方框架,主要用于操作谷歌无头模式进行各种操作,pyppeteer则是puppeteer的python版本。
  它的作用和selenium是类似的,通过脚本操作无头谷歌,但是它并不会有selenium那么多的特征字符串,可以做到完全把“自己”当作真人操作。当然,它还是有缺点的.虽然puppeteer一直在更新,但是pyppeteer已经停止更新将近一年了,所以无法保证它以后是否可用。同样因为它是基于谷歌无头的,因此它只能用于谷歌无头,不想selenium一样,编写完脚本只需改变少量代码,便可以在多种浏览器中运行。下面是pyppeteer的官方文档:
  Pyppeteer’s documentationmiyakogi.github.io
  下面是一个简单的demo
  import asyncio
  from pyppeteer import launch
  async def main():
      browser = await launch()
      page = await browser.newPage()
      await page.goto('file:///C:/Users/Administrator/Desktop/js.html')
      print(await page.content())
  asyncio.get_event_loop().run_until_complete(main())
  如果你电脑中没有chromium,执行这段代码后会自动帮你安装,然后再运行这段代码,但是非常慢,所以建议自己网上下载chromium后再执行脚本。
  方法七:重编译chromedriver或者selenium
  StackOverflow有大神放出自己修改的版本,但版本很低,自己去修改比中间人修改还麻烦,不推荐。
  方法八:接管已有的chrome
  亲测可用,唯一的遗憾是会导致你在脚本运行时,不能使用chrome,且每次数据不会清除,需要自己用selenim去设置清除下,此举也会清除自己日常使用chrome的数据;
  大家自行尝试:
  from selenium import webdriver
  from selenium.webdriver.chrome.options import Options
  os.system(r'start chrome --remote-debugging-port=9527')
  chrome_options = Options()
  chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9527")
  chrome_driver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
  driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options)
  print(driver.title)
  方法九、使用undetected-chromedriver
  这个确实成功了~,无副作用!!!
  GitHub - ultrafunkamsterdam/undetected-chromedriver: Custom Selenium Chromedriver | Zero-Config | Passes ALL bot mitigation systems (like Distil / Imperva/ Datadadome / CloudFlare IUAM)
  pip3 install undetected_chromedriver
  import undetected_chromedriver as uc
  driver = uc.Chrome()
  driver.get('https://nowsecure.nl')
  还有一点要注意:
  异常现象:
  如果使用pyinstaller对undetected-chromedriver直接进行打包,那打包后的exe大概率无法运行的。
  解决方法:
  在代码最开始在import 模块之前加上以下内容,然后再进行打包即可:
  from multiprocessing import freeze_support
  freeze_support()
  原因解析:
  在调用某些模块的时候,也是进程,而在多进程中,你程序中的进程不会被阻塞,而一直循环起进程。而undetected-chromedriver内部正好就开了进程。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号