用爬虫抢票
原创大约 2 分钟
先准备好需要的组件包。
> pip install requests
> pip install prettytable
> pip install DrissionPage
Python代码如下。
'''
12306抢票
'''
import time
import requests
from prettytable import PrettyTable
import json
import datetime
from DrissionPage import ChromiumPage
from DrissionPage.common import Actions
from DrissionPage.common import Keys
'''
查询车票
'''
# 读取city.json文件
text = open('city.json', mode='r', encoding='utf-8').read()
city_json = json.loads(text)
# 都设置默认值
from_city = input("请输入始发站:")
if from_city == "":
from_city = "武昌"
to_city = input("请输入终点站:")
if to_city == "":
to_city = "北京"
train_date = input("请输入出发日期:")
if train_date == "":
train_date = datetime.date.today()
# 发送请求
url = f"https://kyfw.12306.cn/otn/leftTicket/queryO?leftTicketDTO.train_date={train_date}&leftTicketDTO.from_station={city_json[from_city]}&leftTicketDTO.to_station={city_json[to_city]}&purpose_codes=ADULT"
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Referer": "https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc",
"Cookie": "JSESSIONID=B3AB49B799FD4512BD6BA068EC7FFD23; tk=Yk6B0SizFSGXWWVzI1H5Q-hMTZRWQd8Jtg3drnbl4AojKS3_mkb1b0; BIGipServerotn=1524171018.24610.0000; BIGipServerpassport=820510986.50215.0000; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; route=9036359bb8a8a461c164a04f8f50b252; uKey=d5670e247400876e69c5b941c930fa8c664e6de70f83c283748e1a42d961a51c; _jc_save_fromStation=%u6B66%u6C49%2CWHN; _jc_save_toStation=%u5317%u4EAC%2CBJP; _jc_save_fromDate=2024-11-25; _jc_save_toDate=2024-11-25; _jc_save_wfdc_flag=dc"
}
resp = requests.get(url=url, headers=headers)
# 获取数据
data = resp.json()['data']
result = data['result']
city = data['map']
table = PrettyTable()
table.field_names = ["序号", "车次", "出发站", "到达站", "出发时间", "到达时间", "历时", "发车日期", "软卧", "无座", "硬卧", "硬座", "二等座", "一等座", "商务座"]
i = 0
for item in result:
# 00:DiAnFhyMemi2c5Rn7WKMiUuycZqoE3SsDp8VPgs0es6nRISVwfKmS19hhxfbxV5l65AM1oaWVx0B%0Ab%2BEPL77uX8cpgkofda81R%2FLcuXHOGSpZY9f3CiWG2ZRP9XGGd38lAEwM7yqmPJO9cVFYoWW4IUHC%0AxmfaI5fpbY8S6lmvH8G9P%2FSV32VDu7%2FyWN4EgSoKv78bXINuMck2%2FITeE9Rx9%2B%2FC%2BconxYVu4AnC%0Al9%2BPqGcp7IWlYO7Z6XAeXwy0wbXInS31kL7CZ%2BneJj%2F34jFDunoKwxDVEtfDiiRmr4SyEdh2COyl%0Afqu58qOrPMRFQOdgkK5%2BZINAowGwbgNg2aFZvQ%3D%3D|
# 01:预订| 预定
# 02:4e0000G5284O|
# 03:G528| 车次
# 04:WHN| 始发站(武汉)
# 05:BXP| 终点站(北京西)
# 06:WHN|
# 07:BXP|
# 08:19:08| 发车时间
# 09:23:13| 到站时间
# 10:04:05| 在途时间
# 11:Y|
# 12:Rkm20lFM3CH0JBNiF3psj3n%2F8F%2B2PS2k8%2FsEYeB7drFknFUS|
# 13:20241125| 发车日期
# 14:3|
# 15:N2|
# 16:01|
# 17:05|
# 18:1|
# 19:0|
# 20:|
# 21:|
# 22:|
# 23:| 软卧
# 24:|
# 25:|
# 26:| 无座
# 27:|
# 28:| 硬卧
# 29:| 硬座
# 30:有| 二等座
# 31:无| 一等座
# 32:无| 商务座
# 33:|
# 34:90M0O0|
# 35:9MO|
# 36:0|
# 37:1|
# 38:|
# 39:9164300000M074800000O046700021|
# 40:0|
# 41:|
# 42:|
# 43:|
# 44:|
# 45:1|
# 46:0#1#0#0#z#0#z#z|
# 47:|
# 48:7|
# 49:CHN,CHN|
# 50:|
# 51:|
# 52:N#N#|
# 53:|
# 54:90076M0075O0075|
# 55:202411111330|
train_info = item.split('|')
yu_ding = train_info[1]
che_ci = train_info[3]
start_station = train_info[4]
end_station = train_info[5]
start_time = train_info[8]
end_time = train_info[9]
duration_time = train_info[10]
start_date = train_info[13]
ruan_wo = train_info[23]
wu_zuo = train_info[26]
ying_wo = train_info[28]
ying_zuo = train_info[29]
er_deng = train_info[30]
yi_deng = train_info[31]
shang_wu = train_info[32]
table.add_row([i, che_ci, start_station, end_station, start_time, end_time, duration_time, start_date, ruan_wo, wu_zuo, ying_wo, ying_zuo, er_deng, yi_deng, shang_wu])
i += 1
print(table)
'''
购买车票
'''
sequence = input("请输入要购买的车票序号:")
chrome = ChromiumPage()
chrome.get("https://kyfw.12306.cn/otn/leftTicket/init")
action = Actions(chrome)
# 模拟选票
chrome.get("https://kyfw.12306.cn/otn/leftTicket/init")
action.move_to('#fromStationText').click().type("武汉")
chrome.ele('#fromStationText').input(Keys.ENTER)
action.move_to('#toStationText').click().type("北京")
chrome.ele('#toStationText').input(Keys.ENTER)
chrome.ele("#train_date").click()
# 点击预订
chrome.ele("#queryLeftTable tr:nth-child(1) .btn72").click()
# 判断是否已登录
text = chrome.ele("#login_user").text
if text == "登录":
# 如果未登录则弹出登录框则点击登录
chrome.ele("#J-userName").input("用户名")
chrome.ele("#J-password").input("密码")
chrome.ele("#J-login").click()
time.sleep(1)
chrome.ele("#id_card").input("身份证号后四位")
# 获取验证码
chrome.ele("#verification_code").click()
# 输入验证码
code = input("请输入验证码:")
chrome.ele("#code").input(code)
chrome.ele("#sureClick").click()
time.sleep(1)
# 选择乘车人
chrome.ele("#normalPassenger_0").click()
# 提交订单
chrome.ele("#submitOrder_id").click()
time.sleep(0.5)
chrome.ele("#qr_submit_id").click()
感谢支持
更多内容,请移步《超级个体》。