利用Python selenium在网站自-动-买-票实战分析

作者:小成Charles
商业工作,学习交流请添加Vx:Lcc-Triumph
原创作品
转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/113999110

一、前言

事情是这样的,由于每天早上去图书馆都要提前在互动吧网站上蹲点抢票,挺麻烦的,然后我老爸说,你怎么不自己写一个抢票软件,一句点醒了我,于是这款抢票程序来了。
在这里插入图片描述

二、思路设计

对于抢票这样的程序,难点并不是在写代码上,主要难点在于对网站源码的分析以及奇奇怪怪的情况的处理,这里选用Python作为脚本语言。我们利用selenium+chromeDriver模拟浏览器的登录。因为我们是用电脑模拟人点击,所以我们要知道订票所需要的所有步骤,这样才能自动化处理。
在购买一张票的所有流程主要就是登录然后购买,我们要先登录然后浏览器才会记住登录信息的cookies,才能正常购买。

三、登录页面分析

这里我登录使用的网站利用浏览器模拟到移动端页面,因为移动端的页面比较简单,通过检查源码,我们很快就找到了两个输入框以及登录按钮对应的位置如图所示标签位置,这里通过class选择器分别定位输入账号和输入密码的input分别是zc_sjKzc_sjK.mmkTxt,可以写成 browser.find_element_by_class_name('zc_sjK')browser.find_element_by_class_name('zc_sjK.mmkTxt')然后登陆按钮一样是find_element_by_css_selector('.blueBtn a')
在这里插入图片描述
这里很简单,获取到输入框的元素之后,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()

四、购买页面分析

首先我们打开需要抢票的页面,打开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")

五、主函数代码分析

这里首先是初始化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)

六、总结

这个程序本身是有很多bug的,原理上你需要对每个获取元素代码块进行异常捕获处理,以及异常后应该做出怎样的判断。完善代码后如果可以的话可以把程序放到服务器上24小时不断运行,这样才能真正实现自动抢票!


作者:小成Charles
原创作品
转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/113999110

商业工作,学习交流请添加Vx:Lcc-Triumph
在这里插入图片描述

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值