一、前言
事情是这样的,由于每天早上去图书馆都要提前在互动吧
网站上蹲点抢票,挺麻烦的,然后我老爸说,你怎么不自己写一个抢票软件,一句点醒了我,于是这款抢票程序来了。
二、思路设计
对于抢票这样的程序,难点并不是在写代码上,主要难点在于对网站源码的分析以及奇奇怪怪的情况的处理,这里选用Python
作为脚本语言。我们利用selenium+chromeDriver
模拟浏览器的登录。因为我们是用电脑模拟人点击,所以我们要知道订票所需要的所有步骤,这样才能自动化处理。
在购买一张票的所有流程主要就是登录然后购买,我们要先登录然后浏览器才会记住登录信息的cookies
,才能正常购买。
三、登录页面分析
这里我登录使用的网站利用浏览器模拟到移动端页面,因为移动端的页面比较简单,通过检查源码,我们很快就找到了两个输入框以及登录按钮对应的位置如图所示标签位置
这里很简单,获取到输入框的元素之后,send_keys()
来输入账号密码,之后对登录元素进行click()
就可以实现登录
def login(browser): browser.get('https://login.hudongba.com/login/?redirectUrl=https%3A%2F%2Fwww.haudongba.com%2Fcoupon_center') input_account = browser.find_element_by_class_name('zc_sjK') input_pswd = browser.find_element_by_class_name('zc_sjK.mmkTxt') btn_log = browser.find_element_by_css_selector('.blueBtn a') input_account.send_keys('your account') input_pswd.send_keys('your password') btn_log.click() 12345678
四、购买页面分析
首先我们打开需要抢票的页面,打开F12
检查网页源代码,找到报名按钮的标签元素,然后模拟点击,点击之后会出现二维码,二维码下面继续报名的链接点进去就可可以进入下一步了,这里用class
来确定按钮位置,可以写成 browser.find_element_by_class_name('myApply')
,然后就是链接的位置,同样用class来确定位置browser.find_element_by_class_name('font-3')
然后进入下一步就是填写个人信息的界面了,这里如图所示,我们发现如图右下角的css
代码对应的是这三个input
输入框,那我们可以利用css选择器来获取这三个input元素,可以写成browser.find_elements_by_css_selector('.pop_massage .dan_h .inpoutK input')
,这样获得的是一个数组,接下来对每个数组send_keys()
进行传值。
接下来我们需要点击立即报名按钮,这里我们在源码中找到立即报名的按钮标签对应的css代码块,同样的我们可以利用css选择器来定位对应的元素,这里就可以写成browser.find_element_by_css_selector('.moreApplyWrap .submit a')
然后对元素进行click()
处理就可以报名成功了!
上面对网页简单的分析之后,我们看看完整代码,注意这里利用的sleep主要是为了保证所有元素被完全加载后再进行调用,btn_color = browser.find_element_by_class_name('myApply').value_of_css_property('background-color')
这里是获取了我要报名
的按钮的颜色 ,因为如果是灰色的话说明当前不允许购票,下面进入循环,不断地刷新页面获取按钮颜色,直到为指定的蓝色,循环跳出。
def buy_ticket(browser): browser.get('https://www.hudongba.com/party/ppfb5.html?hdb_pos=manager_info') # click continue buy time.sleep(1) btn_color = browser.find_element_by_class_name('myApply').value_of_css_property('background-color') print(btn_color) # if the color is not blue ,it won`t be allowed you to order # then you can refresh the website while 1: if btn_color == 'rgba(0, 153, 233, 1)': break else: browser.refresh() time.sleep(1) btn_color = browser.find_element_by_class_name('myApply').value_of_css_property('background-color') browser.find_element_by_class_name('myApply').click() btn_next = browser.find_element_by_class_name('font-3') btn_next.click() # input information time.sleep(1) input_elements = browser.find_elements_by_css_selector('.pop_massage .dan_h .inpoutK input') print(input_elements) input_elements[0].clear() input_elements[1].clear() input_elements[2].clear() input_elements[0].send_keys("小成Charles") input_elements[1].send_keys("123456785555") input_elements[2].send_keys("45645646464456211") # click blueBtn blue_btn = browser.find_element_by_css_selector('.moreApplyWrap .submit a') print(blue_btn) blue_btn.click() # jude success or failed time.sleep(1) FLAG = browser.find_element_by_class_name('centerMsg') if len(FLAG) != 0: print("success") else: print("failed") 123456789101112131415161718192021222324252627282930313233343536373839404142
五、主函数代码分析
这里首先是初始化chrome浏览器,设置浏览器头标签为移动端user-agent
,移动端代码实现登录模块,调用过login函数之后,再把浏览器标识符换回成PC端,用来实现购票页面的模块(实践操作发现购票模块的移动端有些bug),这里browser.execute_cdp_cmd()
实现将浏览器标识进行转换,然后再运行buy_ticket(browser)
函数块就又是PC端了!
if __name__ == '__main__': # send_emails() USER_AGENT = 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.' \ '4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4' chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--User-Agent=" + USER_AGENT) #chrome_options.add_argument('--headless')#这里实现将启动页面影藏 browser = webdriver.Chrome(options=chrome_options) login(browser) # switch the chrome to PC option then open the URL browser.execute_cdp_cmd("Emulation.setUserAgentOverride", { "userAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0" }) buy_ticket(browser) 123456789101112131415161718
六、总结
这个程序本身是有很多bug的,原理上你需要对每个获取元素代码块进行异常捕获处理,以及异常后应该做出怎样的判断。完善代码后如果可以的话可以把程序放到服务器上24小时不断运行,这样才能真正实现自动抢票!
作者:小成Charles
原创作品
转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/113999110
近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地