python超市买苹果_官网购买的iPhone12pro还没发货?试着用Python快速入手
引言
?iPhone12pro有望成為2020年末真香機,動輒3000元的溢價讓不少消費者選擇了等待官網(wǎng)調(diào)貨。除了官方與電商線上平臺,蘋果還采用了線下預約制提貨。但每天少的可憐的出貨量,和不到一秒鐘就搶空的預約名額讓“老年人”手速的各位望而卻步。傳統(tǒng)的“先到先得”式的預約方式,以實時性,隊列性模式為特點,簡單來說也就是我們所說的“先到先得”。Python作為被廣泛運用的腳本語言,可通過計劃任務,將操作延時降到最低,以最大化獲得預約資格的可能性。除了用于Apple官網(wǎng),此教程亦可用于sneaker等球鞋發(fā)售平臺。
本文采用 Selenium自動化測試模塊,配合Chromedriver實現(xiàn),推薦入門級新手編寫。
Part 1: 環(huán)境配置
Python版本:3.8
pip版本:20.2.4
1.安裝Selenium
windows用戶打開cmd,mac用戶打開Terminal(終端),本文采用windows演示
在控制臺中輸入 pip install selenium
CMD控制臺
出現(xiàn)如下輸出則說明Selenium安裝成功
安裝成功
?在控制臺中輸入python,于第一行輸入 import selenium
?如未出現(xiàn)Module報錯,則驗證Selenium已安裝成功。
2. 安裝chromedriver
Chromedriver為給予chromium內(nèi)核,用于自動化測試的可編程式瀏覽器。如果Selenium是大腦,那么Cromedriver則是由大腦控制的軀干,缺一不可。
將下載的文件移入與項目相同的目錄下(這里非常重要,否則會導致瀏覽器無法被正確調(diào)用)
復制chromedriver到項目文件夾
?測試代碼:
?運行后,如呼出chrome瀏覽器則說明chromedriver被正確配置
?如果你已走到這一步,Congrats, 你已經(jīng)成功一半了!
Part 2: 檢測商店是否可用
蘋果預約通道將于每天早上6點刷新,如果預約名額已滿或者商店未到預約時間將會顯示如下頁面
商店不可用
?右鍵檢查元素,發(fā)現(xiàn)如果商店不可用則會出現(xiàn)H1 “我們零售店目前不接受 iPhone 的預約購買。”
?
判斷商店是否可用的邏輯就是這么簡單粗暴,如果出現(xiàn)這行字則商店不可用,反之亦然。
下面為實現(xiàn)邏輯代碼:
?
?
?運行效果:
?控制臺將每秒輸出當前商店的狀態(tài)
?
Part 3: 實時獲取各零售店的預約情況
上文中提到,iPhone12 Pro商店預約資格已滿,下文則使用iPhone 12的頁面演示(兩者頁面布局相同,僅鏈接及部分按鈕id不同)
進入預約頁面,觀察網(wǎng)頁布局
?透過觀察,我們發(fā)現(xiàn),在選擇顏色以及容量之前,選擇零售店的按鈕是不可用的。第一步我們需要選擇需要的顏色以及容量。右鍵按鈕,檢查元素即可獲得改按鈕在頁面中的絕對位置xpath
一下以藍色 64G舉例
顏色
?
容量
下一步,選擇地區(qū)。我們通過點擊發(fā)現(xiàn),如果選擇一個城市的零售店,下面將會自動列出相應城市的其他零售店,所以在第一個選擇框,我們只需任意選擇一個相應城市的零售店。
?通過前端代碼,驚喜地發(fā)現(xiàn),蘋果把每一家店通過Rxx的形式描述。
從某種意義上來說,這幾個按鈕可以幫助我們判斷零售店是否可以供我們預約
不可用
?也就是說,如果按鈕可以按下,則說明預約是可用的,相反,如果按鈕無法按下,則當前零售店不可用。
整理一下邏輯,判斷零售店預約情況可被分為三步
1.官網(wǎng)預約通道是否開啟(part 2 中提到)
?2.選擇我們想要的顏色以及容量
3.選擇地區(qū)
4.判斷地區(qū)零售店按鈕是否可用來返回零售店狀態(tài)
完整實現(xiàn)代碼如下:
try:
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.chrome.options import Options
import prettytable as pt
import os
except ModuleNotFoundError as e:
print("缺少依賴模塊,正在安裝")
import os
p = os.popen("pip install selenium")
print(p.read())
p = os.popen("pip install prettytable")
print(p.read())
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.chrome.options import Options
import prettytable as pt
import time
import threading
#初始化瀏覽器
storeOne = webdriver.Chrome()
storeTwo = webdriver.Chrome()
storeThree = webdriver.Chrome()
#初始化狀態(tài)列表
storeStatus = pt.PrettyTable()
storeStatus.field_names = ["Name","Status"]
statusList = []
#帶狀態(tài)的輸出方法
def push(info, flag):
type = {"SUCCESS":"32","WARNING":"33","FAILED":"31"}
color = type[flag]
localtime = time.asctime( time.localtime(time.time()) )
print("\033[0;%s;40m\t" % color+localtime+": "+info+"\033[0m" )
#判斷商店是否可用
def isResAvaliable(b):
succuss = "立即預約購買你的新 iPhone。"
try:
if b.find_element_by_xpath(xpath="//h1").text == succuss:
return True
except:
return False
return False
#選擇手機種類
def purchase(browser:webdriver.Chrome):
try:
color = browser.find_element_by_xpath(xpath="//section[@id='product-selector']/fieldset[2]/ul/li[4]/div/label/div")
color.click()#選擇顏色
except:
push("COLOR CHOOSE ERROR","FAILED")
return False
try:
capacity = browser.find_element_by_xpath(xpath="//label[@id='capacity-1-label']")
capacity.click()#選擇容量
except:
push("CAPACITY CHOOSE ERROR","FAILED")
return False
try:
store = browser.find_element_by_xpath(xpath="//select[@id='anchor-store']")
Select(store).select_by_value("R493")#選擇地區(qū)
except:
push("STORE UNAVALIABLE","FAILED")
return False
#南京艾尚天地
def Store_1(table:pt):
storeOne.get("https://reserve-prime.apple.com/CN/zh_CN/reserve/F/availability?iUP=N")
time.sleep(3)
if isResAvaliable(storeOne):
purchase(browser=storeOne)
status = storeOne.find_element_by_xpath(xpath="//input[@id='store-R703']").is_enabled()
if status:
statusList.append(["南京艾尚天地", "Available"])
else:
statusList.append(["南京艾尚天地", "NO"])
else:
statusList.append(["南京艾尚天地", "STORE IS CLOSED"])
#南京虹悅城
def Store_2(table:pt):
storeTwo.get("https://reserve-prime.apple.com/CN/zh_CN/reserve/F/availability?iUP=N")
time.sleep(3)
if isResAvaliable(storeTwo):
purchase(browser=storeTwo)
status = storeTwo.find_element_by_xpath(xpath="//input[@id='store-R643']").is_enabled()
if status:
statusList.append(["南京虹悅城","Available"])
else:
statusList.append(["南京虹悅城", "NO"])
else:
statusList.append(["南京虹悅城", "STORE IS CLOSED"])
def Store_3(table:pt):
storeThree.get("https://reserve-prime.apple.com/CN/zh_CN/reserve/F/availability?iUP=N")
time.sleep(3)
if isResAvaliable(storeThree):
purchase(browser=storeThree)
status = storeThree.find_element_by_xpath(xpath="//input[@id='store-R493']").is_enabled()
if status:
statusList.append(["南京金茂匯", "Available"])
else:
statusList.append(["南京金茂匯", "NO"])
else:
statusList.append(["南京金茂匯", "STORE IS CLOSED"])
def showStores():
for status in statusList:
storeStatus.add_row(status)
while True:
os.system("CLS")
push("iphone 12, 藍色, 128G 實時商店預約狀態(tài)","WARNING")
print(storeStatus)
push("--Update Time","WARNING")
time.sleep(3)
if __name__ == '__main__':
threads = []
t1 = threading.Thread(target=Store_1,args=(storeStatus,))#商店1線程
threads.append(t1)#加入線程池
t2 = threading.Thread(target=Store_2,args=(storeStatus,))#商店2線程
threads.append(t2)#加入線程池
t3 = threading.Thread(target=Store_3,args=(storeStatus,))#商店3線程
threads.append(t3)#加入線程池
count = 0
for t in threads:#運行線程
t.start()
count+=1
push("Waiting Server "+str(count)+"returning data","SUCCESS")
time.sleep(1)
for t in threads:#在瀏覽器獲得信息之前不刷新表格
t.join()
showStores()#輸出狀態(tài)
?簡單的加一點細節(jié),一個簡單的判斷是否可以預約的程序就完成啦!
效果運行如下:
?到此為止,你已經(jīng)基本知道該如何使用selenium了,也對網(wǎng)頁分析以及判斷的邏輯有了基本的認識,下一章我們將實現(xiàn)購買和完成預約,
點贊過20下周更新
點贊過50后天更新
點贊過100磕著護肝藥立馬更新T_T
聲明!!!:
本文僅用作個人學習使用,禁止用于任何違法活動,所產(chǎn)生的后果與代碼作者無關(guān)
?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的python超市买苹果_官网购买的iPhone12pro还没发货?试着用Python快速入手的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python数学计算模块_Python-
- 下一篇: 博客网站源代码_详解SEO布词以及网站排