使用Python 3编写12306余票查询脚本

举报
悦来客栈的老板 发表于 2020/12/29 00:47:11 2020/12/29
【摘要】 import osimport jsonimport requestsfrom prettytable import PrettyTablefrom requests.exceptions import RequestException def getResponse(url,**kwargs): try: response = requests.get(url,**kwar...

  
  1. import os
  2. import json
  3. import requests
  4. from prettytable import PrettyTable
  5. from requests.exceptions import RequestException
  6. def getResponse(url,**kwargs):
  7. try:
  8. response = requests.get(url,**kwargs)
  9. if response.status_code == 200:
  10. return response
  11. else:
  12. return None
  13. except RequestException:
  14. return None
  15. def get_stations():
  16. dirname = os.path.dirname(__file__)
  17. file = os.path.join(dirname,"stations.json")
  18. with open(file,'r',encoding = "utf-8") as json_file:
  19. stations = json.load(json_file)
  20. return stations
  21. def getleftTickets(stations,train_date,from_station,to_station):
  22. query_url = 'https://kyfw.12306.cn/otn/leftTicket/queryZ'
  23. Ticket_data = {
  24. "leftTicketDTO.train_date": train_date,
  25. "leftTicketDTO.from_station":from_station,
  26. "leftTicketDTO.to_station": to_station,
  27. "purpose_codes": "ADULT",
  28. }
  29. headers = {
  30. 'Host': 'kyfw.12306.cn',
  31. 'Referer': 'https://kyfw.12306.cn/otn/leftTicket/init',
  32. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
  33. }
  34. data = getResponse(query_url,params = Ticket_data,headers = headers)
  35. if data is None:
  36. print ("访问异常!")
  37. return None
  38. table = PrettyTable(['车次','始发站','终点站','出发时间','抵达时间','历时','商务座','一等座','二等座','高级软卧','软卧','动卧','硬卧','软座','硬座','无坐','其他'])
  39. lists = data.json()["data"]["result"]
  40. for items in lists:
  41. ticket_info = dict()
  42. item = items.split('|')#用"|"进行分割
  43. ticket_info['station_train_code'] = item[3] #车次在3号位置
  44. ticket_info['from_station_name'] = stations[item[6]] #始发站信息在6号位置
  45. ticket_info['to_station_name'] = stations[item[7]] #终点站信息在7号位置
  46. ticket_info['start_time'] = item[8] #出发时间信息在8号位置
  47. ticket_info['arrive_time'] = item[9] #抵达时间在9号位置
  48. ticket_info['last_time'] = item[10] #经历时间在10号位置
  49. ticket_info['商务座'] = item[32] or item[25] # 特别注意:商务座在32或25位置
  50. ticket_info['一等座'] = item[31] #一等座信息在31号位置
  51. ticket_info['二等座'] = item[30] #二等座信息在30号位置
  52. ticket_info['高级软卧'] = item[21] #高级软卧信息在31号位置
  53. ticket_info['软卧'] = item[23] #软卧信息在23号位置
  54. ticket_info['动卧'] = item[27] #动卧信息在27号位置
  55. ticket_info['硬卧'] = item[28] #硬卧信息在28号位置
  56. ticket_info['软座'] = item[24] #软座信息在24号位置
  57. ticket_info['硬座'] = item[29] #硬座信息在29号位置
  58. ticket_info['无座'] = item[26] #无座信息在26号位置
  59. ticket_info['其他'] = item[22] #其他信息在22号位置
  60. table.add_row(list(ticket_info.values()))
  61. print (table)
  62. if __name__ == "__main__":
  63. train_info = input("请输入起始站,终点站及出发时间,以空格隔开,格式举例:岳阳 深圳 2019-03-10\n")
  64. from_station,to_station,train_date = train_info.split()
  65. stations = get_stations()
  66. assert(from_station in stations)
  67. assert(to_station in stations)
  68. from_station = stations[from_station]
  69. to_station = stations[to_station]
  70. getleftTickets(stations,train_date,from_station,to_station)

stations.json文件的获取请见上一篇博文。

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/86693180

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。