用py写了个针对淘宝的抢购程序(清空购物车)

这是一个使用Python编写的淘宝抢购程序,适用于初学者练习。程序依赖Chrome浏览器和Selenium库,需手动将商品加入购物车。由于网络速度等因素,可能会在提交订单时遇到拥挤问题,适合抢购非热门商品。

使用

  • 适合学python的练手
  • 部分代码参考于他人,优化了部分逻辑
  • 手动扫码,把需要的商品提前放入购物车

缺点

  • 取决于网速,提交订单的时候有可能提示拥挤,抢个药应该没问题,抢茅台做梦
  • 结算到提交订单之间的耗时处理的不好,抱砖引玉
import datetime
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

启动插件时间 = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
print("启动插件时间::" + 启动插件时间)
抢购时间 = "2022-12-19 16:00:00.000000"

from selenium import webdriver
import time

driver = webdriver.Chrome()
timeout = 20  # 等待上限,单位是秒,每个网页加载的上限时间
poll_frequency = 0.8  # 检测的轮询间隔,默认值是0.5秒
#
# driver.implicitly_wait(10)
driver.get("https://www.taobao.com")
# time.sleep(2)
##请登录,他妈的要手动
label1 = WebDriverWait(driver, timeout, poll_frequency).until(EC.visibility_of_element_located((By.LINK_TEXT, '亲,请登录')))
print("亲,请登录加载完成")
driver.find_element(By.LINK_TEXT, "亲,请登录").click()
##点击二维码登录
# time.sleep(2)
label2 = WebDriverWait(driver, timeout, poll_frequency).until(
    EC.visibility_of_element_located((By.CLASS_NAME, 'icon-qrcode')))
print("手动扫码加载完成")

driver.find_element(By.CLASS_NAME, "icon-qrcode").click()
##手动扫码这个就很操蛋,要在十秒内完成扫描啊
time.sleep(10)
# driver.implicitly_wait(10)
##去打开购物车
driver.get("https://cart.taobao.com/cart.htm")
label3 = WebDriverWait(driver, timeout, poll_frequency).until(EC.visibility_of_element_located((By.ID, 'J_SelectAll1')))
label4 = WebDriverWait(driver, timeout, poll_frequency).until(
    EC.visibility_of_element_located((By.CLASS_NAME, 'submit-btn')))
##此时说明购物车加载出来了
# time.sleep(1)
# 下面去全选购物车
COOMMEN_CONNECT_NUM = 10000000000
count3 = 1
# driver.implicitly_wait(3)
# label3=WebDriverWait(driver, timeout).until(EC.visibility_of_element_located((By.ID, 'J_SelectAll1')))
# print("全选按钮加载完成")
while True:
    try:
        if driver.find_element(By.ID, "J_SelectAll1"):
            driver.find_element(By.ID, "J_SelectAll1").click()  # 全选
            print("找到了全选按钮")
            break
    except:
        count3 = count3 + 1
        driver.refresh()
        if count3 >= COOMMEN_CONNECT_NUM:
            print("抢购失败:失败原因:没找到了全选按钮")
            break
# 此时默认已经选中了全选按钮
time.sleep(1)
# 结算按钮
count2 = 1


# 转毫秒
def timeToLong(valid_time):
    dd = datetime.datetime.strptime(valid_time, '%Y-%m-%d %H:%M:%S.%f')
    ts = int(time.mktime(dd.timetuple()) * 1000.0 + (dd.microsecond / 1000.0))
    return ts


#
# def str_data_to_num(str_data):
#     # 格式时间成毫秒
#     strptime = time.strptime(str_data,"%Y-%m-%d %H:%M:%S.%f")
#     #print("strptime",strptime)
#     mktime = int(time.mktime(strptime)*1000000)
#     #print("mktime",mktime)
#     return mktime

while True:
    ##<a href="javascript:void(0)" id="J_Go" class="submit-btn submit-btn-disabled"
    # aria-label="请注意如果没有选择宝贝,
    # 将无法结算" data-spm-anchor-id="a1z0d.6639537/tb.0.0"><span>结&nbsp;算</span><b></b></a>
    # <a role="button" title="提交订单" class="go-btn"
    # style="background-color: rgb(255, 80, 0);">提交订单</a>
    当前时间 = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
    t = timeToLong(抢购时间) - timeToLong(当前时间)
    print("抢购倒计时%s" % (t))

    # 网速不好是不是可以调节这个值来减少提交订单的时间误差?
    if (t < 2505):  # 这里给一秒缓冲提交订单页面的加载时间
        while True:
            ##去查找结算按钮
            try:
                if driver.find_element(By.CLASS_NAME, "submit-btn"):
                    print("找到了结算按钮")
                    driver.find_element(By.CLASS_NAME, "submit-btn").click()
                    break
            except:
                count2 = count2 + 1
                driver.refresh()  # 这里的刷新不知道会不会影响重复查找
                if (count2 >= COOMMEN_CONNECT_NUM):
                    print("抢购失败:失败原因:没找到了结算按钮")
                    break

        break
    ##提交订单的逻辑判断
# <a role="button" title="提交订单" class="go-btn"
# style="background-color: rgb(255, 80, 0);">提交订单</a>
# tag = True
# time.sleep(1)
count = 1
# 此时说明提交订单按钮加载出来了

try:
    label5 = WebDriverWait(driver, timeout, poll_frequency).until(
        EC.visibility_of_element_located((By.CLASS_NAME, 'go-btn')))
except:
    print("提交订单的页面加载不出来抢购失败")
    driver.refresh()  # 刷新
    time.sleep(1)
    # 点击人太多了导致此时页面都加载不出来怎么办

while True:
    # if tag == True:
    #     当前时间 = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
    #     print("当前时间" + 当前时间)
    #     if 当前时间 > qgTime:
    #         while True:
    ##去查找结算按钮
    提交订单时间 = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
    wucha = timeToLong(抢购时间) - timeToLong(提交订单时间)
    try:
        print("==========")
        if driver.find_element(By.CLASS_NAME, "go-btn"):
            if wucha < 1000:
                print("找到了提交订单的按钮")
                driver.find_element(By.CLASS_NAME, "go-btn").click()
                thdingdanshijian = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
                print("提交订单时间%s" % thdingdanshijian)
                print("抢购误差%s" % (timeToLong(thdingdanshijian) - timeToLong(抢购时间)))
                print("抢购成功")
                # tag = False
                # 去掉break是因为怕在误差内,提交按钮点不动,让它重复点
                break

    except:
        # count = 1;
        # while True:
        #     try:
        #         if driver.find_element(By.CLASS_NAME, "go-btn"):
        #             print("老子找到了提交订单的按钮")
        #             driver.find_element(By.CLASS_NAME, "go-btn").click()
        #             print("提交订单时间" + 当前时间)
        #             print("抢购成功")
        #             break
        #     except:
        count = count + 1
        if count >= COOMMEN_CONNECT_NUM:
            # 如果连续十次没找到,老子就认为失败
            print("抢购失败:没找到了提交订单按钮")
            break

time.sleep(1000)


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值