python12306抢票
什么是selenium?
支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)驱动真实浏览器完成测试, selenium也是支持无界面浏览器操作的。
为什么使用selenium?
模拟浏览器功能,自动执行网页中的js代码,实现动态加载
如何安装selenium
不同浏览器版本对应不同浏览器内核
-
操作谷歌浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
-
谷歌驱动和谷歌浏览器版本之间的映射表:http://blog.csdn.net/huilan_same/article/details/51896672
-
查看谷歌浏览器版本:谷歌浏览器右上角-->帮助-->关于
-
pip install 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("北京\n")
2、定位目的地:按照同样的方式,我们把出发地也输入内容:
end_city = browser.find_element_by_id("toStationText")
end_city.click()
end_city.clear()
end_city.send_keys("上海\n")
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_driver\chromedriver.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("北京\n") # 目的地id:toStationText end_city = browser.find_element_by_id("toStationText") end_city.click() end_city.clear() end_city.send_keys("上海\n") 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()