关于webdriver的几点思考

文章讲述了如何使用selenium和selenium-stealth库来隐藏webdriver特征,以避免网站检测。作者介绍了添加选项、修改get方法和保护toString等策略,以提高自动化测试的隐蔽性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好多网站检测自动化的时候必不可少的要检测webdriver,正常的浏览器中返回的值是这样的

这个属性是定义在原型上的Navigator.prototype.webdriver,其中webdriver是通过get方法获取到的

如果通过selenium访问网站之后,会是这样的

查阅了大佬们的帖子后,发现一个有用的库selenium-stealth,这个可以隐藏webdriver特征,于是乎说干就干

from selenium import webdriver
from selenium_stealth import stealth
import time

options = webdriver.ChromeOptions()
options.add_argument("start-maximized")

# options.add_argument("--headless")

options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r"chromedriver.exe")

stealth(driver,
        languages=["zh-CN", "zh"],
        vendor="Google Inc.",
        platform="Win32",
        fix_hairline=True,
        )

url = "https://bot.sannysoft.com/"
# url = "https://nowsecure.nl/"
driver.get(url)
time.sleep(100)
driver.quit()

呦呵,貌似结果还不错,不过我们在深入的看一下他这个库的源代码

原来是这样搞的,这就不禁的倒吸一口冷气,这不是妥妥的被检测么

暴力美学就这么玩么,就这样删了,一了百了?还是要梳理一下,这个是通过get方法实现的,必须还是要从get方法上下手,在原型上重新定义get方法,比如这样。

function get_webdriver() {
        return false;
    }
    
Object.defineProperty(Navigator.prototype, 'webdriver', {
        get: get_webdriver
    })

不过这样还是会被检测到,比如

再比如

这里就留一个作业吧,大佬们肯定都会,我就不班门弄斧了,成品是这样的

还有一个

总结一下

1.tostring要保护好

2.get方法不能丢

3.方法名称要搞对

否则妥妥的检测点

<think>好的,我现在需要帮助用户解决在Windows 11上使用Python和Selenium编写抢购脚本的问题。首先,用户的需求很明确,他们需要一个自动化脚本来抢购商品,并且指定了Windows 11系统。虽然Selenium本身是跨平台的,但可能需要注意一些Windows 11特有的设置,比如浏览器驱动兼容性或系统权限的问题。 首先,我应该回顾已有的引用内容。引用[2]和[3]提供了Python和Selenium抢购脚本的基本结构,包括导入必要的库、设置浏览器选项、访问URL、登录、定时等待和下单流程。引用[4]提到了处理iframe和配合AHK输入支付密码的问题,这可能在支付环节需要特别注意。此外,引用[3]中的京东抢购脚本示例可能是一个好的起点,但用户可能需要针对Windows 11进行调整。 接下来,我需要确保回答的结构清晰,按照用户的要求分步骤说明。用户可能需要知道环境配置、浏览器驱动安装、脚本编写要点以及优化方法。同时,用户可能关心如何处理常见的挑战,如登录验证、元素定位、时间同步和高并发处理。 需要注意以下几点: 1. **环境配置**:确保Python和Selenium库正确安装,推荐使用Chrome或Edge浏览器,因为它们对Windows 11支持较好。需要下载对应的WebDriver,如ChromeDriver或Microsoft Edge WebDriver,并注意版本匹配。 2. **浏览器选项设置**:引用[3]中提到设置无头模式和其他参数,但抢购可能需要禁用无头模式,因为有些网站会检测无头浏览器。不过用户可能希望尽可能快速,需要权衡是否使用无头模式。 3. **显式等待**:使用WebDriverWait来确保元素加载完成,避免因页面加载延迟导致的失败。引用[3]中使用了expected_conditions,这一点很重要。 4. **定时抢购逻辑**:需要准确获取服务器时间,可能通过NTP同步,或者在脚本中循环检查时间,确保在抢购开始时立即执行点击操作。 5. **处理验证码和登录**:引用[4]提到使用AHK输入密码,但自动化处理验证码可能比较复杂,可能需要第三方服务或手动介入。 6. **支付环节处理**:引用[4]指出支付页面可能有iframe,需要切换到对应的frame才能定位元素,或者使用AHK脚本辅助输入。 7. **异常处理**:在脚本中加入重试机制和错误捕获,提高脚本的鲁棒性。 可能的挑战包括网站的反爬虫机制,如检测自动化工具、频繁访问的限制等。需要建议用户合理设置等待时间,避免被封IP,或者使用代理。 最后,根据用户的要求生成相关问题,这些问题应该围绕性能优化、反检测方法、跨平台兼容性等展开。 现在,我需要将这些思考整理成一个结构化的回答,确保符合用户给出的格式要求,使用正确的中文表达,并引用提供的参考文献。同时,要避免使用Markdown格式,但根据用户提供的示例,可能需要使用代码块来展示脚本示例。需要检查LaTeX语法是否正确,但在这个问题中可能用不到数学公式,所以可能可以忽略。不过,用户提到系统级指令中要求行内数学表达式用$...$,但当前问题不涉及数学内容,所以可能不需要处理。 总结回答的结构: 1. 环境准备 2. 基础脚本示例 3. 关键要点 4. 优化建议 5. 注意事项 6. 相关问题 确保每个部分都清晰,并且引用正确的文献,比如处理iframe参考引用[4],基础脚本参考引用[3]等。同时,在回答末尾添加相关问题,帮助用户进一步探索。</think>### Windows 11 抢购脚本实现步骤 (Python + Selenium) #### 1. 环境准备 - **安装Python**:从官网下载适用于Windows 11的Python 3.10+版本。 - **安装Selenium库**:通过命令 `pip install selenium` 安装。 - **下载浏览器驱动**: - Chrome:下载与本地Chrome版本匹配的 [ChromeDriver](https://sites.google.com/chromium.org/driver/)。 - Edge:下载 [Microsoft Edge WebDriver](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)。 - **驱动路径配置**:将驱动文件放在系统环境变量路径或脚本同级目录。 #### 2. 基础脚本示例(参考京东抢购逻辑[^3]) ```python import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 浏览器配置(以Chrome为例) options = webdriver.ChromeOptions() options.add_argument("--disable-blink-features=AutomationControlled") # 禁用自动化检测 # options.add_argument("--headless") # 谨慎使用无头模式,可能被反爬 driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, 10) try: driver.get("https://item.jd.com/商品ID.html") # 替换为目标商品链接 # 等待抢购按钮加载并点击 buy_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#btn-reservation"))) buy_button.click() # 自动提交订单(需提前登录) submit_button = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "checkout-submit"))) submit_button.click() print("抢购成功!") except Exception as e: print(f"执行失败: {e}") finally: driver.quit() ``` #### 3. 关键要点 - **时间同步**:通过NTP协议校准本地时间,或循环检测页面倒计时元素(如京东的`#triggerTime`)[^3]。 - **登录处理**: - 提前手动登录并保存Cookies(需定期更新)。 - 使用Selenium自动填充账号密码(可能触发验证码)。 - **支付环节**: - 针对淘宝/京东的支付页面iframe,需切换至对应框架: ```python driver.switch_to.frame("payment-iframe") # 根据实际iframe名称调整 ``` - 配合AutoHotkey(AHK)输入密码(如引用[4]的方案)。 #### 4. 优化建议 - **并发控制**:使用多线程或分布式进程同时运行多个浏览器实例。 - **反检测策略**: - 随机化操作间隔时间(如 `time.sleep(random.uniform(0.1, 0.5))`)。 - 修改WebDriver属性(如 `driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"})`)。 - **错误重试**:在点击失败时加入循环重试机制。 #### 5. 注意事项 - **法律与道德**:确保脚本使用符合平台规则,避免高频请求导致封号。 - **动态元素**:定期检查页面元素选择器是否失效(如京东按钮ID可能变更)。 - **验证码绕过**:复杂验证码需结合第三方打码平台(如超级鹰)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值