代码逻辑解析:
-
时间设置:
mstime
设置了抢购时间。当前系统时间在循环中不断与该时间进行比较,当达到或超过抢购时间时,程序会开始执行结算和提交订单操作。
-
购物车全选:
- 程序首先会在购物车页面找到“全选”按钮,点击以全选购物车中的所有商品。通过
WebDriverWait
保证页面加载完成后再进行操作。
- 程序首先会在购物车页面找到“全选”按钮,点击以全选购物车中的所有商品。通过
-
结算操作:
- 程序会等待页面中的“结算”按钮出现,然后使用
ActionChains
模拟鼠标悬停并点击该按钮。
- 程序会等待页面中的“结算”按钮出现,然后使用
-
提交订单操作:
- 在结算成功后,程序会寻找“提交订单”按钮并执行点击操作。
-
循环检测时间:
- 程序会不断监控当前系统时间,当达到设定的抢购时间后执行抢购流程。
关键点:
ActionChains
模拟鼠标悬停:淘宝的部分按钮(如“结算”)只有在鼠标悬停时才会显示,因此使用ActionChains.move_to_element()
模拟用户悬停行为。- 循环检查当前时间:程序会持续检查时间,并在抢购时间到达后执行下一步操作。
WebDriverWait
:确保元素加载完成后再进行交互,避免因为页面还没完全加载而找不到元素。
需要注意的事项:
- Xpath 的稳定性:淘宝页面的结构可能会随着更新而改变,确保 XPath 在页面变动后依然有效。如果发现某些元素找不到,可以通过浏览器的开发者工具重新获取 XPath。
- 登录状态:程序启动后,用户需要手动扫码登录,以确保后续的自动化操作可以顺利进行。
代码实现
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import datetime
from selenium import webdriver
import time
# 获取当前时间并设置抢购时间
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
mstime = "2024-09-12 10:08:00.000000" # 设置时间为要抢货的时间
print(f"当前时间: {now}, 预定抢购时间: {mstime}")
# 初始化WebDriver
WebBrowser = webdriver.Chrome()
# 打开淘宝首页
print("正在打开淘宝...")
WebBrowser.get("https://www.taobao.com")
WebBrowser.maximize_window() # 使窗口最大化,防止部分元素不显示
time.sleep(5) # 等待页面加载
# 点击登录链接
print("正在点击登录链接...")
WebBrowser.find_element(By.LINK_TEXT, "亲,请登录").click()
print("请扫码登录")
time.sleep(10) # 等待手动扫码登录
# 跳转到购物车页面
print("跳转到购物车页面...")
WebBrowser.get("https://cart.taobao.com/cart.htm")
# 等待购物车页面完全加载
print("等待购物车页面加载完成...")
WebDriverWait(WebBrowser, 10).until(
EC.presence_of_element_located((By.ID, "listContainer_1"))
)
print("购物车页面加载完成")
# 尝试点击全选按钮
while True:
try:
print("查找全选按钮...")
# 查找全选按钮的 XPath,注意这个路径可能会变
if WebBrowser.find_element(By.XPATH, "/html/body/div[4]/div[2]/div[2]/div/div[1]/div/div/div[1]/div/div/div[2]/label/span[1]/input"):
print("找到全选按钮,正在点击全选按钮...")
element = WebDriverWait(WebBrowser, 10).until(
EC.presence_of_element_located(
(By.XPATH,
"/html/body/div[4]/div[2]/div[2]/div/div[1]/div/div/div[1]/div/div/div[2]/label/span[1]/input"))
)
element.click() # 点击全选按钮
print("全选按钮点击成功")
break
except Exception as e:
print(f"找不到全选按钮: {e}")
# 循环检查当前时间,等待抢购时间到达
while True:
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
print(f"当前时间: {now}")
# 如果当前时间超过抢购时间,开始执行抢购操作
if now > mstime:
print("时间已到,开始抢购流程...")
# 尝试点击“结算”按钮
while True:
try:
print("查找结算按钮...")
if WebBrowser.find_element(By.XPATH, "//*[text()='结算']"):
my_taobao = WebDriverWait(WebBrowser, 10).until(
EC.presence_of_element_located((By.XPATH, "//*[text()='结算']"))
)
print(f"找到结算按钮: {my_taobao}")
# 使用ActionChains模拟鼠标悬停并点击
actions = ActionChains(WebBrowser)
actions.move_to_element(my_taobao).pause(1).click().perform()
print("结算按钮点击成功")
time.sleep(1)
break
except Exception as e:
print(f"结算按钮点击失败: {e}")
# 尝试点击“提交订单”按钮
while True:
try:
print("查找提交订单按钮...")
if WebBrowser.find_element(By.XPATH, "//*[text()='提交订单']"):
submit_button = WebDriverWait(WebBrowser, 10).until(
EC.presence_of_element_located((By.XPATH, "//*[text()='提交订单']"))
)
print(f"找到提交订单按钮: {submit_button}")
# 使用ActionChains模拟鼠标悬停并点击
actions.move_to_element(submit_button).pause(1).click().perform()
print("提交订单按钮点击成功,抢购成功,请尽快付款")
time.sleep(1)
break
except Exception as e:
print(f"提交订单按钮点击失败: {e}")
print(f"结算提交成功,已抢到商品,请及时支付订单")
break
性能最好的
可能会失效,2024年9月13人可用,是绝对路径去做的脚本,可用周期会很低
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import datetime
from selenium import webdriver
import time
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
mstime = "2024-09-20 10:08:00.000000"
# 设置时间为要抢货的时间
# 初始化WebDriver
WebBrowser = webdriver.Chrome()
# 打开淘宝
WebBrowser.get("https://www.taobao.com")
WebBrowser.maximize_window() # 使窗口最大化,防止部分元素不显示
time.sleep(5)
# 点击登录链接
WebBrowser.find_element(By.LINK_TEXT, "亲,请登录").click()
print("请扫码登录")
time.sleep(10)
# 跳转到购物车页面
WebBrowser.get("https://cart.taobao.com/cart.htm")
# 等待购物车页面完全加载
WebDriverWait(WebBrowser, 10).until(
EC.presence_of_element_located((By.ID, "listContainer_1"))
)
while True:
try:
if WebBrowser.find_element(By.XPATH, "/html/body/div[4]/div[2]/div[2]/div/div[1]/div/div/div[1]/div/div/div[2]/label/span[1]/input"):
# 这里代码意思是找到购物车全选的按钮并点击全选
element = WebDriverWait(WebBrowser, 10).until(
EC.presence_of_element_located(
(By.XPATH,
"/html/body/div[4]/div[2]/div[2]/div/div[1]/div/div/div[1]/div/div/div[2]/label/span[1]/input"))
)
element.click() # 点击该元素
break
except:
print(f"找不到购买按钮")
while True:
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
print(now)
# print(now) 可以将实时的时间输出出来
if now > mstime:
# 当当前时间超过了抢购时间就立刻执行下面代码
while True:
try:
if WebBrowser.find_element(By.XPATH, "/html/body/div[4]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/div[1]/div[4]/div/div[2]"):
# 定位导航栏中需要悬停的元素 ("结算")
my_taobao = WebDriverWait(WebBrowser, 10).until(
EC.presence_of_element_located((By.XPATH,
"/html/body/div[4]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/div[1]/div[4]/div/div[2]"))
)
# 使用ActionChains进行鼠标悬停操作
actions = ActionChains(WebBrowser)
actions.move_to_element(my_taobao).pause(1).click().perform() # 暂停1秒后点击
print(f"结算成功")
break
except:
pass
while True:
try:
if WebBrowser.find_element(By.XPATH, "/html/body/div[4]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/div[1]/div[4]/div/div[2]/div"):
# 定位导航栏中需要悬停的元素 ("提交")
my_taobao = WebDriverWait(WebBrowser, 10).until(
EC.presence_of_element_located(
(By.XPATH,
"/html/body/div[4]/div[2]/div[2]/div/div[2]/div/div[1]/div/div/div[1]/div[4]/div/div[2]/div"))
)
# 使用ActionChains进行鼠标悬停操作
actions = ActionChains(WebBrowser)
actions.move_to_element(my_taobao).pause(1).click().perform() # 暂停1秒后点击
print(f"抢购成功,请尽快付款")
except:
print(f"结算提交成功,已抢到商品啦,请及时支付订单")
break
time.sleep(3)