使用selenium首先需要下载一个和浏览器配对的驱动并把该驱动和写的py文件放在同一个文件夹下
然后导入模块 from selenium import webdriver 实例化一个浏览器对象,我这里是最新版的Edge浏览器
# usr/bin/env python
# -*- coding:utf-8 -*-
#导入库
from selenium import webdriver
from time import sleep
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from msedge.selenium_tools import EdgeOptions
#from msedge.selenium_tools import Edge
if __name__ == '__main__':
#输入查询时间
tf = 'xx' #可以input自动输入
tt = 'xx' #可以input自动输入
td = input('请输入日期,例如2021杠01杠01:')
useName = input('输入用户账号:')
password = input('输入用户密码:')
option = EdgeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
#实例化一个浏览器对象
bro = webdriver.Edge('./msedgedriver.exe')
因为是初次尝试所以写的比较粗糙,不过应该可以得到想要的
#一个判断方法
def qd_pd(sr):
qd_text = bro.find_element_by_class_name(sr).text
if qd_text == '确定' :
bro.find_element_by_class_name(sr).click()
#对登录页面发送请求
bro.get('https://kyfw.12306.cn/otn/resources/login.html')
#改变浏览器标识 伪装
script = 'Object.defineProperty(navigator, "webdriver", {get: () => false,});'
bro.execute_script(script)
#输入账号密码 点击登录
j = bro.find_element_by_id('J-userName')
j.send_keys(useName)
k = bro.find_element_by_id('J-password')
k.send_keys(password)
jk = bro.find_element_by_id('J-login')
jk.click()
sleep(4)
#使用动作链进行滑块验证
def Ation():
nc = bro.find_element_by_id('nc_1_n1z')
ation = ActionChains(bro)
ation.click_and_hold(nc)
ation.move_by_offset(300,0)
ation.perform()
ation.release()
sleep(2)
Ation()
#检验滑块验证是否通过
try:
while True :
if bro.find_element_by_class_name('nc-lang-cnt').text :
bro.find_element_by_id('nc_1_refresh1').click()
sleep(4)
Ation()
except:
#判定是否有提示
sleep(2)
qd_pd('btn-primary')
finally:
#进入车票预定界面
sleep(1.5)
bro.find_element_by_id('link_for_ticket').click()
sleep(3)
bro.find_element_by_id('qd_closeDefaultWarningWindowDialog_id').click()
#交互输入出发地
f = bro.find_element_by_id('fromStationText')
f.click()
f.send_keys(tf)
f.send_keys(Keys.ENTER)
sleep(0.5)
#交互输入目的地
t = bro.find_element_by_id('toStationText')
t.click()
t.send_keys(tt)
t.send_keys(Keys.ENTER)
sleep(0.5)
#交互输入日期
d = bro.find_element_by_id('train_date')
d.clear()
d.send_keys(td)
sleep(0.5)
#点击查询
bro.find_element_by_id('query_ticket').click()
#判断是否需要中转
sleep(3)
if bro.find_element_by_id('no_filter_ticket_2').text:
href =bro.find_elements_by_xpath('//*[@id="no_filter_ticket_2"]/p/a')[0].click()
bro.find_element_by_id('_a_search_btn').click()
#停三分钟关闭浏览器
sleep(180)
bro.quit()
大家在尝试的时候可以把input输入换成定值,省时间
后续会把它好好修一下,分享就先到这里