Python+selenium实现医院自动挂号
有些医院某些专家大牛的号总是“一号难求”,基本是放票秒空,针对这种情况,掌握一定技术的小伙伴可以使用自动化手法进行挂号
首先声明该脚本仅仅用于娱乐和相关技术学习,不用于商业用途
所用到的技术:
- python 3.7
- selenium库
- xpath
抢号之前首先需要登录
准备好登录用的身份信息和网页的url,这里由于网页的登录有验证码,选择自动开启浏览器的方式以便于观察验证码手动输入,并且设置了
browser.implicitly_wait(10)
来等待元素加载完成
deflogin(username, password):
url ="http://wxyy.nxtcm.com/cmph-web/login"
browser = webdriver.Chrome(executable_path=(r'D:\Software\Google\Chrome\Application\chromedriver.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
,借助这一点可以实现功能
whileTrue:# 如果元素不能点击则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("预约成功")breakelse:
time.sleep(0.1)print("未到放票时间")
browser.refresh()
完整代码如下
# coding = utf-8import time
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
deflogin(username, password):
url ="http://wxyy.nxtcm.com/cmph-web/login"
browser = webdriver.Chrome(executable_path=(r'D:\Software\Google\Chrome\Application\chromedriver.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"whileTrue:# 如果元素不能点击则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("预约成功")breakexcept:print("已经挂上了,继续尝试")
time.sleep(0.1)
browser.refresh()continueelse:
time.sleep(0.1)print("未到放票时间")
browser.refresh()# 如果元素成功点击则输出成功信息并且退出程序# 如果已经约上则输出信息并且退出if __name__ =='__main__':
login("xxx","xxx")
运行结果
版权归原作者 爱吃面的程序员 所有, 如有侵权,请联系我们删除。