【Python脚本】编写一个自动化脚本来模拟在华为商城的操作图解示例(附源码)

在这里插入图片描述


更多相关内容可查看

应用场景

个人觉得在于理解,理解之后不管是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()

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来一杯龙舌兰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值