【使用python+selenium实现12306的自动登录及购票】

一、流程介绍
1. 访问登录页面
  在此页面输入用户名及密码后,点击立即登录。在这里插入图片描述
注意事项:
  一些网站在使用Selenium时会有前端检测,为了避免这种检测,需要对ChromeOptions进行设置,通过调用add_argument方法添加参数–disable-blink-features。
代码实现:

options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')  # 避免webdriver检测

driver = webdriver.Chrome(options=options)    # Chrome浏览器
driver.set_window_size(1080, 800);
driver.implicitly_wait(10);

# 打开网页
driver.get("https://kyfw.12306.cn/otn/resources/login.html")
user = driver.find_element_by_id("J-userName");
user.click();
user.send_keys("xxxxxxxx");
pswd = driver.find_element_by_id("J-password");
pswd.click();
pswd.send_keys("xxxxxxxx");
butten = driver.find_element_by_id("J-login");
butten.click();
time.sleep(1);

2.选择验证方式
在这里插入图片描述
注意事项:
  这里的拖拽需要通过 ActionChains来实现。ActionChains用来模拟鼠标操作,比如单击、双击、点击鼠标右键、拖拽等等。
代码实现:

while True:
    try:
        span = driver.find_element_by_id("nc_1_n1z")
        actions = ActionChains(driver)  # 行为链实例化
        time.sleep(1)  # 等待2秒钟
        # 经截图测量,滑块需要滑过的距离为300像素
        actions.click_and_hold(span).move_by_offset(300, 0).perform()  # 滑动
        actions.release();
        time.sleep(1);
        a = driver.find_element_by_id("nc_1_refresh1");# 查找刷新按钮,如果没有说明登录成功,执行except跳出循环
        a.click();# 如果刚刚滑动失败,则点击刷新,重新滑动
    except Exception as e:
        print(e);
        break;

3.关闭提示框,点击“车票预订”链接,跳转至车票预订页面**
在这里插入图片描述在这里插入图片描述
代码实现:

sure = driver.find_element_by_class_name("btn-primary");
sure.click();
link_for_ticket = driver.find_element_by_id("link_for_ticket");
link_for_ticket.click();

4.设置出发地、目的地、出发日、车次类型等信息
在这里插入图片描述
代码实现:

driver.find_element_by_id("fromStationText").click();
driver.find_element_by_css_selector(u"[title=长沙]").click();
driver.find_element_by_id("toStationText").click();
driver.find_element_by_css_selector(u"[title=北京]").click();
time.sleep(5);
train_date = driver.find_element_by_id("train_date");
train_date.clear();
tomorrow = (date.today() + timedelta(days= 1)).strftime("%Y-%m-%d")
train_date.send_keys(tomorrow);
driver.find_element_by_css_selector("#_ul_station_train_code > li:nth-child(1) > label").click()

5.点击“预订”,选择乘车人,完成购票
在这里插入图片描述
代码实现:

while True:
    try:
        driver.find_element_by_id("query_ticket").click();
        driver.find_element_by_xpath("/html/body/div[3]/div[7]/div[8]/table/tbody[1]/tr[1]/td[13]").click();
        time.sleep(3);
        driver.find_element_by_id("normalPassenger_0").click();
        driver.find_element_by_id("submitOrder_id").click();
        driver.find_element_by_link_text("确认").click();
    except:
        pass;

二、完整代码

import time
from datetime import date, timedelta
from selenium import webdriver
from selenium.webdriver import ActionChains

options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')  # 避免webdriver检测

driver = webdriver.Chrome(options=options)    # Chrome浏览器
driver.set_window_size(1080, 800);
driver.implicitly_wait(10);

# 打开网页
driver.get("https://kyfw.12306.cn/otn/resources/login.html")
user = driver.find_element_by_id("J-userName");
user.click();
user.send_keys("xxxxxxx");
pswd = driver.find_element_by_id("J-password");
pswd.click();
pswd.send_keys("xxxxxxx");
butten = driver.find_element_by_id("J-login");
butten.click();
time.sleep(1);

while True:
    try:
        span = driver.find_element_by_id("nc_1_n1z")
        actions = ActionChains(driver)  # 行为链实例化
        time.sleep(1)  # 等待2秒钟
        # 经截图测量,滑块需要滑过的距离为300像素
        actions.click_and_hold(span).move_by_offset(300, 0).perform()  # 滑动
        actions.release();
        time.sleep(1);
        a = driver.find_element_by_id("nc_1_refresh1");# 查找刷新按钮,如果没有说明登录成功,执行except跳出循环
        a.click();# 如果刚刚滑动失败,则点击刷新,重新滑动
    except Exception as e:
        print(e);
        break;

sure = driver.find_element_by_class_name("btn-primary");
sure.click();

link_for_ticket = driver.find_element_by_id("link_for_ticket");
link_for_ticket.click();
driver.find_element_by_id("fromStationText").click();
driver.find_element_by_css_selector(u"[title=长沙]").click();
driver.find_element_by_id("toStationText").click();
driver.find_element_by_css_selector(u"[title=北京]").click();
time.sleep(5);
train_date = driver.find_element_by_id("train_date");
train_date.clear();

tomorrow = (date.today() + timedelta(days= 1)).strftime("%Y-%m-%d")
train_date.send_keys(tomorrow);
driver.find_element_by_css_selector("#_ul_station_train_code > li:nth-child(1) > label").click()

while True:
    try:
        driver.find_element_by_id("query_ticket").click();
        driver.find_element_by_xpath("/html/body/div[3]/div[7]/div[8]/table/tbody[1]/tr[1]/td[13]").click();
        time.sleep(3);
        driver.find_element_by_id("normalPassenger_0").click();
        driver.find_element_by_id("submitOrder_id").click();
        driver.find_element_by_link_text("确认").click();
    except:
        pass;

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python可以通过网络爬虫和自动化操作库来实现12306自动抢票程序。具体的步骤如下: 首先,我们需要了解12306的网站结构和抢票的流程。可以通过查看12306网站的源代码或使用开发者工具来了解网站上的元素和接口。 接下来,我们将使用Python的网络爬虫库,如Requests或Scrapy,来获取12306网站上的车票信息。我们可以发送HTTP请求,获取车站、日期、车次、座位等必要的信息,并解析响应的数据。 然后,我们需要创建一个机制来自动登录12306网站。我们可以使用Selenium库来模拟用户登录过程,填写用户名和密码,并点击登录按钮。 一旦登录成功,我们可以开始搜索并预定车票。我们可以通过构造合适的URL,并发送相关的请求来查询可用的车票。然后,我们可以提取所需的信息,如车次、座位、价格等。 当找到合适的车票后,我们可以使用自动化操作库,如Selenium或Pyautogui,来模拟用户操作完成购票流程。这包括选择座位、填写乘客信息、提交订单等步骤。 最后,我们需要添加异常处理机制来应对可能的网络错误、登录失败或购票失败等情况。我们可以使用try-except语句来捕获异常,并根据需要采取相应的处理措施,如重新尝试抢票、发送通知等。 需要注意的是,使用自动化程序抢票可能违反12306使用规则。因此,在使用抢票程序之前,我们需要仔细阅读12306的规定,确保自己的行为合法合规。 总之,通过使用Python的网络爬虫和自动化操作库,我们可以实现12306自动抢票程序。这样可以帮助我们更高效地搜索和预定车票,省去手动操作的繁琐过程。但是,在使用此类程序时务必遵守相关规定,避免违反使用规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值