Python+selenium实现医院自动挂号

Python+selenium实现医院自动挂号

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

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

所用到的技术:

  • python 3.7
  • selenium库
  • 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:\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)

正常挂号操作如下

首先跳转到医生界面

image-20220214122105594

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

image-20220214122217590

image-20220214122348599

所以第一步要点击这个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()

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

image-20220214122502716

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

image-20220214122612896

    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,借助这一点可以实现功能

image-20220214163133098

    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-8

import time
from selenium import webdriver
from time import sleep

from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains


def login(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"
    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")

运行结果

image-20220214205614828

  • 13
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codeqb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值