You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CasperJS登录Amazon时遭Cookie弹窗拦截问题求助

Amazon登录脚本Cookie弹窗问题及解决方案

问题描述

我正在编写基于CasperJS的Amazon账号登录脚本,2023年Amazon登录流程是先输入邮箱,再跳转至密码输入页。目前已实现邮箱输入并点击“continue”按钮,但之后出现要求启用Cookie的弹窗,且无“全部接受”选项。调试日志显示页面已加载(HTTP 200),但调用getPageContent()下载的却是错误页面源码,即使不输入邮箱直接点击continue也会出现该问题。已尝试在PhantomJS中启用cookiesEnabled配置,但无效。想请教:

  • 是否有其他方法在PhantomJS中为Amazon启用所需Cookie、绕过该弹窗?
  • 切换到Selenium搭配其他无头浏览器是否可行?

参考代码

var casper = require('casper').create( {
    verbose: true, 
    logLevel: 'debug',
    userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
    pageSettings: {
        cookiesEnabled: true,
        loadImages: false,
        loadPlugins: false
    }
});

casper.start('https://www.amazon.com/', function() {
  // Wait for the page to load
  this.waitForSelector('#nav-link-accountList', function() {
    // Click on ....
    this.click('#nav-link-accountList');
  });
});

var email = "my email";
var pass = "test"; 

var email_field_id = '#ap_email';
var continue_button_id = 'input#continue';
var password_field_id = 'input#ap_password';
var submit_button_id = '#signInSubmit'

casper.then(function() {
  this.waitForSelector(email_field_id, function() {  
    this.sendKeys(email_field_id, email);
  });
});

casper.then(function() {
    this.wait(2000, function() {
        this.click(continue_button_id);
    });
});

casper.then(function() { 
    casper.wait(5000, function() {
        this.capture('login.png');
        var html = this.getPageContent();
        this.download(html, 'signin.html');
});

casper.run();

解决方案

一、CasperJS/PhantomJS的优化尝试

1. 手动注入同意Cookie

Amazon的Cookie弹窗依赖特定Cookie标识用户已同意,可在页面创建时手动注入抓包获取的有效Cookie:

casper.on('page.created', function(page) {
    // 注入模拟同意的核心Cookie(需从正常浏览器抓包获取有效值)
    page.addCookie({
        name: 'sp-cdn',
        value: 'L5Z9:US',
        domain: '.amazon.com',
        path: '/',
        httponly: false,
        secure: true
    });
    page.addCookie({
        name: 'i18n-prefs',
        value: 'USD',
        domain: '.amazon.com',
        path: '/',
        httponly: false,
        secure: true
    });
    // 可补充更多从浏览器获取的Amazon会话Cookie
});

提示:Cookie值需通过正常访问Amazon的浏览器抓包获取,确保在有效期内

2. 升级页面配置与请求头

  • 替换为更接近现代浏览器的User-Agent,避免被识别为旧版无头工具:
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
  • 启用JavaScript与本地存储,完善页面兼容性:
pageSettings: {
    cookiesEnabled: true,
    loadImages: false,
    loadPlugins: false,
    javascriptEnabled: true,
    localToRemoteUrlAccessEnabled: true,
    webSecurityEnabled: false // 关闭跨域限制,适配部分动态资源加载
}

3. 强制处理弹窗DOM

如果弹窗是动态加载的,尝试执行JS触发同意逻辑或直接移除弹窗:

casper.then(function() {
    this.waitForSelector('#sp-cc', function() {
        this.evaluate(function() {
            // 优先调用页面内置的同意函数
            if (window.SP?.CC?.acceptAll) {
                window.SP.CC.acceptAll();
            } else {
                // 强制移除弹窗容器
                document.getElementById('sp-cc').remove();
            }
        });
    });
});

二、切换到Selenium+无头浏览器的可行性

完全可行,且是更推荐的方案:

  • PhantomJS已停止维护,对现代网站的JS、Cookie机制兼容性极差,极易被Amazon的反爬机制识别
  • Selenium搭配Chrome Headless或Firefox Headless,对现代浏览器特性支持完善:
    • 可直接模拟正常用户的Cookie同意操作,无需手动注入Cookie
    • 支持最新的JS引擎与浏览器API,不容易被反爬拦截
    • 社区资源丰富,问题排查更高效

示例Selenium Python核心逻辑:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = Options()
options.add_argument('--headless=new')
options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36')

driver = webdriver.Chrome(options=options)
driver.get('https://www.amazon.com/')

# 处理Cookie弹窗
try:
    accept_btn = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, 'sp-cc-accept'))
    )
    accept_btn.click()
except:
    pass # 无弹窗则跳过

# 点击登录入口
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'nav-link-accountList'))).click()

# 输入邮箱并跳转密码页
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'ap_email'))).send_keys('your-email')
driver.find_element(By.ID, 'continue').click()

# 后续输入密码等逻辑...

内容的提问来源于stack exchange,提问作者Jhon Meron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:32:44