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.pswp.cn/news/165651.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165651.shtml
英文地址,請注明出處:http://en.pswp.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集…