目录
前言
之前在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
主人,程序锁定商品,结算成功
抢购成功,请尽快付款
主人,结算提交成功,我已帮你抢到商品啦,请及时支付订单
总结
还是挺综合的,把这些综合了起来,巩固了爬虫知识和编程思路吧,还是碰到不少绊子的。前段时间准备出国的材料就断更了,也没有怎么敲代码,实在是懒惰了,后面更新频率会快一点。