Redbubble自动上传程序:验证码、Cookie登录及弹窗处理求助
Redbubble自动上传程序问题解决方案
一、验证码处理
Redbubble的反爬验证码直接用Selenium很难自动识别,给三个可行方案:
- 接入打码平台:把验证码区域截图传给第三方打码API,拿到识别结果后自动填充输入框。
- 手动介入:脚本触发验证码时暂停,提示你手动完成验证,验证通过后再继续执行。
- 换用undetected-chromedriver:这个是修改过的ChromeDriver,能绕过大部分反爬检测,降低验证码出现的概率。
二、Cookie复用失败修复
你的Cookie复用代码有几个关键错误,修复后就能正常复用登录状态:
- 获取Cookie前必须确保完全登录,别用固定
sleep,改用显式等待直到登录成功的元素出现(比如个人中心图标)。 - 添加Cookie前必须先访问Redbubble域名,否则Cookie无法绑定到正确站点。
- 过滤Cookie里的不兼容字段,比如
expiry要转成整数,sameSite字段可能导致添加失败,直接删掉。
修复后的Cookie复用代码:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pickle # 首次登录并保存Cookie path = Service(r'C:\Users\yazha\OneDrive\Pictures\New folder\chromedriver.exe') driver = webdriver.Chrome(service=path) driver.get('https://www.redbubble.com/') # 等待登录按钮可点击并点击 WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "Login"))).click() # 填写账号密码 WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "ReduxFormInput1"))).send_keys("你的账号") WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "ReduxFormInput2"))).send_keys("你的密码") # 点击登录按钮 WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "app-ui-components-Button-Button_button_1_MpP"))).click() # 等待登录完成(验证个人中心元素出现) WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "a[href='/account']"))) # 保存Cookie到本地文件 pickle.dump(driver.get_cookies(), open("redbubble_cookies.pkl", "wb")) driver.quit() # 复用Cookie登录 driver = webdriver.Chrome(service=path) driver.get('https://www.redbubble.com/') # 加载并添加Cookie cookies = pickle.load(open("redbubble_cookies.pkl", "rb")) for cookie in cookies: # 处理过期时间和不兼容字段 if 'expiry' in cookie: cookie['expiry'] = int(cookie['expiry']) if 'sameSite' in cookie: del cookie['sameSite'] try: driver.add_cookie(cookie) except Exception as e: print(f"Cookie添加失败: {e}") driver.refresh() # 验证登录状态 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "a[href='/account']")))
三、手动操作时的弹窗处理
分两种弹窗类型处理:
- 系统弹窗(alert/confirm):用Selenium的弹窗切换方法处理:
try: alert = WebDriverWait(driver, 5).until(EC.alert_is_present()) alert.accept() # 确认弹窗,取消用alert.dismiss() except: pass # 没弹窗就跳过
- 自定义弹窗:找到弹窗的关闭按钮元素,定位后点击:
try: close_btn = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".modal-close"))) close_btn.click() except: pass
四、基于CSV的批量上传实现
先准备好CSV文件(比如upload_list.csv),字段包含image_path(本地图片路径)、title(作品标题)、description(描述)、tags(标签,用逗号分隔),然后用以下代码实现批量上传:
import csv from selenium.webdriver.common.keys import Keys # 读取CSV数据 with open('upload_list.csv', 'r', encoding='utf-8') as csv_file: reader = csv.DictReader(csv_file) for item in reader: # 进入上传页面 driver.get('https://www.redbubble.com/upload') # 上传图片:找到文件输入框,传入本地路径 upload_input = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='file']"))) upload_input.send_keys(item['image_path']) # 填充标题和描述 WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "title"))).send_keys(item['title']) WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "description"))).send_keys(item['description']) # 输入标签(每个标签输入后按回车) tag_input = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "tags-input"))) for tag in item['tags'].split(','): tag_input.send_keys(tag.strip()) tag_input.send_keys(Keys.ENTER) # 提交上传 WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "app-ui-components-Button-Button_button_1_MpP"))).click() # 等待上传完成,可根据成功提示调整定位 WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".upload-success")))
内容的提问来源于stack exchange,提问作者Yazhamuthan
相关产品推荐
相关产品推荐

