基于 Python 与 Selenium 的电商商品自动化抢购脚本实现
前言
在电商大促期间,热门商品往往需要在特定时间点进行抢购。手动操作受限于网络延迟和反应速度,难以保证成功率。利用 Python 结合 Selenium 自动化测试框架,可以模拟用户行为,实现准点自动点击、提交订单甚至支付的功能。本文旨在从技术角度讲解如何构建一个基础的自动化抢购脚本,重点在于理解浏览器自动化原理、元素定位策略以及时间同步机制。
重要提示:本教程仅供学习 Python 自动化技术使用。请勿用于恶意刷单、破坏商家系统或违反平台服务条款的行为。合理使用技术,遵守法律法规。
一、环境准备
1.1 安装 Python 环境
确保已安装 Python 3.6 及以上版本。可通过命令行输入 python --version 检查。
1.2 安装依赖库
项目主要依赖以下第三方库:
selenium:用于控制浏览器。requests:用于获取服务器时间戳。time/datetime:用于时间计算。
使用 pip 安装:
pip install selenium requests
1.3 配置 ChromeDriver
Selenium 需要对应版本的 ChromeDriver 才能驱动 Chrome 浏览器。
- 访问 ChromeDriver 下载页面(如 Google 官方或镜像站)。
- 根据本地 Chrome 浏览器版本号下载匹配的 Driver。
- 将
chromedriver.exe放入 Python 环境变量路径下,或在代码中指定其绝对路径。 - 验证安装:在终端输入
chromedriver --version。
二、核心逻辑分析
2.1 浏览器初始化
使用 WebDriver 启动无头模式或普通模式浏览器。为了调试方便,初期建议开启可视化窗口。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def init_driver():
options = Options()
# options.add_argument('--headless') # 生产环境可开启无头模式
driver = webdriver.Chrome(options=options)
return driver
2.2 登录模拟
电商平台通常有复杂的登录流程(验证码、扫码等)。脚本需检测登录状态,若未登录则引导至登录页并等待人工扫码。
import time
from selenium.webdriver.common.by import By
def check_login_status(driver, login_url):
driver.get(login_url)
try:
# 查找登录按钮文本
if driver.find_element(By.LINK_TEXT, "亲,请登录"):
print("未登录,请扫码...")
driver.find_element(By.LINK_TEXT, "亲,请登录").click()
time.sleep(30) # 预留扫码时间
# 检测是否已登录(通过导航栏用户名判断)
if driver.find_elements(By.XPATH, '//*[@id="J_SiteNavMytaobao"]/div[1]/a/span'):
print("登录成功")
return True
else:
print("登录失败")
return False
except Exception as e:
print(f"异常:{e}")
return False
2.3 购物车处理
抢购前需清理购物车,避免误购其他商品。选中目标商品后清空其余项。
def prepare_cart(driver):
driver.get("https://cart.taobao.com/cart.htm")
time.sleep(1)
try:
# 全选商品
select_all_btn = driver.find_element(By.ID, "J_SelectAll1")
if select_all_btn:
select_all_btn.click()
print("已全选购物车")
except Exception:
print("购物车为空或元素未找到")
2.4 时间同步与倒计时
由于客户端时间与服务器时间存在偏差,必须通过 API 获取服务器标准时间,并计算差值。
import requests
import json
def get_server_time():
url = 'http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp'
resp = requests.get(url).text
data = json.loads(resp)
return int(data['data']['t'])
def calculate_diff(server_time, target_time_ms):
# target_time_ms 为毫秒级时间戳
current_ms = server_time * 1000
return target_time_ms - current_ms
2.5 下单与支付
当时间差小于阈值时,循环点击'去结算'和'提交订单'。支付环节涉及密码输入,需谨慎处理敏感信息。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
def submit_order(driver, password):
try:
# 等待'提交订单'按钮出现
go_btn = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "J_Go"))
)
go_btn.click()
# 循环提交订单
for i in range(20):
try:
submit_btn = driver.find_element(By.LINK_TEXT, '提交订单')
submit_btn.click()
print("订单提交成功")
break
except Exception:
time.sleep(0.01)
# 支付环节(仅演示,实际需加密处理)
if 'submit_succ' in locals() and submit_succ:
pwd_input = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, 'sixDigitPassword'))
)
pwd_input.send_keys(password)
auth_btn = driver.find_element(By.ID, 'J_authSubmit')
auth_btn.click()
print("付款成功")
except Exception as e:
print(f"下单失败:{e}")
finally:
time.sleep(60)
driver.quit()
三、优化与注意事项
3.1 反爬虫策略
电商平台会检测自动化行为。建议采取以下措施降低风险:
- 随机延迟:在操作间加入随机 sleep 时间。
- User-Agent 轮换:模拟真实浏览器指纹。
- IP 代理:避免单一 IP 高频请求。
3.2 异常处理
网络波动可能导致元素加载失败。应使用显式等待(Explicit Wait)替代固定 sleep,提高稳定性。
3.3 法律与道德风险
- 严禁利用脚本干扰正常交易秩序。
- 不得窃取用户隐私数据。
- 脚本运行结果归使用者所有,开发者不承担连带责任。
四、总结
通过本文,我们掌握了使用 Python 和 Selenium 进行网页自动化操作的基本方法。从环境搭建到具体的登录、抢购、支付流程,每个环节都体现了 Web 自动化测试的核心思想。在实际应用中,应根据具体平台的 DOM 结构调整选择器,并结合业务需求增加更完善的日志记录和监控功能。技术本身是中性的,关键在于使用者的目的与边界。

