我们的预约脚本之前已经在网页上自动填写了名字,现在我们来处理剩下的其他固定信息的自动输入。前面提到姓名信息的自动录入,其实也可以自动录入身份证号、手机号、2020年生肖币(第一批)三项信息。输入法其实是一样的,这里是代码:ele_identNo=driver.find_element_by_xpath('//*[@id="identNo"]')ele_identNo.send_keys(paras['identNo'])ele_mobile=driver.find_element_by_xpath('//*[@id="mobile"]')ele_mobile.send_keys(paras['mobile'])ele_cardvalue0=driver.find_element_by_xpath('//*[@id="cardvalue0"]')ele_cardvalue0.send_keys(paras['cardvalue0'])自动输入验证码上面提到网页验证码的来源是链接而不是固定图片:基于这种情况,我们无法通过链接直接读取当前验证码.下一个最好的办法是截取当前验证码的屏幕截图。但是这样有一个缺点,就是每次运行的时候都需要存储一个临时的验证码图片。考虑到使用脚本的环境不会缓存太多验证码,每次缓存时保持临时图片的文件名不变,图片永远只有一张,所以这种策略是可以接受的。如何截取当前验证码?Selenium已经帮我们想到了这个:#首先找到验证码对应的网页元素ele_piccaptcha=driver.find_element_by_xpath('//*[@id="piccaptcha"]')#然后直接调用这个的截图方法元素,参数为保存路径可以实现截图ele_piccaptcha.screenshot('./temp_capchar.jpg')我们将验证码图片保存为当前目录下的temp_capchar.jpg文件。但有时由于元素选择不准确或其他原因导致图片过大,需要在识别验证码前“瘦身”(如前面代码所体现):#先读取图片image=cv2.imread(capchar,0)#将图片上下左右裁剪一个像素image=image[1:-1,1:-1]以上代码默认封装在recognize_capchar方法中。要想识别验证码,我们只需要将验证码图片的路径和我们训练好的模型传给这个方法就可以了。需要注意的是,由于神经网络的初始化耗时比其他代码长很多,所以最好在程序开始时初始化一个模型对象,后面用这个对象自动识别验证码。做。整个过程只需要对模型进行一次初始化,可以大大提高效率。毕竟现在是抢钱的时候。#使用预先初始化的model和label对象自动识别temp_capchar.jpgcapchar=recognize_capchar('./temp_capchar.jpg',model,lb)#将识别结果输入对应的boxele_capchar=driver.find_element_by_xpath('//*[@id="piccode"]')ele_capchar.send_keys(capchar)自动选中下拉框前面的静态网页元素,这样需要选中的元素如何处理?其实还是一步一步来的。首先获取下拉框对象:ele_orglevel=driver.find_element_by_xpath('//*[@id="orglevel1"]')然后可以预先配置下拉框对象的text属性位置信息获取到下拉列表的下标:fororg_index,orginenumerate(ele_orglevel.text.split('\n')):iflocainorg:ele_org=driver.find_element_by_xpath(xpath+'/option[{}]'.format(str(org_index+1)))ele_org.click()break这样一步步做完就可以选择预配置的选项了。我把这些重复的动作做成一个for循环,然后把下拉框的选择做成一个独立的方法,这样代码看起来简单了很多:defchoose_bank(driver,location,top_xpath):locations=location.split(',')forindex,locainenumerate(locations):level=str(index+1)xpath=top_xpath.replace('1',level)ele_orglevel=driver.find_element_by_xpath(xpath)fororg_index,orginenumerate(ele_orglevel.text.split('\n')):iflocainorg:ele_org=driver.find_element_by_xpath(xpath+'/option[{}]'.format(str(org_index+1)))ele_org.click()breakxpath=top_xpath.replace('1',str(len(locations)+1))尝试:ele_bottom=driver.find_element_by_xpath(xpath)except:returnelse:org_index=random.choice(list(range(len(ele_bottom.text.split('\n'))))[1:])ele_org=driver.find_element_by_xpath(xpath+'/option[{}]'.format(str(org_index+1)))ele_org.click()然后像这样称呼它:choose_bank(driver,paras['location'],'//*[@id="orglevel1"]')手机验证码的处理由于手机验证码不是程序可以直接获取到的,所以这个脚本也很无奈,就是为什么这个脚本只能称为半自动脚本,这里还是可以简单说一下业务流程。获取手机验证码首先要点击“获取验证码”按钮:btn_sms=driver.find_element_by_xpath('//*[@id="sendValidate"]')btn_sms.click()然后,我们需要输入手机验证码,程序会自动输入到网页中:phoneCaptchaNo=input('请输入手机验证码,按回车键确认(如未收到短信,请稍等待短信输入后):\n')ele_phoneCaptchaNo=driver.find_element_by_xpath('//*[@id="phoneCaptchaNo"]')ele_phoneCaptchaNo.send_keys(phoneCaptchaNo)提交预约表至此,整个表格都填好了,现在是时候提交了:ele_infosubmit=driver.find_element_by_xpath('//*[@id="infosubmit"]')ele_infosubmit.click(),写在这里,整个预订过程结束。我们的“蟒盘纪念币系列”也基本结束了。本系列的所有源码都会放在下面的github仓库中,有需要的可以参考,有问题请指正,谢谢!https://github.com/TitusWongCN/AutoTokenAppointment会有一篇总结“蟒盘纪念币系列”的文章,同时开始下一个系列,敬请期待!第一期:蟒盘纪念币系列一:简介第二期:蟒盘纪念币系列二:鉴定验证码01第三期:蟒盘纪念币系列二:鉴定验证码02第四期:蟒盘纪念币系列二:鉴定验证码03第五期:蟒盘纪念币系列二:身份验证码04第六期:蟒盘纪念币系列三:自动预约脚本编写01
