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

引言

​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

声明!!!:

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

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

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

相关文章

server多列转行 sql_sql server 行转列及列转行的使用

在我们使用的数据库表中经常需要用到行列互相转换的情况,使用sql 的关键词 UNPIVOT(列转行)和PIVOT(行转列)可轻松实现行列转换。一、列转行:员工月份排班表存储是采用1号~31号作为列的方式进行存储的现通过 UNPIVOT 将每天的班次用行进行展示&#xff0…

git 拉取远程其他分支代码_git切换远程分支并拉取远程分支代码

Git一般有很多分支,我们clone到本地的时候一般都是master分支,那么如何切换到其他分支呢?主要命令如下:1. 查看远程分支$ git branch -a我在mxnet根目录下运行以上命令:~/mxnet$ git branch -a* master可以看到&#x…

python登录豆瓣_python登录豆瓣,发帖

学习了urllib、urllib2及cookielib常用方法的使用登录豆瓣,由于有验证码,采取的办法是将验证码图片下载到同目录下,查看图片后输入验证码即可登录、发帖帖子内容写死在代码中了[Python]代码# -- coding:gbk --import sys, time, os, reimport…

ios 代码设置控件宽高比_ios-自动布局以保持视图大小比例

我正在努力实现以下目标:我的xib中有2个视图,需要使边缘(两侧和顶部)保持20像素需要调整大小的2个视图的大小不同它们必须相隔20像素它们的宽度需要相对于父视图的宽度保持不变我阅读了有关执行此操作的教程,但是它的工作原理是,它…

echarts 在两点之间画一条线_树的手绘很难画?分步骤教你画,简单易学,收藏起来临摹学习...

前景树——半树、角树画法半树与角树,在建筑手绘中常处于前景位置,其表现需尽量写意,形体概括,对比强烈,进而更好地引导与突出中景。(1)半树半树,顾名思义只需画出单棵树从树冠中下部…

opencv python 直方图反向投影_python OpenCV学习笔记直方图反向投影的实现

本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下:它用于图像分割或寻找图像中感兴趣的对象。简单地说,它创建一个与我们的输入图像相同大小(但单通道)的图像,其中每个像素对应于属于我们对象…

上古卷轴5json文件修改_【白夜谈】我做了一款失败的《社长卷轴》Mod

文/Kong 题图 / CaesarZX白夜谈是编辑的自留地,聊一些比较个人的内容。但是对于我来说,这个栏目总是一个特别的苦差。因为我实在没有太多表达观点的欲望,所以我和负责白夜谈的跳跳老师商量,可不可以尝试搞个系列节目。比如&#x…

中音萨克斯指法表图_初学萨克斯一定要了解这6点基础知识

萨克斯管是一种色彩性很强的乐器,它的声音独特,带有神秘的色彩,音色十分迷人,是一种比较接近人声特点的乐器,因此吸引到越来越多的人喜欢上萨克斯。那么新手在初学阶段关于萨克斯一定要了解这6点基础知识。一、萨克斯管…

在哪里可以找水系图_虹吸雨水排水系统对比传统重力排水,好在哪里?

建筑物的排水系统是必不可少的,雨水的排水又是其重中之重的排水系统。雨水排水系统的选择我们需要考虑哪些因素呢?下面就介绍一下虹吸雨水排水系统相较于传统重力排水的优势到底在哪里?一、虹吸雨水排水系统原理形成原理:利用屋面…

ug编程内公差和外公差是什么_工厂老师傅自学数控编程多年心得,希望你们少走弯路...

需要UG资料可以关注私信 “UG"或者 ”UG教程 “领取。很多人都认为自学有恒心有耐心有定力就可以了,有这些意志还没有达到自学的水准,因为有很多东西你都不知道是有这回事的,或许你知道有这回事你根本解决不了,自学的满足条件…

加油站都需要什么手续_农村买房过户都需要什么手续?

一、农村房屋过户怎么办理? 根据我国法律的规定,办理农村房屋过户需要去乡或镇的国土所。农村房屋过户需要去乡镇国土所提出申请,提交相关材料后,当地国土所根据申请人提供的权属资料进行审查,实地进行勘丈、调查、公…

zplane函数怎么用m文件调用_matlab中一个m文件怎么调用另一个m文件的函数

展开全部1、首先要在笔记62616964757a686964616fe59b9ee7ad9431333431353265本电脑上安装好指定版本的matlab软件并双击打开。2、然后双击matlab图标打开其主页面,可以看到这个软件的按钮都是全英文单词的。3、那么创建m文件的方法就是鼠标移动到New按钮上单击一下&…

axi时序图_深入 AXI4总线(E3)实战:制作一个 AXI 接口 IP

本系列我想深入探寻 AXI4 总线。不过事情总是这样,不能我说想深入就深入。当前我对 AXI总线的理解尚谈不上深入。但我希望通过一系列文章,让读者能和我一起深入探寻 AXI4。在本系列先前的文章中,我们首先通过协议 specification 了解协议的接…

动点四边形周长最短_初中几何--线段之和最小值 Part 1:通过点关于直线对称点得到两定点之间直线段长度最短。...

下面介绍下求线段和最小值常见题型1,通过点关于直线对称点得到两定点之间直线段长度最短。以下题为例,已知矩形ABCD,AB8, AD6.E,F分别为AB,AD的中点。G,H分别为BC,AB上动点。求四边形…

番茄钟怎么调_学习神器-番茄钟

番茄钟番茄工作法是简单易行的时间管理方法。使用番茄工作法,选择一个待完成的任务,将番茄时间设为25分钟,专注工作,中途不允许做任何与该任务无关的事。直到番茄时钟响起,然后进行短暂休息一下(5分钟就行&…

获取某一条_想获取流量?这几种工具是必须要有的,能帮你获客快人一步!

2020年,最难的莫过于实体店了,而没有受到影响的,也就是那些互联网企业,一切企业甚至业绩比以前还好,不得不承认,互联网确实有它的独特之处。也因此,很多实体商家也在慢慢向互联网转变。为什么要…

python 修改word中的表格_python批量处理word中的表格

def word_table_formater():from win32com import clientword client.Dispatch(Word.Application)doc word.Documents.Open(C:\\Users\\Administrator\\Desktop\\test.docx)i 1for table in doc.Tables:print(i, len(doc.Tables))# 设置列宽table.Columns(1).Width 85table…

排除jar_Gradle排除依赖关系

Gradle排除依赖关系在IDE中发现了C3P0的依赖,但是在build.gradle并没有手动导入,所以说某个jar包依赖了,在STS中没有像Maven可以直接查看依赖的窗口可以在命令行下查看整个项目的依赖关系gradle dependencies![[外链图片转存失败(img-v7CgoEk…

python3中实现tar_Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法...

本文实例讲述了Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法。分享给大家供大家参考。具体实现方法如下:# 这里将一个文件树中的所有文件和子目录归档到一个tar归档文件,然后压缩import tarfile, os# compression表示压缩算法&#xf…

格式怎么转换_爱奇艺下载的视频怎么转换成常见的mp4格式?

虽说现如今在线观看视频已经很流畅了,只要网速在线,基本上不会出现画面卡顿的情况,但是仍然有不少小伙伴会将视频从各大平台中下载下来收看,这样,即便是没有联网,也不会影响视频播出。不知道大家在从爱奇艺…