更多相关内容可查看
应用场景
个人觉得在于理解,理解之后不管是12306抢票还是演唱会抢票又或者抢单,以下代码尚可有可优化的空间,只是提供一个大体框架
脚本分析
依赖项
import re
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
执行主程序
# 执行主程序
if __name__ == "__main__":
main()
def main():
# 登录流程
login()
# 等待抢购时间
wait_until_buy_time()
# 开始抢购
buy()
自动登陆
脚本
def login():
print("开始登录...")
driver.get(indexUrl)
time.sleep(5)
# 点击登录按钮
login_button = None
# PC 网页
try:
login_button = driver.find_element(By.CLASS_NAME, "r-gy4na3")
except:
pass
# 点击登录按钮
if login_button:
login_button.click()
time.sleep(5)
# 输入用户名和密码
inputs = driver.find_elements(By.CLASS_NAME, "hwid-input-root")
for ele in inputs:
input_box = ele.find_element(By.TAG_NAME, "input")
input_type = input_box.get_attribute("type")
if input_type == "text":
input_box.send_keys(userName)
elif input_type == "password":
input_box.send_keys(password)
# 点击登录按钮
login_btn = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CLASS_NAME, "hwid-login-btn"))
)
# login_btn = driver.find_element(By.CLASS_NAME, "hwid-login-btn")
login_btn.click()
print("登录成功")
time.sleep(20) # 等待手动输入验证码
图示
自动打开index页面
自动点击登陆按钮
自动输入账号密码,并自动点击登陆按钮
这里需要手动去输入验证码,因为验证码一天发很多次会上限,还是人为控制比较好
等待抢购时间
这里自己输入一个时间,到了一定时间会自动去执行脚本,例如八点开抢可以设置7:59就开始疯狂点击
脚本
def wait_until_buy_time():
print(f"等待抢购时间到达:{buyTimeStr}")
buy_time = time.mktime(time.strptime(buyTimeStr, "%Y-%m-%d %H:%M:%S"))
current_time = time.time()
while current_time < buy_time:
print(f"当前时间戳: {current_time}, 抢购时间戳: {buy_time}")
time.sleep(10)
current_time = time.time()
图示
自动进入需抢购商品页面进行下单
脚本
def buy():
driver.get(phonePageUrl)
time.sleep(5)
print("打开指定手机页面 --> 准备抢购")
driver.refresh()
time.sleep(5)
buyBtns = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "prd-botnav-rightbtn-txt"))
)
driver.execute_script("arguments[0].click();", buyBtns)
# cur_url = driver.current_url
# WebDriverWait(driver, 30).until(lambda driver: driver.current_url != cur_url)
# # 如果没有进入提交订单页面则一直点击立即下单
# print(cur_url)
# click = 0
# while not re.search(submitOrderUrl, cur_url):
# # 此元素被设置了javascript:; , 所以click()无法触发,只能通过执行execute_script执行网页js方法
# driver.execute_script("arguments[0].click();", buyBtns)
# click += 1
# print(f"点击次数:{click}")
# WebDriverWait(driver, 10).until(lambda driver: driver.current_url != cur_url)
# cur_url = driver.current_url
# print(driver.current_url)
# time.sleep(15) # 预留时间选地址
submit_button = None
try:
# 查找提交订单按钮
submit_button = driver.find_element(By.CLASS_NAME, "order-submit-btn")
except:
print("无法提交订单")
pass
try:
# 查找提交订单按钮
submit_button = WebDriverWait(driver, 40).until(
EC.presence_of_element_located((By.CLASS_NAME, "order-submit-btn"))
)
except:
print("未找到提交订单按钮")
pass
if submit_button:
submit_button.click()
print("订单已提交")
图示
跳转商品页面,并点击立即购买按钮
手动输入地址,并点击提交订单按钮
全部脚本(可直接拷贝执行)
注意修改账号信息以及抢购时间
import re
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 初始化 WebDriver
driver = webdriver.Edge()
# 账号信息(请替换为您的真实账号信息)
userName = "xxx"
password = "xxx"
# 相关页面 URL
indexUrl = "https://www.vmall.com/index.html" # 华为商城首页
phonePageUrl = "https://www.vmall.com/product/10086213682650.html#2601010448909" # 想要抢购的手机页面
submitOrderUrl = "/order/nowConfirmcart"
# 抢购时间设定
buyTimeStr = "2024-08-1 20:00:00"
# 主程序入口
def main():
# 登录流程
login()
# 等待抢购时间
wait_until_buy_time()
# 开始抢购
buy()
# 登录函数
def login():
print("开始登录...")
driver.get(indexUrl)
time.sleep(5)
# 点击登录按钮
login_button = None
# PC 网页
try:
login_button = driver.find_element(By.CLASS_NAME, "r-gy4na3")
except:
pass
# 点击登录按钮
if login_button:
login_button.click()
time.sleep(5)
# 输入用户名和密码
inputs = driver.find_elements(By.CLASS_NAME, "hwid-input-root")
for ele in inputs:
input_box = ele.find_element(By.TAG_NAME, "input")
input_type = input_box.get_attribute("type")
if input_type == "text":
input_box.send_keys(userName)
elif input_type == "password":
input_box.send_keys(password)
# 点击登录按钮
login_btn = WebDriverWait(driver, 15).until(
EC.element_to_be_clickable((By.CLASS_NAME, "hwid-login-btn"))
)
# login_btn = driver.find_element(By.CLASS_NAME, "hwid-login-btn")
login_btn.click()
print("登录成功")
time.sleep(20) # 等待手动输入验证码
# 等待抢购时间
def wait_until_buy_time():
print(f"等待抢购时间到达:{buyTimeStr}")
buy_time = time.mktime(time.strptime(buyTimeStr, "%Y-%m-%d %H:%M:%S"))
current_time = time.time()
while current_time < buy_time:
print(f"当前时间戳: {current_time}, 抢购时间戳: {buy_time}")
time.sleep(10)
current_time = time.time()
# 抢购函数
def buy():
driver.get(phonePageUrl)
time.sleep(5)
print("打开指定手机页面 --> 准备抢购")
driver.refresh()
time.sleep(5)
buyBtns = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "prd-botnav-rightbtn-txt"))
)
driver.execute_script("arguments[0].click();", buyBtns)
# cur_url = driver.current_url
# WebDriverWait(driver, 30).until(lambda driver: driver.current_url != cur_url)
# # 如果没有进入提交订单页面则一直点击立即下单
# print(cur_url)
# click = 0
# while not re.search(submitOrderUrl, cur_url):
# # 此元素被设置了javascript:; , 所以click()无法触发,只能通过执行execute_script执行网页js方法
# driver.execute_script("arguments[0].click();", buyBtns)
# click += 1
# print(f"点击次数:{click}")
# WebDriverWait(driver, 10).until(lambda driver: driver.current_url != cur_url)
# cur_url = driver.current_url
# print(driver.current_url)
# time.sleep(15) # 预留时间选地址
submit_button = None
try:
# 查找提交订单按钮
submit_button = WebDriverWait(driver, 40).until(
EC.presence_of_element_located((By.CLASS_NAME, "order-submit-btn"))
)
except:
print("未找到提交订单按钮")
pass
if submit_button:
submit_button.click()
print("订单已提交")
# 执行主程序
if __name__ == "__main__":
main()