嗨喽~大家好呀,这里是魔王呐 ❤ ~!
python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取
Python 3.8
Pycharm
requests
prettytable
selenium --> pip install selenium==3.141.0 版本
谷歌浏览器 <不一定是谷歌, 但是驱动文件和浏览器对应>
谷歌驱动
素材: 点击此处转文末获取
city.json 城市文件
驱动安装教程
查票 --> 相当于把车次信息获取下来
购票
抓包分析 --> 车次信息在那个数据包里面
打开开发者工具: F12
点击查询:
https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2023-09-22&leftTicketDTO.from_station=CSQ&leftTicketDTO.to_station=SHH&purpose_codes=ADULT
通过爬虫代码步骤实现车次信息数据获取:
发送请求 -> 模拟浏览器对于url地址发送请求
获取数据 -> 获取服务器返回响应数据
解析数据 -> 提取车次信息内容
模拟人的行为操作浏览器 selenium -> 浏览器驱动 -> 浏览器
买票流程:
打开浏览器, 访问网站
输入出发地 / 目的地 / 时间 查询
点击预定按钮
输入帐号密码登陆
选择乘车人, 选择座位 <可选可不选>
提交订单 / 确定购买
导入模块
# 导入数据请求模块
import requests
# 导入制表
import prettytable as pt
# 导入序列化
import json
# 导入自动化测试模块
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# 导入时间模块
import time
# 导入账号密码
from password import account, Password
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def Train(num, date, from_city, to_city):
# 打开浏览器
driver = webdriver.Chrome()
# 访问网站
driver.get('https://kyfw.12306.cn/otn/leftTicket/init')
# 设置等待
driver.implicitly_wait(10)
“”"
元素定位, 找到对应标签位置, 进行相关的操作…
driver.find_element_by_id() 通过标签ID
driver.find_element_by_class_name() 通过标签class类名
driver.find_element_by_css_selector() 通过css语法
driver.find_element_by_xpath() 通过xpath
“”"
输入出发城市
driver.find_element_by_id('fromStationText').click()
driver.find_element_by_id('fromStationText').clear()
driver.find_element_by_id('fromStationText').send_keys(from_city)
driver.find_element_by_id('fromStationText').send_keys(Keys.ENTER)
输入目的城市
driver.find_element_by_id('toStationText').click()
driver.find_element_by_id('toStationText').clear()
driver.find_element_by_id('toStationText').send_keys(to_city)
driver.find_element_by_id('toStationText').send_keys(Keys.ENTER)
输入出发时间
driver.find_element_by_id('train_date').click()
driver.find_element_by_id('train_date').clear()
driver.find_element_by_id('train_date').send_keys(date)
driver.find_element_by_id('train_date').send_keys(Keys.ENTER)
点击查询
driver.find_element_by_id('query_ticket').click()
点击预定车票 第一个车次进行预定 1 3 5 7 9 11 2*num -1
driver.find_element_by_css_selector(f'#queryLeftTable tr:nth-child({2*int(num) -1}) .btn72').click()
输入账号
driver.find_element_by_id('J-userName').send_keys(account)
输入密码
driver.find_element_by_id('J-password').send_keys(Password)
点击登陆
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
driver.find_element_by_id('J-login').click()
time.sleep(2)
driver.find_element_by_id('id_card').send_keys('203X')
driver.find_element_by_id('verification_code').click()
yzm = input('请输入你验证码: ')
driver.find_element_by_id('code').send_keys(yzm)
driver.find_element_by_id('sureClick').click()
driver.implicitly_wait(10)
driver.find_element_by_id('normalPassenger_1').click()
driver.find_element_by_id('submitOrder_id').click()
time.sleep(3)
driver.find_element_by_id('qr_submit_id').click()
读取文件
with open('city.json', encoding='utf-8') as f:
# 读取内容返回字符串
text = f.read()
# 转成字典数据
city_info = json.loads(text)
print(city_info)
from_city = input('请输入你要出发的城市: ')
to_city = input('请输入你要到达的城市: ')
date = '2023-09-22'
print(city_info[from_city])
print(city_info[to_city])
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 模拟浏览器 -> 可以直接复制 <字典数据>
headers = {
'Cookie': '_uab_collina=169468986750041591890733; JSESSIONID=3CADFAFE87DA989911A04860B83F105B; BIGipServerpassport=820510986.50215.0000; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; BIGipServerotn=4124508426.24610.0000; fo=61khfkvbseezqnv52-DolTOwMsIkA0NSXo-s7vt_2-z4cOjkQ5CEwiuz9Wa1M87JPD31uI75bKEUzzfvAjJKX2RUJWAmFgta665Wjtm_8SeINCHfJBuKaPyL3Xwp2XG-ungvz5DqzuaXdxjs7oALaBFUU-BqbKTv7Z2-FqVyPvynYGeaC7FyPr64BSM; route=9036359bb8a8a461c164a04f8f50b252; _jc_save_fromStation=%u957F%u6C99%2CCSQ; _jc_save_toStation=%u4E0A%u6D77%2CSHH; _jc_save_fromDate=2023-09-22; _jc_save_toDate=2023-09-14; _jc_save_wfdc_flag=dc',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
}
# 请求链接
url = 'https://kyfw.12306.cn/otn/leftTicket/queryZ'
# 请求参数 <字典数据>
data = {
'leftTicketDTO.train_date': '2023-09-22',
'leftTicketDTO.from_station': city_info[from_city],
'leftTicketDTO.to_station': city_info[to_city],
'purpose_codes': 'ADULT'
}
# 发送请求
response = requests.get(url=url, params=data, headers=headers)
# 获取响应的json数据
json_data = response.json()
tb = pt.PrettyTable()
tb.field_names = [
'序号',
'车次',
'出发时间',
'到达时间',
'耗时',
'特等座',
'一等',
'二等',
'软卧',
'硬卧',
'硬座',
'无座',
]
page = 1
# for循环遍历
for i in json_data['data']['result']:
# 字符串分割
index = i.split('|')
# 根据列表索引位置取值
num = index[3] # 车次
start_time = index[8] # 出发时间
end_time = index[9] # 到达时间
use_time = index[10] # 耗时
topGrade = index[32] # 特等座
if topGrade:
topGrade = topGrade
else:
topGrade = index[25]
first_class = index[31] # 一等
second_class = index[30] # 二等
hard_sleeper = index[28] # 硬卧
hard_seat = index[29] # 硬座
no_seat = index[26] # 无座
soft_sleeper = index[23] # 软卧
tb.add_row([
page,
num,
start_time,
end_time,
use_time,
topGrade,
first_class,
second_class,
soft_sleeper,
hard_sleeper,
hard_seat,
no_seat,
])
page += 1
print(tb)
num = input('请输入你要购买车次序号: ')
Train(num, date, from_city, to_city)
最后感谢你观看我的文章呐~本次航班到这里就结束啦
希望本篇文章有对你带来帮助 ,有学习到一点知识~
躲起来的星星也在努力发光,你也要努力加油(让我们一起努力叭)。
最后,宣传一下呀~更多源码、资料、素材、解答、交流皆点击下方名片获取呀