41. 基于selenium的各大购物平台自动秒杀系统(完整源码)

目录

前言

目的

思路

代码实现

1. 将三个平台封装成函数

2. 将判断时间写为一个函数

3. 设计控制台UI

4. 优化逻辑

5. 测试

完整源码

运行效果

总结


前言

之前在38. 实战:基于selenium的某宝秒杀抢购系统(附完整代码),我们做了一个简易的淘宝秒杀系统,反响还是不错的,这一期我们对它进行一个升级,加入天猫和京东两大购物平台的秒杀系统,并且实现在控制台选择想要秒杀的平台和自定义秒杀时间的功能,看起来更加的高大上。


目的

1. 实现控制台操作

2. 实现三个平台自定义时间秒杀


思路

1. 将三个平台封装成函数

2. 将判断时间写为一个函数

3. 设计控制台UI

4. 优化逻辑

5. 测试


代码实现

1. 将三个平台封装成函数

还是以淘宝为例,把访问网页开始到秒杀结束的逻辑拿出来封装起来,并且引入时间控制函数time_dealer()来判断当前是否到达秒杀时间。

其他两个平台类似,同理。

def TaoBao(browser):
    browser.get("https://www.taobao.com")
    time.sleep(3)  # 查找  网络元素 来自 链接 文本(亲,请登录) # 点击
    browser.find_element(By.LINK_TEXT, "亲,请登录").click()
    print(f"请尽快扫码登录")
    time.sleep(10)
    browser.get("https://cart.taobao.com/cart.htm")
    time.sleep(3)
    # 是否全选购物车
    while True:
        try:  # 查找 元素 来自  ID
            if browser.find_element(By.ID, "J_SelectAll1"):
                browser.find_element(By.ID, "J_SelectAll1").click()
                break
        except:
            print(f"找不到购买按钮")
    while True:
        print(f"请耐心等待秒杀时间...")
        while True:
            time_dealer()
            if time_dealer():
                break
        # 点击结算按钮
        while True:
            try:
                if browser.find_element(By.LINK_TEXT, "结 算"):
                    print("here")
                    browser.find_element(By.LINK_TEXT, "结 算").click()
                    print(f"主人,程序锁定商品,结算成功")
                    break
            except:
                pass
        while True:
            try:
                if browser.find_element(By.LINK_TEXT, '提交订单'):
                    browser.find_element(By.LINK_TEXT, '提交订单').click()
                    print(f"抢购成功,请尽快付款")
            except:
                print(f"主人,结算提交成功,我已帮你抢到商品啦,请及时支付订单")
                speaker.Speak(f"主人,结算提交成功,我已帮你抢到商品啦,请及时支付订单")
                break
        time.sleep(0.01)

2. 将判断时间写为一个函数

判断时间函数如下,需要引入datetime库:

时间未到返回False,继续死循环,等待条件;时间到返回True,可以继续运行秒杀系统。

def time_dealer():
    while True:
        # 获取电脑现在的时间,                      year month day
        nowadays = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
        # 对比时间,时间到的话就点击结算
        # print(nowadays)
        # print(set_time)
        if nowadays > set_time:
            return True
        else:
            return False

3. 设计控制台UI

设计了简易的UI,让用户输入的是平台序号和秒杀时间,输入失败的话回返回重新输入,十分的人性化。

# 初始化抢购信息
print("***欢迎使用网购秒杀系统***")
print("请依次输入秒杀信息...")
print("=" * 30)
while True:
    platform = input("请输入网购平台,以数字代替(1.淘宝 2.天猫 3.京东)...\n")
    if platform in ['1', '2', '3']:
        break
    else:
        print('请输入数字1或2或3!请重新输入')
while True:
    set_time = input("请输入秒杀时间(示例:2023-03-19 20:00:00.000000)...\n")
    try:
        datetime.strptime(set_time, '%Y-%m-%d %H:%M:%S.000000')
        break
    except ValueError:
        print("输入的日期格式不正确,请重新输入")
print("=" * 30)
print("处理信息中...\n", "处理完毕,请检查您输入的信息...\n", platform, set_time)
confirm = input("是否确认上述信息?(y/n)\n")
if confirm == 'y':
    print("=" * 30)
    print("初始化完毕,开始运行系统...")
if confirm == 'n':
    print("=" * 30)
    print("请重新运行程序!")
    exit(1)

4. 优化逻辑

在实现判断时间的时候还是废了大力气的,当时因为死循环的缩进问题,在测试时总是提前进入购买页面,导致返工次数增加,所以还是要注重缩进问题,什么代码应当放入死循环中应当想清楚,并且要考虑好跳出循环的条件。

5. 测试

在自己的购物车中准备好商品就可以测试啦~

在评论区放我自己的测试视频,供大家参考,去评论区自取。


完整源码

# Created at UESTC
# Author: Vector Kun
# Time: 2023/3/19 20:45

from datetime import datetime
import time
# 全自动化Python代码操作
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import win32com.client
speaker = win32com.client.Dispatch("SAPI.SpVoice")

# 初始化抢购信息
print("***欢迎使用网购秒杀系统***")
print("请依次输入秒杀信息...")
print("=" * 30)
while True:
    platform = input("请输入网购平台,以数字代替(1.淘宝 2.天猫 3.京东)...\n")
    if platform in ['1', '2', '3']:
        break
    else:
        print('请输入数字1或2或3!请重新输入')
while True:
    set_time = input("请输入秒杀时间(示例:2023-03-19 20:00:00.000000)...\n")
    try:
        datetime.strptime(set_time, '%Y-%m-%d %H:%M:%S.000000')
        break
    except ValueError:
        print("输入的日期格式不正确,请重新输入")
print("=" * 30)
print("处理信息中...\n", "处理完毕,请检查您输入的信息...\n", platform, set_time)
confirm = input("是否确认上述信息?(y/n)\n")
if confirm == 'y':
    print("=" * 30)
    print("初始化完毕,开始运行系统...")
if confirm == 'n':
    print("=" * 30)
    print("请重新运行程序!")
    exit(1)


def time_dealer():
    while True:
        # 获取电脑现在的时间,                      year month day
        nowadays = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
        # 对比时间,时间到的话就点击结算
        # print(nowadays)
        # print(set_time)
        if nowadays > set_time:
            return True
        else:
            return False


def TaoBao(browser):
    browser.get("https://www.taobao.com")
    time.sleep(3)  # 查找  网络元素 来自 链接 文本(亲,请登录) # 点击
    browser.find_element(By.LINK_TEXT, "亲,请登录").click()
    print(f"请尽快扫码登录")
    time.sleep(10)
    browser.get("https://cart.taobao.com/cart.htm")
    time.sleep(3)
    # 是否全选购物车
    while True:
        try:  # 查找 元素 来自  ID
            if browser.find_element(By.ID, "J_SelectAll1"):
                browser.find_element(By.ID, "J_SelectAll1").click()
                break
        except:
            print(f"找不到购买按钮")
    while True:
        print(f"请耐心等待秒杀时间...")
        while True:
            time_dealer()
            if time_dealer():
                break
        # 点击结算按钮
        while True:
            try:
                if browser.find_element(By.LINK_TEXT, "结 算"):
                    print("here")
                    browser.find_element(By.LINK_TEXT, "结 算").click()
                    print(f"主人,程序锁定商品,结算成功")
                    break
            except:
                pass
        while True:
            try:
                if browser.find_element(By.LINK_TEXT, '提交订单'):
                    browser.find_element(By.LINK_TEXT, '提交订单').click()
                    print(f"抢购成功,请尽快付款")
            except:
                print(f"主人,结算提交成功,我已帮你抢到商品啦,请及时支付订单")
                speaker.Speak(f"主人,结算提交成功,我已帮你抢到商品啦,请及时支付订单")
                break
        time.sleep(0.01)


def Tmall(browser):
    browser.get("https://www.tmall.com/")
    time.sleep(3)  # 查找  网络元素 来自 链接 文本(亲,请登录) # 点击
    browser.find_element(By.LINK_TEXT, "请登录").click()
    print(f"请尽快扫码登录")
    time.sleep(10)
    browser.get("https://cart.taobao.com/")
    time.sleep(3)
    # 是否全选购物车
    while True:
        try:  # 查找 元素 来自  ID
            if browser.find_element(By.ID, "J_SelectAll1"):
                browser.find_element(By.ID, "J_SelectAll1").click()
                break
        except:
            print(f"找不到购买按钮")
    while True:
        print(f"请耐心等待秒杀时间...")
        while True:
            time_dealer()
            if time_dealer():
                break
        # 点击结算按钮
        while True:
            try:
                if browser.find_element(By.LINK_TEXT, "结 算"):
                    print("here")
                    flag = False
                    while not flag:
                        browser.find_element(By.LINK_TEXT, "结 算").click()
                        flag = True
                    wait = WebDriverWait(browser, 10, 0.5)
                    element = wait.until(EC.title_contains('确认订单'))
                    print(f"主人,程序锁定商品,结算成功")
                    break
            except:
                pass
        js = "var q=document.documentElement.scrollTop=" + str(666)
        browser.execute_script(js)
        while True:
            try:
                if browser.find_element(By.LINK_TEXT, '提交订单'):
                    browser.find_element(By.LINK_TEXT, '提交订单').click()
                    print(f"抢购成功,请尽快付款")
            except:
                print(f"主人,结算提交成功,我已帮你抢到商品啦,请及时支付订单")
                speaker.Speak(f"主人,结算提交成功,我已帮你抢到商品啦,请及时支付订单")
                break
        time.sleep(0.01)


def JD(browser):
    browser.get("https://www.jd.com/")
    time.sleep(3)  # 查找  网络元素 来自 链接 文本(亲,请登录) # 点击
    browser.find_element(By.LINK_TEXT, "你好,请登录").click()
    print(f"请尽快扫码登录")
    time.sleep(10)
    browser.get("https://cart.jd.com/cart_index")
    time.sleep(3)
    # 是否全选购物车
    while True:
        try:  # 查找 元素 来自  ID
            if browser.find_element(By.NAME, "select-all"):
                if not browser.find_element(By.ID, "cart-body").get_attribute('data-notfresh-skus'):
                    browser.find_element(By.NAME, "select-all").click()
                    break
                else:
                    break
        except:
            print(f"找不到购买按钮")

    time.sleep(3)  # 给全选一个休息时间

    while True:
        print(f"请耐心等待秒杀时间...")
        while True:
            time_dealer()
            if time_dealer():
                break
        # 点击结算按钮
        while True:
            try:
                if browser.find_element(By.LINK_TEXT, "去结算"):
                    print("here")
                    browser.find_element(By.LINK_TEXT, "去结算").click()
                    print(f"主人,程序锁定商品,结算成功")
                    break
            except:
                pass
        while True:
            try:
                if browser.find_element(By.ID, 'order-submit'):
                    browser.find_element(By.ID, 'order-submit').click()
                    print(f"抢购成功,请尽快付款")
            except:
                print(f"主人,结算提交成功,我已帮你抢到商品啦,请及时支付订单")
                speaker.Speak(f"主人,结算提交成功,我已帮你抢到商品啦,请及时支付订单")
                break
        time.sleep(0.01)


def main():
    opt = Options()
    # option.add_experimental_option('excludeSwitches', ['enable-automation'])
    opt.add_argument('--disable-blink-features=AutomationControlled')
    opt.add_experimental_option('detach', True)
    opt.add_argument('--start-maximized')  # 浏览器窗口最大

    browser = webdriver.Chrome(options=opt)

    if platform == '1':
        TaoBao(browser)
    elif platform == '2':
        Tmall(browser)
    elif platform == '3':
        JD(browser)


if __name__ == '__main__':
    main()

运行效果

D:\Anaconda3\envs\spider\python.exe D:/AI/PythonProjects/PythonSpider/Example/11_Auto_Purchase_System.py
***欢迎使用网购秒杀系统***
请依次输入秒杀信息...
==============================
请输入网购平台,以数字代替(1.淘宝 2.天猫 3.京东)...
2
请输入秒杀时间(示例:2023-03-19 20:00:00.000000)...
2023-03-19 22:53:00.000000
==============================
处理信息中...
 处理完毕,请检查您输入的信息...
 2 2023-03-19 22:53:00.000000
是否确认上述信息?(y/n)
y
==============================
初始化完毕,开始运行系统...
请尽快扫码登录
请耐心等待秒杀时间...
here
主人,程序锁定商品,结算成功
抢购成功,请尽快付款
主人,结算提交成功,我已帮你抢到商品啦,请及时支付订单


总结

还是挺综合的,把这些综合了起来,巩固了爬虫知识和编程思路吧,还是碰到不少绊子的。前段时间准备出国的材料就断更了,也没有怎么敲代码,实在是懒惰了,后面更新频率会快一点。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vec_Kun

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

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

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

打赏作者

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

抵扣说明:

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

余额充值