北京做手机网站的公司,隆回网站建设制作,温州专业网站建设,网站开发可行性引言iPhone12pro有望成为2020年末真香机#xff0c;动辄3000元的溢价让不少消费者选择了等待官网调货。除了官方与电商线上平台#xff0c;苹果还采用了线下预约制提货。但每天少的可怜的出货量#xff0c;和不到一秒钟就抢空的预约名额让“老年人”手速的各位望而却步。传…引言iPhone12pro有望成为2020年末真香机动辄3000元的溢价让不少消费者选择了等待官网调货。除了官方与电商线上平台苹果还采用了线下预约制提货。但每天少的可怜的出货量和不到一秒钟就抢空的预约名额让“老年人”手速的各位望而却步。传统的“先到先得”式的预约方式以实时性队列性模式为特点简单来说也就是我们所说的“先到先得”。Python作为被广泛运用的脚本语言可通过计划任务将操作延时降到最低以最大化获得预约资格的可能性。除了用于Apple官网此教程亦可用于sneaker等球鞋发售平台。本文采用 Selenium自动化测试模块配合Chromedriver实现推荐入门级新手编写。Part 1: 环境配置Python版本3.8pip版本20.2.41.安装Seleniumwindows用户打开cmdmac用户打开Terminal(终端)本文采用windows演示在控制台中输入 pip install seleniumCMD控制台出现如下输出则说明Selenium安装成功安装成功在控制台中输入python于第一行输入 import selenium如未出现Module报错则验证Selenium已安装成功。2. 安装chromedriverChromedriver为给予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 webdriverfrom selenium.webdriver.support.select import Selectfrom selenium.webdriver.chrome.options import Optionsimport prettytable as ptimport osexcept ModuleNotFoundError as e:print(缺少依赖模块正在安装)import osp os.popen(pip install selenium)print(p.read())p os.popen(pip install prettytable)print(p.read())from selenium import webdriverfrom selenium.webdriver.support.select import Selectfrom selenium.webdriver.chrome.options import Optionsimport prettytable as ptimport timeimport 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 % colorlocaltime: info\033[0m )#判断商店是否可用def isResAvaliable(b):succuss 立即预约购买你的新 iPhone。try:if b.find_element_by_xpath(xpath//h1).text succuss:return Trueexcept:return Falsereturn False#选择手机种类def purchase(browser:webdriver.Chrome):try:color browser.find_element_by_xpath(xpath//section[idproduct-selector]/fieldset[2]/ul/li[4]/div/label/div)color.click()#选择颜色except:push(COLOR CHOOSE ERROR,FAILED)return Falsetry:capacity browser.find_element_by_xpath(xpath//label[idcapacity-1-label])capacity.click()#选择容量except:push(CAPACITY CHOOSE ERROR,FAILED)return Falsetry:store browser.find_element_by_xpath(xpath//select[idanchor-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?iUPN)time.sleep(3)if isResAvaliable(storeOne):purchase(browserstoreOne)status storeOne.find_element_by_xpath(xpath//input[idstore-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?iUPN)time.sleep(3)if isResAvaliable(storeTwo):purchase(browserstoreTwo)status storeTwo.find_element_by_xpath(xpath//input[idstore-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?iUPN)time.sleep(3)if isResAvaliable(storeThree):purchase(browserstoreThree)status storeThree.find_element_by_xpath(xpath//input[idstore-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(targetStore_1,args(storeStatus,))#商店1线程threads.append(t1)#加入线程池t2 threading.Thread(targetStore_2,args(storeStatus,))#商店2线程threads.append(t2)#加入线程池t3 threading.Thread(targetStore_3,args(storeStatus,))#商店3线程threads.append(t3)#加入线程池count 0for t in threads:#运行线程t.start()count1push(Waiting Server str(count)returning data,SUCCESS)time.sleep(1)for t in threads:#在浏览器获得信息之前不刷新表格t.join()showStores()#输出状态简单的加一点细节一个简单的判断是否可以预约的程序就完成啦效果运行如下到此为止你已经基本知道该如何使用selenium了也对网页分析以及判断的逻辑有了基本的认识下一章我们将实现购买和完成预约点赞过20下周更新点赞过50后天更新点赞过100磕着护肝药立马更新T_T声明本文仅用作个人学习使用禁止用于任何违法活动所产生的后果与代码作者无关