Python Selenium开发Nike SNKRS Bot遇反爬检测,登录页受阻求解
解决Nike SNKRS Bot被检测为机器人的问题
问题描述
我使用Python的Selenium库开发适配Chrome浏览器的Nike SNKRS Bot,选用主流WebDriver进行管理,但卡在了Nike登录页面。执行代码后页面出现错误提示:“Error parsing response from server”,确定Nike将程序检测为机器人,无法继续操作。我的代码如下:
import time from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as ec from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.proxy import Proxy, ProxyType from random_user_agent.user_agent import UserAgent from selenium.common.exceptions import TimeoutException, WebDriverException from random_user_agent.params import SoftwareName, OperatingSystem import traceback options = Options() options.add_argument("--start-maximized") options.add_experimental_option('excludeSwitches', ['enable-logging']) options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_argument('--disable-blink-features=AutomationControlled') options.add_argument('--lang=en') options.add_experimental_option('useAutomationExtension', False) user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36' options.add_argument('user-agent={0}'.format(user_agent)) options.add_argument("--disable-gpu") options.add_argument("--window-size=1420,1080") service=Service('C:\\chromedriver_win32\\chromedriver.exe') driver = webdriver.Chrome(options=options,service=service) driver.delete_all_cookies() driver.execute_script('return navigator.webdriver') driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"}) driver.get('https://www.nike.com') def send_keys_delay(controller,keys,delay=1): controller.click() for key in keys: controller.send_keys(key) time.sleep(delay) controller.send_keys(Keys.RETURN) try: elem=WebDriverWait(driver,5).until( ec.presence_of_element_located((By.ID,"hf_cookie_text_cookieAccept")) ) print(elem.text) elem.click() except: traceback.print_exc() driver.quit() time.sleep(3) try: elem=driver.find_element(By.ID,"hf_title_signin_membership") elem.click() except Exception: traceback.print_exc() driver.quit() try: elem=WebDriverWait(driver,5).until( ec.element_to_be_clickable((By.ID,"username"))) email="myemail@gmail.com" send_keys_delay(elem,email) except Exception: traceback.print_exc() driver.quit()
可行的Selenium优化方案
Nike的反爬机制严格,但通过调整配置和行为模拟,仍有概率绕过检测:
- 匹配ChromeDriver与浏览器版本:确保ChromeDriver的版本和你本地Chrome浏览器完全一致,版本不匹配是常见的检测触发点。
- 优化浏览器指纹:
- 替换硬编码的UA,用
random_user_agent动态生成真实的随机UA,避免使用过时的固定UA:software_names = [SoftwareName.CHROME.value] operating_systems = [OperatingSystem.WINDOWS.value, OperatingSystem.MACOS.value] user_agent_rotator = UserAgent(software_names=software_names, operating_systems=operating_systems, limit=100) user_agent = user_agent_rotator.get_random_user_agent() options.add_argument(f'user-agent={user_agent}') - 添加更多隐私与反检测参数:
options.add_argument("--disable-dev-shm-usage") options.add_argument("--no-sandbox") options.add_argument("--disable-web-security") options.add_argument("--disable-features=VizDisplayCompositor")
- 替换硬编码的UA,用
- 模拟真实用户交互:
- 替换固定的
time.sleep,全程用WebDriverWait等待元素条件,减少不必要的固定延迟。 - 输入时使用随机延迟(比如0.2-0.8秒),模拟人类打字的不均匀速度,修改
send_keys_delay函数:import random def send_keys_delay(controller,keys): controller.click() for key in keys: controller.send_keys(key) time.sleep(random.uniform(0.2, 0.8)) controller.send_keys(Keys.RETURN) - 用
ActionChains模拟鼠标移动到元素再点击的动作,更贴近真实用户操作:from selenium.webdriver.common.action_chains import ActionChains # 替换原有的elem.click() actions = ActionChains(driver) actions.move_to_element(elem).click().perform()
- 替换固定的
- 彻底隐藏
navigator.webdriver:
原代码的处理不够彻底,改用CDP命令在页面加载前注入脚本,覆盖所有页面的检测:# 放在driver.get()之前执行 driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ })
替代方案
如果Selenium优化后仍无法绕过检测,可尝试以下方案:
- 使用Playwright:微软推出的自动化工具,默认自带反检测优化,能自动隐藏大部分自动化特征,语法和Selenium接近,对反爬网站兼容性更强。
- 直接调用API:抓包分析Nike的登录、商品接口,用
requests或httpx直接发送请求,完全避开浏览器层面的检测,但需要处理签名、Cookie、Token等复杂验证逻辑,开发难度更高。 - 使用undetected-chromedriver:Selenium的分支库,专门针对反爬做了优化,自动处理浏览器指纹、WebDriver检测等问题,无需手动配置大量参数。
内容的提问来源于stack exchange,提问作者JustDarkForce
相关产品推荐
相关产品推荐

