欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Python+selenium实现医院自动挂号

时间:2023-05-28
Python+selenium实现医院自动挂号

有些医院某些专家大牛的号总是“一号难求”,基本是放票秒空,针对这种情况,掌握一定技术的小伙伴可以使用自动化手法进行挂号

首先声明该脚本仅仅用于娱乐和相关技术学习,不用于商业用途

所用到的技术:

python 3.7selenium库xpath

抢号之前首先需要登录

准备好登录用的身份信息和网页的url,这里由于网页的登录有验证码,选择自动开启浏览器的方式以便于观察验证码手动输入,并且设置了browser.implicitly_wait(10)来等待元素加载完成

def login(username, password): url = "http://wxyy.nxtcm.com/cmph-web/login" browser = webdriver.Chrome(executable_path=( r'D:SoftwareGoogleChromeApplicationchromedriver.exe')) browser.implicitly_wait(10) browser.get(url) browser.find_element(By.ID, "username").send_keys(username) browser.find_element(By.ID, "password").send_keys(password) code = input('请输入验证码:') browser.find_element(By.ID, "validateCode").send_keys(code) browser.find_element(By.ID, "btn-login").submit()

成功登录后,跳转到目标医生的url,并且模拟正常挂号的鼠标操作

target_url = "http://wxyy.nxtcm.com/cmph-web/interhos/clinic/reg/order?doc_id=0923705b-a14f-11ea-b0d0-39cb51340fae" browser.get(target_url)

正常挂号操作如下

首先跳转到医生界面

一开始显示星期四02-17有号,检查网页源码发现该元素为一个span类型元素,点击后会执行getsurplus方法获取可供预约的时间段,而435255就是发送post请求需要传递的参数

所以第一步要点击这个span元素,这里注意直接找到该元素并且执行click()是不行的,只点击无法执行gesurplus,必须随后执行perform()

time1=browser.find_element(By.XPATH, "//td[@id='2022-02-17am']/span") ActionChains(browser).move_to_element(time1).click(time1).perform()

之后选择时间段后确认提交

提交也是一个post请求suborder,其参数就是挂号的信息

browser.find_element(By.XPATH,".//div[@class='head']/ul/li[1]").click() browser.find_element(By.XPATH,"//div[@class='money_button']/a[@id='orderbtn']").click()

然后由于在固定时间才开始放票,需要不断刷新,所以将上述代码放在一个循环中,间隔一定时间执行一次,并且输出信息,如果无票则刷新,无票时,对应的span的class属性是disabled,借助这一点可以实现功能

while True: # 如果元素不能点击则continue status = browser.find_element( By.XPATH, "//td[@id='2022-02-22am']/span").get_attribute("class") if status != "disabled": time1 = browser.find_element( By.XPATH, "//td[@id='2022-02-22am']/span") time1.click() print(time1) ActionChains(browser).move_to_element( time1).click(time1).perform() browser.find_element( By.XPATH, ".//div[@class='head']/ul/li[1]").click() browser.find_element( By.XPATH, "//div[@class='money_button']/a[@id='orderbtn']").click() print("预约成功") break else: time.sleep(0.1) print("未到放票时间") browser.refresh()

完整代码如下

# coding = utf-8import timefrom selenium import webdriverfrom time import sleepfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.action_chains import ActionChainsdef login(username, password): url = "http://wxyy.nxtcm.com/cmph-web/login" browser = webdriver.Chrome(executable_path=( r'D:SoftwareGoogleChromeApplicationchromedriver.exe')) browser.implicitly_wait(10) browser.get(url) browser.find_element(By.ID, "username").send_keys(username) browser.find_element(By.ID, "password").send_keys(password) code = input('请输入验证码:') browser.find_element(By.ID, "validateCode").send_keys(code) browser.find_element(By.ID, "btn-login").submit() target_url = "http://wxyy.nxtcm.com/cmph-web/interhos/clinic/reg/order?doc_id=0923705b-a14f-11ea-b0d0-39cb51340fae" browser.get(target_url) date = "2022-02-17am"# date="2022-02-22am" while True: # 如果元素不能点击则continue xpath = '//td[@id="'+date+'"]/span' print(xpath) status = browser.find_element( By.XPATH, xpath).get_attribute("class") if status != "disabled": try: time1 = browser.find_element( By.XPATH, xpath) time1.click() print(time1.get_attribute("class onclick")) ActionChains(browser).move_to_element( time1).click(time1).perform() browser.find_element( By.XPATH, ".//div[@class='head']/ul/li[1]").click() browser.find_element( By.XPATH, "//div[@class='money_button']/a[@id='orderbtn']").click() print("预约成功") break except: print("已经挂上了,继续尝试") time.sleep(0.1) browser.refresh() continue else: time.sleep(0.1) print("未到放票时间") browser.refresh() # 如果元素成功点击则输出成功信息并且退出程序 # 如果已经约上则输出信息并且退出if __name__ == '__main__': login("xxx", "xxx")

运行结果

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。