python实现12306余票抓取功能

最近在自学python,基础学完后,就写了个抓取12306余票的功能,也参考了网上的一些资料。

大家如果也想通过这样的练习来提高自己的python,可以看看。

import re
  import requests
  import json
   
   
  class LeftTicketQuery:
  def queryStation(self):
  stationUrl = "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8971"
  requests.packages.urllib3.disable_warnings()
  response = requests.get(stationUrl, verify=False)
  stations = re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)', response.text)
  return dict(stations)
   
  def makeLeftTicketUrl(self, trainDate, fromStation, toStation, stations):
  fromStation = stations[fromStation]
  toStation = stations[toStation]
  print("fromStation : {} toStation : {}".format(fromStation, toStation))
  if fromStation == None or fromStation == "":
  return None
  if toStation == None or toStation == "":
  return None
  leftTicketUrl = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=" + trainDate + "&leftTicketDTO.from_station=" + fromStation + "&leftTicketDTO.to_station=" + toStation + "&purpose_codes=ADULT"
  print("leftTicketUrl : {}".format(leftTicketUrl))
  return leftTicketUrl
   
  def queryLeftTicket(self, leftTicketUrl, stationCodeName):
  requests.packages.urllib3.disable_warnings()
  response = requests.get(leftTicketUrl, verify=False)
  dictLeftTicket = json.loads(response.text)
  httpstatus = dictLeftTicket["httpstatus"]
  # 请求成功
  tickets = []
  if httpstatus == 200:
  data = dictLeftTicket["data"]
  result = data["result"]
  for line in result:
  cq = line.split("|")
  ticket = {}
  ticket["train_no"] = cq[2] # 车票号
  ticket["station_train_code"] = cq[3] # 车次
  ticket["start_station_telecode"] = cq[4] # 起始站代号
  ticket["end_station_telecode"] = cq[5] # 终点站代号
  ticket["from_station_telecode"] = cq[6] # 出发站代号
  ticket["to_station_telecode"] = cq[7] # 到达站代号
  ticket["start_time"] = cq[8] # 出发时间
  ticket["arrive_time"] = cq[9] # 到达时间
  ticket["lishi"] = cq[10] # 历时
  ticket["canWebBuy"] = cq[11] # 是否能购买:Y 可以
  ticket["yp_info"] = cq[12]
  ticket["start_train_date"] = cq[13] # 出发日期
  ticket["train_seat_feature"] = cq[14]
  ticket["location_code"] = cq[15]
  ticket["from_station_no"] = cq[16]
  ticket["to_station_no"] = cq[17]
  ticket["is_support_card"] = cq[18]
  ticket["controlled_train_flag"] = cq[19]
  ticket["gg_num"] = cq[20]
  ticket["gr_num"] = cq[21]
  ticket["qt_num"] = cq[22]
  ticket["rw_num"] = cq[23] # 软卧
  ticket["rz_num"] = cq[24] # 软座
  ticket["tz_num"] = cq[25]
  ticket["wz_num"] = cq[26] # 无座
  ticket["yb_num"] = cq[27]
  ticket["yw_num"] = cq[28] # 硬卧
  ticket["yz_num"] = cq[29]
  ticket["ze_num"] = cq[30] # 二等座
  ticket["zy_num"] = cq[31] # 一等座
  ticket["swz_num"] = cq[32] # 商务特等座
  ticket["srrb_num"] = cq[33]
  ticket["yp_ex"] = cq[34]
  ticket["seat_types"] = cq[35]
  ticket["exchange_train_flag"] = cq[36]
  ticket["from_station_name"] = stationCodeName[cq[6]]
  ticket["to_station_name"] = stationCodeName[cq[7]]
  tickets.append(ticket)
  else:
  print("Query left ticket wrong!")
  return tickets
   
   
  if __name__ == '__main__':
  trainDate = "2018-05-21"
  fromStation = "西安"
  toStation = "成都"
  ltq = LeftTicketQuery()
  staticonNameCode = ltq.queryStation()
  stationCodeName = dict((v, k) for k, v in staticonNameCode.items())
  leftTicketUrl = ltq.makeLeftTicketUrl(trainDate, fromStation, toStation, staticonNameCode)
  if leftTicketUrl != None:
  tickets = ltq.queryLeftTicket(leftTicketUrl, stationCodeName)
  for ticket in tickets:
  ticketLine = "车次:" + ticket["station_train_code"] + " 出发日期:" + ticket["start_train_date"] + " 出发站:" + \
  ticket["from_station_name"] + " 到达站:" + ticket["to_station_name"] + " 出发时间:" + ticket["start_time"] + " 到达时间:" + ticket[
  "arrive_time"] + " 历时:" + ticket["lishi"] + " 商务座特等座:" + ticket["swz_num"] + " 一等座:" + ticket["zy_num"] + " 二等座:" + \
  ticket["ze_num"] + " 高级软卧:" + ticket.get("yyrw_num", "") + " 软卧:" + ticket["rw_num"] + " 动卧:" + \
  ticket["srrb_num"] + " 硬卧:" + ticket["yw_num"] + " 软座:" + ticket["rz_num"] + " 硬座:" + ticket["yz_num"] + " 无座:" + ticket["wz_num"]
  print(ticketLine)
  else:
  print("Query left ticket wrong!")

你可能感兴趣的:(Python)