下面是详细讲解python自动12306抢票软件实现代码的攻略。
1. 网络爬虫
首先,我们需要用网络爬虫获取12306网站的车次余票信息。这里我们推荐使用Python的requests库和BeautifulSoup库获取网页内容和解析HTML。代码示例如下:
import requests
from bs4 import BeautifulSoup
# 获取余票信息
def get_remaining_tickets(train_date, from_station, to_station):
url = 'https://kyfw.12306.cn/otn/leftTicket/query'
params = {
'leftTicketDTO.train_date': train_date, # 乘车日期
'leftTicketDTO.from_station': from_station, # 出发站代码
'leftTicketDTO.to_station': to_station, # 到达站代码
'purpose_codes': 'ADULT' # 车票类型
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, params=params, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
tickets = soup.select('.ticket-info > .btn72')
remaining_tickets = []
for ticket in tickets:
remaining_ticket = str(ticket).strip().replace('<br/>', ' ')
remaining_tickets.append(remaining_ticket)
return remaining_tickets
该函数从12306网站获取指定日期、出发站、到达站的余票信息。其中,train_date为乘车日期(格式为yyyy-mm-dd),from_station和to_station分别为出发站和到达站的代码。
2. 登录与验证
要完成自动抢票,必须先登录12306网站,获取验证信息。登录和验证过程十分重要,必须注意验证码有效期较短,程序必须在验证期间内进行登录。我们推荐使用Selenium库模拟登录和模拟点击验证码。代码示例如下:
import time
from selenium import webdriver
def login(username, password):
driver = webdriver.Chrome()
driver.get('https://kyfw.12306.cn/otn/login/init')
# 在网页加载完成后等待输入用户名和密码
time.sleep(5)
driver.find_element_by_id('username').send_keys(username)
driver.find_element_by_id('password').send_keys(password)
input('完成登录后按Enter键继续')
return driver
该函数打开Chrome浏览器,进入12306网站登录界面,并填写用户名和密码。填写完成后,程序暂停等待手动输入验证码。登录成功后,函数返回一个浏览器对象,使用该对象实现后续操作。
3. 提交订单
登录成功后,我们需要提交订单以获得车票。同样,该过程较为复杂,需要填写许多订单信息,并应对可能出现的错误。我们推荐使用Selenium库填写订单表单,并捕获错误进行处理。代码示例如下:
import datetime
import time
def submit_order(driver, train_date, from_station, to_station, seat_type):
# 打开购票页面
driver.get('https://kyfw.12306.cn/otn/leftTicket/init')
# 选择出发站和到达站
driver.find_element_by_id('fromStationText').click()
driver.find_element_by_id('fromStationText').clear()
driver.find_element_by_id('fromStationText').send_keys(from_station)
time.sleep(1)
driver.find_element_by_xpath('/html/body/div[6]/div[2]/div[1]/div[2]/ul/li[1]').click()
driver.find_element_by_id('toStationText').click()
driver.find_element_by_id('toStationText').clear()
driver.find_element_by_id('toStationText').send_keys(to_station)
time.sleep(1)
driver.find_element_by_xpath('/html/body/div[7]/div[2]/div[1]/div[2]/ul/li[1]').click()
# 选择乘车日期
js = 'document.getElementById("train_date").removeAttribute("readonly")'
driver.execute_script(js)
driver.find_element_by_id('train_date').clear()
driver.find_element_by_id('train_date').send_keys(train_date)
driver.find_element_by_id('train_date').click()
# 点击查询按钮查询余票信息
driver.find_element_by_id('query_ticket').click()
time.sleep(3)
# 选择座位类型
seat_type_element = driver.find_element_by_xpath('//*[@id="tbody_list"]/tr[1]/td[4]')
seat_type_str = seat_type_element.get_attribute('title')
if seat_type not in seat_type_str:
return False
# 点击预定按钮
driver.find_element_by_css_selector('tr[id^="ticket_"] .btn72').click()
time.sleep(3)
# 选择乘客和座位类型
driver.find_element_by_id('seatType_' + seat_type).click()
driver.find_element_by_id('submitOrder_id').click()
# 确认订单信息
driver.find_element_by_id('qr_submit_id').click()
time.sleep(3)
# 检查是否成功提交订单
if 'submitOrderAction.do?method=initForMy12306' not in driver.current_url:
return False
return True
该函数通过填写表单的方式提交订单并获得车票。其中,train_date、from_station、to_station、seat_type分别表示乘车日期、出发站、到达站和座位类型。使用该函数后,程序会提交一个订单,如果提交成功则返回True,否则返回False。
总结
使用网络爬虫、Selenium库和BeautifulSoup库,我们可以轻松地实现python自动12306抢票软件。但需要注意,由于12306网站反扒措施比较严格,过于频繁的操作有可能使得账号被封禁。因此,在使用该程序前,请务必先仔细了解相关反爬策略,并注意进行适当的控制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python自动12306抢票软件实现代码 - Python技术站