目录
前言
每到购物节,某宝某东等购物平台就会有层出不穷的秒杀活动,但我们总会由于手速、网速等原因抢不到自己需要的低价商品,很是苦恼。这个时候我们的Python自动化脚本工具又可以登场了:利用selenium工具设计自动抢购系统,到点自助下单就可以咯~
本节以某宝为例,给大家做一个简要的演示。
目的
编写一个自动抢购程序,要求能设定一个时间和目标商品(提前加入购物车中),使用自动化工具持续监测当前时间,一旦到设定时间,自动下单某宝设定好的商品并提交,抢占商品。
思路
1. 实现自动打开浏览器,进入登录界面。
2. 扫码登陆/账号密码登录(账号密码登录的方式我在之前12306自动购票系统讲解过,想修改为账号密码登录的同学可以去这篇文章查看:28. 实战:基于selenium实现12306自动购票),本节我们为了方便(可以不输验证码或者修改账号密码),就使用扫码登陆,简单粗暴。
3. 登陆以后进入购物车,选中需要商品的勾,等待下单(本例直接全选购物车)。
4. 当当前时间大于剩余时间,结算订单。
5. 语音提示下单完成,让用户尽快付款。
代码实现
要用到的库:
datetime;time;selenium;pypiwin32
不知道怎么安装selenium的同学移步:selenium简介
1. 自动打开浏览器,并配置选项
首先导包:
# 导入自动化检测工具
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
然后对浏览器进行设置:
opt.add_argument('--disable-blink-features=AutomationControlled')
opt.add_experimental_option('detach', True)
opt.add_argument('--start-maximized') # 浏览器窗口最大
browser = webdriver.Chrome(options=opt)
设置当网页检测当前浏览器时不会返回selenium自动工具;
设置程序执行完毕以后浏览器不自动关闭;
设置默认浏览器全屏;
进入某宝网站:
browser.get("https://链接放评论区.com")
2. 实现扫码登陆
如果想要实现账号密码加验证码登陆的同学参考我之前的这两篇文章哈:( 简单的验证码实战基于selenium实现12306自动购票)!!!
扫码登陆功能:
time.sleep(3) # 查找 网络元素 来自 链接 文本(亲,请登录) # 点击
browser.find_element(By.LINK_TEXT, "亲,请登录").click()
print(f"请尽快扫码登录")
time.sleep(10)
因为我们自动化测试工具打开浏览器以后并不会记录用户Cookie,你可以认为是刚刚下载的一个新浏览器,没有任何痕迹,所以就算我们之前在谷歌浏览器登陆过某宝也不会默认自动登陆的。
我们首页上可以找到“亲,请登录”的字样,我们就可以根据链接提示文本定位到登录选项,进入登陆界面,然后等待十秒进行扫码登陆。
3. 进入购物车选择秒杀商品(本例勾选全选)
browser.get("https://购物车链接放评论区")
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"找不到购买按钮")
当能够找到全选框的时候点击选择,否则提示找不到购买按钮,程序结束。
4. 获取当前时间,大于设定时间时下单
while True:
# 获取电脑现在的时间, year month day
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
# 对比时间,时间到的话就点击结算
print(now)
if now > set_time:
# 点击结算按钮
while True:
try:
if browser.find_element(By.LINK_TEXT, "结 算"):
print("here")
browser.find_element(By.LINK_TEXT, "结 算").click()
print(f"主人,程序锁定商品,结算成功")
break
except:
pass
导入datetime库,获取当前时间,设置格式为年-月-日 小时:分钟:秒.毫秒
实时监测当前时间,如果大于了设定时间,就开始检测结算按钮。
如果检测到了结算按钮,则点击,否则继续循环,直到检测到结算按钮为止。
5. 下单成功后语音提示用户返回付款
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)
这也是一个死循环,检测提交订单按钮,如果检测到就点击,并且返回信息,抢购成功;
如果没有检测到,说明已经跳转了支付界面,返回结算成功信息,并且语音播报已抢到商品,提醒用户尽快支付该订单。
涉及到语音播报库,要用到pypiwin32这个库,直接pip install就可以了:
完整源码
# Created at UESTC
# Author: Vector Kun
# Time: 2023/3/4 14:49
import datetime # 模块
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
import time
# 导入自动化检测工具
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import win32com.client
speaker = win32com.client.Dispatch("SAPI.SpVoice")
set_time = "2023-03-04 15:29:00.00000000"
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)
browser.get("见评论区")
time.sleep(3) # 查找 网络元素 来自 链接 文本(亲,请登录) # 点击
browser.find_element(By.LINK_TEXT, "亲,请登录").click()
print(f"请尽快扫码登录")
time.sleep(10)
browser.get("见评论区")
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:
# 获取电脑现在的时间, year month day
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
# 对比时间,时间到的话就点击结算
print(now)
if now > set_time:
# 点击结算按钮
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)
运行效果
总结
本节我们使用老朋友selenium进行了一系列的操作,实现了某宝秒杀商品的购买,还是很有实用价值的,很适合新手小白练手。
有什么配置问题或者其他技术问题,又或者是建议等都可以评论或者私信我哦~每一条都会回复的。