测试结果:
整个买票流程可以再快一点,不过为了稳定起见,有些地方等待了一些时间
<强>完整程序,拿去可用强>
整个程序分了三个模块:购票模块(主体),验证码识别模块,余票查询模块
<>强购票模块:强>
从硒进口webdriver 从selenium.webdriver.common.by进口 从selenium.webdriver。支持导入expected_conditions EC 从selenium.common.exceptions进口NoSuchElementException, StaleElementReferenceException ElementNotVisibleException 导入的时间 进口的要求 urllib。解析进口urlencode 从pyquery进口pyquery pq 从check_ticket进口检查 从验证导入代码 进口json 类Buy_Ticket (): def __init__(自我、start_station end_station、日期、用户名、密码、目的): 自我。num=1 自我。开始=start_station 自我。结束=end_station 自我。日期=日期 自我。用户名=用户名 自我。密码=密码 自我。目的=目的 自我。login_url=' https://kyfw.12306.cn/otn/login/init ' 自我。ticket_url=' https://kyfw.12306.cn/otn/leftTicket/init ' def登录(自我): browser.get (self.login_url) 试一试: input_name=browser.find_element_by_id(用户名) input_pd=browser.find_element_by_id(密码) 按钮=browser.find_element_by_id (“loginSub”) time . sleep (1) input_name.send_keys (self.username) input_pd.send_keys (self.password) c=代码(浏览器)#调用验证码识别模块 c.main () button.click () time . sleep (2) #等待页面跳转,如果验证码识别错误,就执行下面时的语句 当浏览器。current_url==自我。login_url +“#”: c=代码(浏览器) c.main () button.click () time . sleep (2) # self.get_passenger () self.check () 除了NoSuchElementException: self.login () def检查(自我): #调用余票查询模块 检查=检查(自我。目前为止,自我。首先,自我。最终,self.purpose) start_end=check.look_up_station () 自我。num=check.get_info () #饼干的添加,json.dumps把以汉字形式呈现的起始、终点站转化成unicode编码,可在审查元素里查看饼干 浏览器。add_cookie({“名称”:“_jc_save_fromStation”,“价值”:json.dumps self.start .strip (“”)。替换(' \ \ ',' % ')+ ' % 2 c + start_end [0]}) 浏览器。add_cookie({“名称”:“_jc_save_toStation”,“价值”:json.dumps self.end .strip (“”)。替换(' \ \ ',' % ')+ ' % 2 c + start_end [1]}) 浏览器。add_cookie({“名称”:“_jc_save_fromDate”,“价值”:self.date}) browser.get (self.ticket_url) 如果自我。目的=='学生”: btn=browser.find_element_by_id (“sf2”) time . sleep (1) btn.click () 按钮=browser.find_element_by_id (“query_ticket”) time . sleep (1) button.click () def book_ticket(自我): 打印(“开始预订车票……) #先查找出所有车次对应的预订按钮,再根据余票查询模块返回的车次序号,点击相应的预订按钮 按钮=browser.find_elements_by_class_name (“btn72”) 按钮(self.num-1) .click () time . sleep (3) button2=browser.find_element_by_id (normalPassenger_0) #按实际情况,可自行修改,这里就选择的第一个常用联系人, #第二个是normalPassenger_1,依此类推 button2.click () button3=browser.find_element_by_id (“submitOrder_id”) time . sleep (1) button3.click () time . sleep(3) #等待页面加载完毕,不然后面可能会报错,等待时间自行决定 试一试: button4=browser.find_element_by_id (“qr_submit_id”) button4.click () 除了ElementNotVisibleException: button4=browser.find_element_by_id (“qr_submit_id”) button4.click () 打印('车票预定成功!请在30分钟内完成付款!”) def主要(自我): self.login () self.book_ticket () if __name__==癬_main__”: 开始=time.time () 浏览器=webdriver.Chrome () b=Buy_Ticket(“上海”、“重庆',' 2018-09-18 ','账号”、“密码”、“成人”)#账号:密码自行修改 b.main () 结束=time.time () 打印(“总耗时:% d秒' % int (end-begin)) # browser.close ()
验证码识别模块: