引言

​iPhone12pro有望成为2020年末真香机,动辄3000元的溢价让不少消费者选择了等待官网调货。除了官方与电商线上平台,苹果还采用了线下预约制提货。但每天少的可怜的出货量,和不到一秒钟就抢空的预约名额让“老年人”手速的各位望而却步。传统的“先到先得”式的预约方式,以实时性,队列性模式为特点,简单来说也就是我们所说的“先到先得”。Python作为被广泛运用的脚本语言,可通过计划任务,将操作延时降到最低,以最大化获得预约资格的可能性。除了用于Apple官网,此教程亦可用于sneaker等球鞋发售平台。

本文采用 Selenium自动化测试模块,配合Chromedriver实现,推荐入门级新手编写。

Part 1: 环境配置

Python版本:3.8

pip版本:20.2.4

1.安装Selenium

windows用户打开cmd,mac用户打开Terminal(终端),本文采用windows演示

在控制台中输入 pip install selenium

CMD控制台

出现如下输出则说明Selenium安装成功

安装成功

​在控制台中输入python,于第一行输入 import selenium

​如未出现Module报错,则验证Selenium已安装成功。

2. 安装chromedriver

Chromedriver为给予chromium内核,用于自动化测试的可编程式浏览器。如果Selenium是大脑,那么Cromedriver则是由大脑控制的躯干,缺一不可。

将下载的文件移入与项目相同的目录下(这里非常重要,否则会导致浏览器无法被正确调用)

复制chromedriver到项目文件夹

​测试代码:

​运行后,如呼出chrome浏览器则说明chromedriver被正确配置

​如果你已走到这一步,Congrats, 你已经成功一半了!

Part 2: 检测商店是否可用

苹果预约通道将于每天早上6点刷新,如果预约名额已满或者商店未到预约时间将会显示如下页面

商店不可用

​右键检查元素,发现如果商店不可用则会出现H1 “我们零售店目前不接受 iPhone 的预约购买。”

判断商店是否可用的逻辑就是这么简单粗暴,如果出现这行字则商店不可用,反之亦然。

下面为实现逻辑代码:

​运行效果:

​控制台将每秒输出当前商店的状态

Part 3: 实时获取各零售店的预约情况

上文中提到,iPhone12 Pro商店预约资格已满,下文则使用iPhone 12的页面演示(两者页面布局相同,仅链接及部分按钮id不同)

进入预约页面,观察网页布局

​透过观察,我们发现,在选择颜色以及容量之前,选择零售店的按钮是不可用的。第一步我们需要选择需要的颜色以及容量。右键按钮,检查元素即可获得改按钮在页面中的绝对位置xpath

一下以蓝色 64G举例

颜色

容量

下一步,选择地区。我们通过点击发现,如果选择一个城市的零售店,下面将会自动列出相应城市的其他零售店,所以在第一个选择框,我们只需任意选择一个相应城市的零售店。

​通过前端代码,惊喜地发现,苹果把每一家店通过Rxx的形式描述。

从某种意义上来说,这几个按钮可以帮助我们判断零售店是否可以供我们预约

不可用

​也就是说,如果按钮可以按下,则说明预约是可用的,相反,如果按钮无法按下,则当前零售店不可用。

整理一下逻辑,判断零售店预约情况可被分为三步

1.官网预约通道是否开启(part 2 中提到)

​2.选择我们想要的颜色以及容量

3.选择地区

4.判断地区零售店按钮是否可用来返回零售店状态

完整实现代码如下:

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()

#初始化状态列表

storeStatus = pt.PrettyTable()

storeStatus.field_names = ["Name","Status"]

statusList = []

#带状态的输出方法

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")#选择地区

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 实时商店预约状态","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()#输出状态

​简单的加一点细节,一个简单的判断是否可以预约的程序就完成啦!

效果运行如下:

​到此为止,你已经基本知道该如何使用selenium了,也对网页分析以及判断的逻辑有了基本的认识,下一章我们将实现购买和完成预约,

点赞过20下周更新

点赞过50后天更新

点赞过100磕着护肝药立马更新T_T

声明!!!:

本文仅用作个人学习使用,禁止用于任何违法活动,所产生的后果与代码作者无关

python官网支持货到付款吗_官网购买的iPhone12pro还没发货?试着用Python快速入手...相关推荐

  1. python超市买苹果_官网购买的iPhone12pro还没发货?试着用Python快速入手

    引言 ​iPhone12pro有望成为2020年末真香机,动辄3000元的溢价让不少消费者选择了等待官网调货.除了官方与电商线上平台,苹果还采用了线下预约制提货.但每天少的可怜的出货量,和不到一秒钟就 ...

  2. python 绿色字体是什么意思_知网报告上的绿色字体代表什么?

    知网查重是同学们在提交毕业论文之前非常重要的一个部分,但是很多人都会在这一部分出现很多问题,有的人在进行知网查重之后,得到了查重报告,但是他们却看不懂知网查重系统的一些检测结果,因为这份查重报告里面有 ...

  3. python 找到目录下文件名规则_假如编程是魔法之零基础看得懂的Python入门教程 ——(二)魔法实习生第一步了解魔杖的使用...

    学习目标 了解什么是开发环境 了解python语言的环境安装 了解python语言编程的编辑器工具 一.打怪升级你先得了解武器使用的条件 对于很多第一次学习编程的同学对于很多定义性的概念大多都不了解, ...

  4. 实时网速监测app_实时网速安卓下载_实时网速监测安卓app下载-XP软件园

    详情介绍 实时网速安卓是一款简单实用的手机网速监测工具,自身的体积只有2m大小,对手机运行的网速数字显示最新网速,掌握目前手机网速情况,需要就来下载实时网速安卓吧. 实时网速安卓介绍 实时网速监测安卓 ...

  5. python自带的对称算法_一种基于对称算法和专用加载模块的Python程序模块加密方法...

    一种基于对称算法和专用加载模块的Python程序模块加密方法 [专利说明]一种基于对称算法和专用加载模块的Python程序模块加密方法 技术领域 [0001]本发明涉及一种网络安全技术,具体涉及一种P ...

  6. 苹果wifi网速慢怎么办_家里网速慢如何解决 提高WiFi网速方法【详解】

    几乎每个人家里都有无线WiFi,无线WiFi信号强弱则成为影响无线WiFi运用体验的重要原因之一.为什么家里无线WiFi网速时快时慢?为什么不一样位置的网速差别大?根据英国<每日邮报>报道 ...

  7. python面试大全 萧井陌_有多少人按@萧井陌大神给出的Python+Flask路线找到工作了?...

    python+Flask(之后转Django)的答一发. 背景先上,30+岁,零基础,自学.不管是年龄还是工作背景还是教育经历都同web开发无关.也没有名校背景. 二月初开始学,五月拿到offer.三 ...

  8. 安卓10不支持qmc解码_官宣:安卓10已发布!21款手机已适配,小米华为率先支持...

    随着今天凌晨谷歌 I/O 大会的召开,Android Q 也就是安卓10正式官宣,新版的安卓10加入了诸多新手势,从 Home 键设计上看,安卓10 的新版手势很大程度上有疑似借鉴 iOS 的手势,底 ...

  9. 官网mysql安装目录_官网下载MySQL 并安装

    官网下载MySQL 并安装 一.下载 二.安装:这里不再叙述安装步骤 三.MySQL环境变量配置不是必须的. MySQL环境变量作用: 找到MySQL安装目录下的bin目录,才能使用MySQL相关命令 ...

最新文章

  1. leetcode 470. 用 Rand7() 实现 Rand10()
  2. ubuntu服务器启动过程中重启卡死的问题解决办法
  3. 最长递增子序列和网易去除最少使从左向右递增又递减问题
  4. 我的程序都是这样命名的:openeim001
  5. 阿里巴巴公布香港IPO定价:每股176港元
  6. 深度学习基础(十一)—— 稀疏自编码器(二)
  7. 序列化和反序列化(七)——Java对象的网络传输(二)
  8. MapXtreme实用技巧
  9. HDFS的命令行使用【常用 hdfs 命令】
  10. 调试错误解决方案之VC++
  11. 服务器虚拟化2种架构,服务器虚拟化常用架构详解
  12. 中仪股份管道机器人_中仪股份_X5-HW_管道检测机器人
  13. oracle实时备份归档日志实现异机恢复丢失数据最小化
  14. 超全!SLAM论文与开源代码汇总(激光+视觉+融合)
  15. 统计学中数据分析方法汇总!
  16. oracle安装后,电脑变得很卡,解决办法(安装的是oracle11g)
  17. X站全称是什么_考不上高中上什么专业
  18. 01-JavaScript基础
  19. Android 基础:Materia Design 定义视图阴影elevation和创建卡片CardView
  20. 【原来python还可以这么玩】python逆向爬取网易云评论进行情感分析

热门文章

  1. 微信端图片上传方式2
  2. 445port入侵具体解释
  3. UVA10534-----Wavio Sequence-----动态规划之LIS
  4. 遇java.lang.OutOfMemoryError: PermGen space之解决方案
  5. MySQL常见面试题解析
  6. hadoop完全分布式集群群起
  7. gtf与gff3文件【格式】【转换】
  8. Java复习二 基本数据类型与变量和常量
  9. eclipse中各种查找
  10. Django-View中绕过RSCF验证