Selenium隐藏浏览器特征

2023-11-02

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)

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

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)

3. undetected_chromedriver

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

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

首先,我们安装依赖库

# 安装依赖
pip3 install undetected-chromedriver

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

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)

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)

然后,利用 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')


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)
  # 在此处添加其他代码来执行您想要的任务

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字符串。最后,访问大众点评中商品的评论页面,并在此处添加其他代码来执行您想要的任务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Selenium隐藏浏览器特征 的相关文章

随机推荐

  • 上海万得信息技术 2014笔试题 性格测试 武汉

    看清前面的A B C D哦 后面19题开始都是D C B A 把选好的写下 看哪个选的多 最终就偏向什么性格 比如A选的最多就是A性格 1 关于人生观 我的内心其实是 A 希望能够有尽量多的人生体验 所以会有非常多样化的想法 B在小心合理的
  • 使用DBeaver加载自定义连接驱动jar

    使用DBeaver加载自定义驱动jar 点击数据库 驱动管理器 新建
  • C++ Vector用法(带例程)

    介绍 vector是可变大小数组的序列容器 vector是连续存储的 与数组存储相同 区别是大小是动态改变的 可随机访问 因此vector访问速度快 vector在末尾删除添加元素时相对高效 若在其他任意位置添加删除元素则效率更低 使用 1
  • Window系统下如何生成ssh key以及如何在码云中添加公钥

    前言 本篇文章是以window系统和码云为例讲解如何在window系统下生成ssh key 然后在码云中添加公钥 然后可以远程仓库的ssh地址克隆远程git仓库代码 一 首先在window下生成ssh key 1 首先要在我们的电脑下安装g
  • 码字必备:18 款优秀的 Markdown 写作工具

    现在是 2015 年底 自 2004 年 John Gruber1创造 Markdown 语言以来 已经过去了 11 年 在这 11 年里 Markdown 语言从程序员圈子中逐渐扩散开来 成为了越来越多的电脑写作者第一选择 随着使用人群的
  • go-zero&go web集成redis实战

    前言 上一篇 go zero go web集成JWT和cobra命令行工具实战 从零开始基于go zero搭建go web项目实战 03集成redis实战 源码仓库地址 源码 https gitee com li zheng treasur
  • 请确保在bios菜单中启用了磁盘的控制器

    进入 BIOSS 然后看看 启动里面是不是把硬盘启动关了 是的话 打开就好了
  • 目标检测入门:帧差法,光流法和背景减法

    概述 运动目标检测是指当监控场景中有活动目标时 采用图像分割的方法从背景图像中提取出目标的运动区域 运动目标检测技术是智能视频分析的基础 因为目标跟踪 行为理解等视频分析算法都是针对目标区域的像素点进行的 目标检测的结果直接决定着智能视觉监
  • C语言-位段详解

    1 位段的定义 位段是定义结构体 或联合体 中的成员变量所占的空间 单位是bit 含有位段的结构体 联合体 称为位段结构 2 位段的意义 能够节省空间 比如性别 2个bit位可以表示2 2 4种可能性 不需要一个整形32个bit位 3 位段
  • idea中快捷键Ctrl+Shift+F冲突

    Ctrl Shift F在idea中的作用是全文或全项目搜索某个词的使用 windows系统自带的微软输入法中简繁体切换的快捷键也是Ctrl Shift F 会导致冲突 如果对简繁体切换需求没那么大 建议将输入法的快捷键关闭 具体操作为 在
  • 三阶矩阵求特征值的快速算法

    一般的三阶矩阵求特征值其实是解析不了的 因为特征方程对应的是三次方程 对于一般的三次方程 是很难求解的 要想方程有三个整数根 并且能够不用完全暴力展开三阶行列式这样的矩阵实际是很特殊的 1 某一行有两个0的情况是最好算的情况 分块上 下三角
  • 2023.7.13

    代码讲解01 PTA 7 38 等边三角形面积 数学基础对于程序设计能力而言很重要 对于等边三角形面积 请选择合适的方法计算之 输入格式 测试数据有多组 处理到文件尾 每组测试输入1个实数表示等边三角形的边长 输出格式 对于每组测试 在一行
  • 开源考试系统

    项目介绍 学之思开源考试系统是一款 java vue 的前后端分离的考试系统 主要优点是开发 部署简单快捷 界面设计友好 代码结构清晰 支持web端和微信小程序 能覆盖到pc机和手机等设备 支持多种部署方式 集成部署 前后端分离部署 doc
  • 为什么推荐编程初学者学习C(C++)/Python?

    人类走进信息化时代 掌握计算机编程是一项不错的技能 培养逻辑思维 解决现实中实际问题的能力 学会将计算机作为人类思想和能力的延展性工具 计算机行业寒冬 但AI和互联网仍然是未来发展的大趋势 学习C语言和Python的区别在哪 为什么选这俩
  • (CVPR2019)图像语义分割(18) DANet-集成双路注意力机制的场景分割网络

    论文地址 Dual Attention Network for Scene Segmentation 工程地址 github链接 1 介绍 该论文提出新型的场景分割网络DANet 利用自注意力机制进行丰富语义信息的捕获 在带有空洞卷积的FC
  • 详解BGP 双平面

    拓扑描述 上平面为A 面 AS1 下平面为B 面 AS2 左边用户群 AS3 右边用户群 AS4 组成两个平面的原因 两个城市之间的数据交互 分为业务流量和办公流量 于此同时 希望业务流量走 上面 办公流量走下面 流量的组成会很清晰 同时两
  • 用windows系统做服务器配置,windows系统做服务器配置

    windows系统做服务器配置 内容精选 换一换 迁移前 您需要设置目的端服务器 该目的端用来接收源端的数据 同时您也可以使用该目的端进行迁移测试和启动目的端 只有 迁移阶段 gt 迁移实时状态 为时才可设置目的端 进入 主机迁移服务 页面
  • Windows10神州网信政府版的配置修改

    Windows10神州网信政府版初始安装完成后 在有些界面上呈现 某些设置已隐藏或由你的组织管理 这就意味着有很多属性并不能由使用者修改 这对用户来说很不不方便 下面是经常用到的一些属性修改 1 修改屏幕保护属性 按Win键 R键调出运行框
  • 排序算法之分治排序

    归并排序是基于分治法实现的 归并排序将待排序的元素序列分为两个长度相等的子序列 为每一个子序列排序 然后再将它们合并成一个序列 合并两个子序列的过程称为两路归并 在执行两路归并算法时 先把待归并元素序列L1复制到辅助数组L2中 再从L2归并
  • Selenium隐藏浏览器特征

    Selenium隐藏浏览器特征 Selenium特征 1 CDP 2 stealth min js 3 undetected chromedriver 4 操作已开启的浏览器 4 常见的隐藏Selenium特征的方法 4 1 修改navig