python selenium 模拟浏览器自动操作抢购脚本

每逢秒杀,都在遗憾网速和手速慢没能抢购到商品吧。

手写一个脚本,让程序帮你抢,抢到的概率会大大提升。

废话不多说,直接上代码。

本实例以华为官网抢购手机为例

"""
模拟浏览器操作华为官网(1) 【只需要安装一种driver即可】 
one: 安装 chromedriver 
a. 去官网 (http://chromedriver.storage.googleapis.com/index.html) 下载对应版本的driver
b. 解压后将exe文件放入本地谷歌浏览器的安装目录 例如: C:\Program Files\Google\Chrome\Application
c. 配置将谷歌安装目录配置到系统环境变量的Path中
two: 安装 edgedriver
a.去官网  (https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/) 下载对应版本的driver
b. 解压后将exe文件放入Edge浏览器的安装目录 例如: C:\Program Files (x86)\Microsoft\Edge\Application(2) 安装python
(3) 安装 selenium 指令: pip install selenium
(4) 打开此文件, 修改    账号参数: userName, password 手机抢购页面链接参数: phonePageUrl 抢购时间参数: buyTimeStr
(5) 设置号华为官网的收货地址
"""from selenium import webdriver
from selenium.webdriver.common import by
import time
import redriver = webdriver.Chrome()
# driver = webdriver.Edge()
elementBy = by.By()
# 账号
userName = "134*****38"
password = "l*****6"
# 首页
indexUrl = "https://www.vmall.com/index.html"
# 想要抢购的手机页面
# phonePageUrl = "https://www.vmall.com/product/10086213682650.html#2601010448909"
phonePageUrl = "https://www.vmall.com/product/comdetail/index.html?prdId=10086238622707&sbomCode=2601010388226"
# 提交订单url
submitOrderUrl = "/order/nowConfirmcart"
buyTimeStr = "2023-07-13 20:00:00"def main():# 先登录login()# 指定时间, 未到时间则阻塞curTime = time.time()buyTime = time.mktime(time.strptime(buyTimeStr,"%Y-%m-%d %H:%M:%S"))while curTime < buyTime : print("当前时间戳:{}, 抢购时间戳:{}".format(curTime,buyTime) , end="\n")time.sleep(10)curTime = time.time()# 抢购if re.search("comdetail", phonePageUrl) is not None :buyTwo()else :buy()def login():print("登录")driver.get(indexUrl)time.sleep(5)# pc网页indexLoginBns = driver.find_elements(elementBy.CLASS_NAME, "r-gy4na3")if not indexLoginBns: for bn in indexLoginBns:if bn.text == "请登录":bn.click()breakelse :# 移动网页indexLoginBns = driver.find_elements(elementBy.CLASS_NAME,"r-1ff274t")for bn in indexLoginBns:if bn.text == "登录":bn.click()breaktime.sleep(5)loginElements = driver.find_elements(elementBy.CSS_SELECTOR, ".hwid-input-root")for e in loginElements:inputele = e.find_element(elementBy.TAG_NAME, "input")attr = inputele.get_attribute("type")if attr == "text":inputele.send_keys(userName)elif attr == "password":inputele.send_keys(password)loginBtnElement = driver.find_element(elementBy.CSS_SELECTOR, ".hwid-login-btn")loginBtnElement.click()#需要手机验证码 # 此处手动完成验证码验证 预留一分钟time.sleep(60)print("登录成功")"""
华为商品页不统一,此方法为抢购按钮是立即下单的
"""
def buy():driver.get(phonePageUrl)time.sleep(5)print("打开指定手机 --> 准备抢购")driver.refresh()time.sleep(5)buyBtns = driver.find_elements(elementBy.CLASS_NAME, "product-button02")cur_url = driver.current_urlcanBuy = Falseif buyBtns is None:print("无法获取下单按钮")returntime.sleep(2)# 如果没有进入提交订单页面则一直点击立即下单buyCountNum = 1while not re.search(submitOrderUrl, cur_url) and not canBuy :for buybn in buyBtns:if buybn.find_element(elementBy.TAG_NAME, "span").text == "立即下单" :# 此元素被设置了javascript:; , 所以click()无法触发,只能通过执行execute_script执行网页js方法driver.execute_script('ec.product.orderNow(null,null,this)')# buybn.click()canBuy = Trueprint("点击下单按钮次数: {}".format(buyCountNum))buyCountNum += buyCountNumbreakif canBuy == True :# 预留时间选地址time.sleep(5)submitBtn = driver.find_element(elementBy.CLASS_NAME,"order-submit-btn")if submitBtn is None: print("无法提交订单")              else :print("提交订单")# submitBtn.click()driver.execute_script("ec.order.submit();")# 预留时间等待提交响应结束time.sleep(60) """
华为商品页不统一,此方法为抢购按钮是立即购买的
此商品详情每一步都会新开页面
""" 
def buyTwo() :driver.get(phonePageUrl)time.sleep(5)print("打开指定手机 --> 准备抢购")driver.refresh()time.sleep(5)cur_url = driver.current_urlcanBuy = Falsetime.sleep(2)# 如果没有进入提交订单页面则一直点击立即下单buyCountNum = 1buyButtonScript = """this.document.getElementsByClassName("css-901oao r-jwli3a r-1i10wst r-13uqrnb r-16dba41 r-oxtfae r-rjixqe r-6dt33c r-lrvibr")[0].click();"""while not re.search(submitOrderUrl, cur_url) and not canBuy :# 通过执行execute_script执行网页js方法driver.execute_script(buyButtonScript)# 预留反应时间time.sleep(2)# 切换到最右边的网页窗口driver.switch_to.window(driver.window_handles[-1])cur_url = driver.current_urlprint("点击下单按钮次数: {}".format(buyCountNum))buyCountNum += buyCountNumif re.search(submitOrderUrl, cur_url) is not None :canBuy = Truebreakif canBuy == True :# 切换到最右边的网页窗口driver.switch_to.window(driver.window_handles[-1])# 预留时间选地址time.sleep(5)submitBtn = driver.find_element(elementBy.CLASS_NAME,"order-submit-btn")if submitBtn is None: print("无法提交订单")              else :print("提交订单")# submitBtn.click()driver.execute_script("ec.order.submit();")# 预留时间等待提交响应结束time.sleep(60) # 运行主函数
main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/165651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA】我们该如何规避代码中可能出现的错误?(二)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言异常方法&#xff08;Throwable类&#xff09;Throwable类的方法 捕获异常多重捕获块 前言 异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并…

git-3

1.如何让工作区的文件恢复为和暂存区一样&#xff1f; 工作区所作的变更还不及暂存区的变更好&#xff0c;想从暂存区拷贝到工作区&#xff0c;变更工作区(恢复成和暂存区一样的状态)&#xff0c;想到用git checkout -- 文件名 2.怎样取消暂存区部分文件的更改&#xff1f; 如…

无损压缩技巧:减小PDF文件尺寸的有效方法

我们在制作pdf文档的时候&#xff0c;会加入许多内容&#xff0c;文字、图片等等&#xff0c;素材添加的过多之后就会导致pdf文档特别大&#xff0c;在上传或者储存时&#xff0c;就会特别不方便&#xff0c;所以今天就告诉大家一个pdf压缩的方法&#xff0c;使用pdf在线压缩工…

4-Docker命令之docker info

后续为大家逐个讲解一下docker常用命令及其相关用法。docker常用命令查看如下: [root@centos79 ~]# docker --helpUsage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands:run Create and run a new container from an imageexec…

洛谷 P1883 函数

P1883 函数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Error Curves - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这两题是一模一样的&#xff0c;过一题水两题。 分析 主要难点在于证明F(x)是一个单峰函数可以被三分&#xff0c;但是我随便画了几个f(x)之后发现好像…

MySQL的Redo Log跟Binlog

文章目录 概要Redo Log日志Redo Log的作用Redo Log的写入机制 Binlog日志Binlog的作用Binlog写入机制 两段提交 概要 Redo Log和Binlog是MySQL日志系统中非常重要的两种机制&#xff0c;也有很多相似之处&#xff0c;本文主要介绍两者细节和区别。 Redo Log日志 Redo Log的作…

Docker+ Jenkins+Maven+git自动化部署

环境&#xff1a;Centos7 JDK1.8 Maven3.3.9 Git 2.40 Docker 20.10.17 准备工作&#xff1a; 安装Docker Centos7默认的yum安装的docker是1.13&#xff0c;版本太低&#xff0c;很多镜像都要Docker版本要求&#xff0c;升级Docker版本。 卸载已安装Docker: yum …

你知道如何实现游戏中的透视效果吗?

引言 游戏中的透视效果可以合理运用CtrlCV实现。 不知道大家有没有这样一段经历&#xff1a;在做Cocos项目时需要一些特定的Shader去做一些特定的效果&#xff0c;例如透视、高光、滤镜等等&#xff0c;想自己写吧&#xff0c;不怎么会啊&#xff0c;网上又找不到&#xff0c…

27 - 如何使用设计模式优化并发编程?

在我们使用多线程编程时&#xff0c;很多时候需要根据业务场景设计一套业务功能。其实&#xff0c;在多线程编程中&#xff0c;本身就存在很多成熟的功能设计模式&#xff0c;学好它们&#xff0c;用好它们&#xff0c;那就是如虎添翼了。今天我就带你了解几种并发编程中常用的…

redis-cluster集群(目的:高可用)

1、特点 集群由多个node节点组成&#xff0c;redis数据分布在这些节点中&#xff0c;在集群中分为主节点和从节点&#xff0c;一个主对应一个从&#xff0c;所有组的主从形成一个集群&#xff0c;每组的数据是独立的&#xff0c;并且集群自带哨兵模式 2、工作原理 集群模式中…

【ZedBoard学习实例1】 VGA显示彩条

ZedBoard学习实例1 VGA显示彩条 ZedBoard学习实例1 VGA显示彩条参考文章改进 ZedBoard学习实例1 VGA显示彩条 参考文章 彩条控制verilog代码 主体参考了该文章的代码&#xff0c;文中还介绍了相关的电路图&#xff0c;还有ZedBoard的手册内容。19201080分辨率显示器的参数 针…

重生之我是一名程序员 37 ——C语言中的栈溢出问题

哈喽啊大家晚上好&#xff01; 今天呢给大家带来一个烧脑的知识——C语言中的栈溢出问题。那什么是栈溢出呢&#xff1f;栈溢出指的是当程序在执行函数调用时&#xff0c;为了保护函数的局部变量和返回地址&#xff0c;将这些数据存储在栈中。如果函数在函数调用时使用了过多的…

Sentinel核心类解读:Entry

默认情况下&#xff0c;Sentinel会将controller中的方法作为被保护资源&#xff0c;Sentinel中的资源用Entry来表示。 Sentinel中Entry可以理解为每次进入资源的一个凭证&#xff0c;如果调用SphO.entry()或者SphU.entry()能获取Entry对象&#xff0c;代表获取了凭证&#xff…

安卓手机便签APP用哪个,手机上好用的便签APP是什么

在日常生活及工作方面&#xff0c;总是有许多做不完的事情需要大家来处理&#xff0c;当多项任务堆叠交叉在一起时&#xff0c;很容易漏掉一些项目&#xff0c;这时候大家会借助经常携带的手机来记录容易忘记的事情&#xff0c;如手机上的闹钟、定时提醒软件都可以用来记录待办…

2023亚太杯数学建模A题思路分析 - 采果机器人的图像识别技术

1 赛题 问题A 采果机器人的图像识别技术 中国是世界上最大的苹果生产国&#xff0c;年产量约为3500万吨。与此同时&#xff0c;中国也是世 界上最大的苹果出口国&#xff0c;全球每两个苹果中就有一个&#xff0c;全球超过六分之一的苹果出口 自中国。中国提出了一带一路倡议…

JDK11新特性

目录 一、JShell 二、Dynamic Class-File Constants类文件新添的一种结构 三、局部变量类型推断&#xff08;var ”关键字”&#xff09; 四、新加的一些实用API 1. 新的本机不可修改集合API 2. Stream 加强 3. String 加强 4. Optional 加强 5. 改进的文件API 五、移…

canvas

Canvas 是 Android 中用于绘制图形的重要类&#xff0c;它提供了许多用于绘制的常用方法。以下是一些常用的 Canvas 方法&#xff1a; 绘制颜色和背景&#xff1a; drawColor(int color): 用指定颜色填充整个画布。drawRGB(int r, int g, int b): 用 RGB 值指定颜色填充整个画布…

进程池,线程池与跨进程数据共享爬取某岸网图片

看教程的时候看到一个&#xff0c;生产者跟消费者的概念比较有意思&#xff0c;但是给的代码有问题无法正常运行&#xff0c;于是我就捣鼓了一下。 基本概念就是&#xff1a; 生产者&#xff1a; 一个进程获取网页没页的图片连接&#xff08;主进程…

Django框架之中间件

目录 一、引入 二、Django中间件介绍 【1】什么是Django中间件 【2】Django中间件的作用 【3】示例 三、Django请求生命周期流程图 四、Django中间件是Django的门户 五、Django中间件详解 六、中间件必须要掌握的两个方法 (1) process_request (2) process_respon…

Redis集群环境各节点无法互相发现与Hash槽分配异常 CLUSTERDOWN Hash slot not served的解决方式

原创/朱季谦 在搭建Redis5.x版本的集群环境曾出现各节点无法互相发现与Hash槽分配异常 CLUSTERDOWN Hash slot not served的情况&#xff0c;故而把解决方式记录下来。 在以下三台虚拟机机器搭建Redis集群—— 192.168.200.160192.168.200.161192.168.200.162启动三台Redis集…