在网页中寻找需要的网站信息
- 推荐(橘子女侠):点击传送https://blog.csdn.net/qq_38684504/article/details/86011051
*Selenium实现买票: https://blog.csdn.net/qq_46567096/article/details/123750386?spm=1001.2014.3001.5501
- l_q.query(“出发站”, “到达站”, “时间”):填写购票信息,查询余票(将汉字转化为对应变量)
- 了解一下:用户代理(User-Agent),Cookie, requests库
- 注意 self.headers = { } 中User-Agent,Cookie格式
"""
查询余票的网址:
https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2021-12-23&leftTicketDTO.from_station=SHH&leftTicketDTO.to_station=XUN&purpose_codes=ADULT
伪代码:
https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={出发日期(年-月-日)}&leftTicketDTO.from_station={出发地(字母代号)}&leftTicketDTO.to_station={到达地(字母代号)}&purpose_codes=ADULT
https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2022-03-25&leftTicketDTO.from_station=WHN&leftTicketDTO.to_station=XUN&purpose_codes=ADULT
method: Get
站点变量:
https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9217
url : https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9217
"""
import urllib3
import requests
from prettytable import PrettyTable
#from selenium.webdriver import Chrome
#import time
#self.query_url = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT"
urllib3.disable_warnings() # 不显示警告信息
class LeftQuery:
# station_url 查询站名称的url
def __init__(self):
self.station_url = "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9217"
# https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc&fs=%E6%AD%A6%E6%B1%89,WHN&ts=%E4%BF%A1%E9%98%B3,XUN&date=2022-03-29&flag=N,N,Y
self.query_url = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62",
"Cookie": "JSESSIONID=15629DB2E7EE37E3054DA145A2F9ECE9; tk=_h0i9eGO__qD2MeAta3XzZBB6nFo5luGdqh1h0; _jc_save_wfdc_flag=dc; _jc_save_zwdch_fromStation=%u676D%u5DDE%2CHZH; _jc_save_zwdch_cxlx=0; guidesStatus=off; _jc_save_toStation=%u4FE1%u9633%2CXUN; route=c5c62a339e7744272a54643b3be5bf64; BIGipServerotn=2196242698.50210.0000; RAIL_EXPIRATION=1648189590792; RAIL_DEVICEID=c1H8Q0iPw8YT_Xc3s-lPXZrNSpInLpaio-078BsqcdOtwa7ZdYAFsV_6wK4xB_nbGQtSdMjyzL95Qx7pcVchE7G8s-4BxpdtUTXRBN0jXpskM7zndoEe1sB37ZhBtpNfWli1SnIEqAP47cYhaMVYNLkLvmdIwpYR; highContrastMode=defaltMode; cursorStatus=off; BIGipServerportal=3168010506.17695.0000; BIGipServerpassport=837288202.50215.0000; _jc_save_fromStation=%u6B66%u6C49%2CWHN; _jc_save_fromDate=2022-03-29; _jc_save_toDate=2022-03-21; current_captcha_type=Z; uKey=16357e0bd021327592f6bb65d2ac514592caecc810a97894efa6b7f761a5f0fb"
}
def get_station_name(self, station):
response = requests.get(url=self.station_url, verify=False).text
result = response.split("@")[1:]
temp_dict = {}
for i in result:
temp_dict[i.split("|")[1]] = i.split("|")[2]
#print(temp_dict)
#print(type(temp_dict))
return temp_dict[station]
def query(self, from_station, to_station, date):
'''
from_station: 出发第
to_station:到达地
date:出发日期
'''
fromstation = self.get_station_name(from_station)
tostation = self.get_station_name(to_station)
response = requests.get(url=self.query_url.format(date, fromstation, tostation), headers=self.headers,verify=False).json() #***
#print(response)
result = response['data']['result']
#print(result)
if result is None:
print("抱歉,没有符合的列车")
exit()
else:
print(date + from_station + "--" + to_station + "还有机会哦!!!")
ptable = PrettyTable(
'车次 出发站/到达站 出发时间/到达时间 历时 商务座 一等座 二等座 高级软卧 软卧一等座 硬卧二等座 动卧 硬座 无座 其他 预定'.split())
print(ptable)
tickets=[]
for ticket in result:
ticket_list = ticket.split("|")
yuding = ticket_list[1]
# 车次在索引为3的位置,以下类似
checi = ticket_list[3]
shifa_codes = ticket_list[4]
zhongdian_codes = ticket_list[5]
from_code = ticket_list[6]
to_code = ticket_list[7]
chufa_time = ticket_list[8]
daoda_time = ticket_list[9]
total_time = ticket_list[10]
vip = ticket_list[32]
yideng = ticket_list[31]
erdeng = ticket_list[30]
gaoji_ruanwo = ticket_list[21]
yideng_ruanwo = ticket_list[23]
erdeng_ruanwo = ticket_list[28]
dongwo = ticket_list[33]
yingzuo = ticket_list[29]
wuzuo = ticket_list[26]
qita = "--"
tickets.append(
[checi, from_station, to_station, chufa_time, daoda_time, total_time, vip, yideng, erdeng,
gaoji_ruanwo, yideng_ruanwo, erdeng_ruanwo, dongwo, yingzuo, wuzuo, qita, yuding])
for i in tickets:
for y in range(len(i)):
if i[y] == '':
i[y] = '--'
print(i)
if __name__ == '__main__':
l_q = LeftQuery()
l_q.query("杭州", "信阳", "2022-03-29")
效果图
- 我的效果图,额…反正能看,上方有链接,去向橘子女侠学习吧
橘子女侠(效果图)