python12306抢票

什么是selenium?

支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)驱动真实浏览器完成测试, selenium也是支持无界面浏览器操作的。

为什么使用selenium?

模拟浏览器功能,自动执行网页中的js代码,实现动态加载

如何安装selenium

不同浏览器版本对应不同浏览器内核

项目流程

一、启动webdriver:

from selenium import webdriver
path = r"你的浏览器驱动的路径"
browser = webdriver.Chrome(path)

二、访问网址:

url = "https://kyfw.12306.cn/otn/leftTicket/init?"
browser.get(url)

三、元素定位

当我们访问到网页之后,我们首先就要定位到我们要交互的一些元素,比如:

那么我们想要模拟输入这些内容就必须要先定位到这些元素,定位元素我们可以用到selenium中的常用定位方法:

  • find_element_by_id 通过标签的id属性进行定位

  • find_elements_by_name 通过标签的name属性进行定位

  • find_elements_by_xpath 通过xpath语句进行定位

  • find_elements_by_tag_name 通过标签名进行定位

  • find_elements_by_class_name 通过标签的class属性进行定位

  • find_elements_by_css_selector 通过CSS选择器进行定位

1、定位出发地:我们可以在网页中按F12打开控制台:

按照上图步骤,我们可以看到出发地的输入框对应的input标签,标签内有一个id属性,那么我们就可以利用selenium中元素定位的方法:find_element_by_id 来定位这个输入框了:

start_city = browser.find_element_by_id("fromStationText")

元素定位好以后,下一步就是要向输入框内发送内容,这就用到了元素交互,最常用的元素交互方式有:

  • click() 模拟点击

  • send_keys() 输入

  • clear() 内容清空

那么我们现在定位到这个元素之后,首先需要点击一下这个输入框才能输入内容,所以代码如下:

start_city.click()
start_city.clear()
start_city.send_keys("北京 ")

2、定位目的地:按照同样的方式,我们把出发地也输入内容:

end_city = browser.find_element_by_id("toStationText")
end_city.click()
end_city.clear()
end_city.send_keys("上海 ")

3、定位出发时间:同样的方式我们先定位到出发时间的筛选框:

choice_time = Select(browser.find_element_by_id("cc_start_time"))

我们这个时候看到,这里的内容和咱们刚才不太一样了,这里变成了一个下拉框的形式,对于这种形式的内容,我们要使用slenium中的另外一个方法:Select

from selenium.webdriver.support.select import Select
choice_time = Select(browser.find_element_by_id("cc_start_time"))
# choice_time.select_by_index() 通过索引来取值
choice_time.select_by_visible_text("12:00--18:00")

这样的话我们也就确定了发车时间

4、选择出发日期:最后一步我们需要选择一下发车日期:

我们发现每一个发车日期选项卡都对应一个 li 标签,所以我们这次用xpath匹配方式来定位一下:

data = browser.find_element_by_css_selector("#date_range li:nth-child(4)")
data.click()

OK!执行到这里,我们所有的车次就都能查询出来了,下一步要做的就是把我们看好的车次添加到我们的订单中,步骤和上边一样,所以这里就不上图了,直接贴上代码和注释:

favorite = ["G3","G137","G21"]
​
xpath = '//tbody[@id="queryLeftTable"]//td[4][@class]/../td[1]//a'
train_list = browser.find_elements_by_xpath(xpath)
​
for train in train_list:
    train_num = train.text
    if train_num in favorite:
        print("亲  有票了哦!!!")
        target = train.find_elements_by_xpath('../../../../../td[13]/a')[0]
        # print(target)
        target.click()
        input("请手动登陆  登陆成功之后请按回车键")
​
        time.sleep(3)
        browser.find_element_by_id("normalPassenger_0").click()
        browser.find_element_by_id("submitOrder_id").click()
​
        time.sleep(10)
        browser.find_element_by_id("qr_submit_id").click()
​
        print("亲  恭喜您抢票成功!!!")
        # 第一个参数代表声音大小  第二个参数代表时长  1000 = 1秒
        Beep(3000,3000)
        break
    else:
        print("亲  暂时还没有票  请耐心等待...")
browser.quit()
到这一步我们的这个项目就完成了,下边贴上整合好的代码供大家学习:

from selenium import webdriver
import time
# 专门处理下拉框元素
from selenium.webdriver.support.select import Select
from winsound import Beep
​
​
path = r"E:chrome_driverchromedriver.exe"
url = "https://kyfw.12306.cn/otn/leftTicket/init?"# 返回一个对象  browser就是我门的一个浏览器
browser = webdriver.Chrome(path)
​
time.sleep(5)
browser.get(url)
​
# 元素定位
# 出发地id fromStationText
start_city = browser.find_element_by_id("fromStationText")
# 元素交互
    # click() 模拟鼠标单击事件
    # clear() 清空内容
    # send_keys(要输入的内容)
start_city.click()
start_city.clear()
start_city.send_keys("北京
")
​
# 目的地id:toStationText
end_city = browser.find_element_by_id("toStationText")
end_city.click()
end_city.clear()
end_city.send_keys("上海
")
​
choice_time = Select(browser.find_element_by_id("cc_start_time"))
# choice_time.select_by_index() 通过索引来取值
choice_time.select_by_visible_text("12:00--18:00")
​
# #date_range li:nth-child(4)
data = browser.find_element_by_css_selector("#date_range li:nth-child(4)")
data.click()
# 防止有网络延迟
time.sleep(3)
​
favorite = ["G3","G137","G21"]
​
xpath = '//tbody[@id="queryLeftTable"]//td[4][@class]/../td[1]//a'
train_list = browser.find_elements_by_xpath(xpath)
​
for train in train_list:
    train_num = train.text
    if train_num in favorite:
        print("亲  有票了哦!!!")
        target = train.find_elements_by_xpath('../../../../../td[13]/a')[0]
        # print(target)
        target.click()
        input("请手动登陆  登陆成功之后请按回车键")
​
        time.sleep(3)
        browser.find_element_by_id("normalPassenger_0").click()
        browser.find_element_by_id("submitOrder_id").click()
​
        time.sleep(10)
        browser.find_element_by_id("qr_submit_id").click()
​
        print("亲  恭喜您抢票成功!!!")
        # 第一个参数代表声音大小  第二个参数代表时长  1000 = 1秒
        Beep(3000,3000)
        break
    else:
        print("亲  暂时还没有票  请耐心等待...")
browser.quit()

 

 

原文地址:https://www.cnblogs.com/cui00/p/12692392.html