python 으로 12306 여 표를 조회 하 는 것 을 가르쳐 드 리 겠 습 니 다.

17537 단어 python12306
python 12306 여 표 조회 실현
브 라 우 저 에서 개발 자 도구(F12)를 열 고 남 은 표 의 조 회 를 시도 하 겠 습 니 다.개발 자 도 구 를 통 해 요청 한 패 키 지 를 확인 하 겠 습 니 다.

남 은 표 조회 인터페이스
빨간색 테두리 의 URL 이 12306 서버 에 요청 한 것 을 볼 수 있 습 니 다.구체 적 으로 무엇 입 니까?어디 보 자.
[
https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2019-01-21&leftTicketDTO.from_station=CDW&leftTicketDTO.to_station=SZQ&purpose_codes=ADULT](https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2019-01-21&leftTicketDTO.from_station=CDW&leftTicketDTO.to_station=SZQ&purpose_codes=ADULT)
요청 한 필드 를 볼 수 있 습 니 다:
leftTicketDTO.train_날짜
leftTicketDTO.from_station:검색 의 출발지
leftTicketDTO.to_station:조회 목적지
purpose_codes:이 필드 가 무엇 을 하 는 지 잘 모 르 겠 으 니 기본 으로 하 세 요.
우리 가 제출 한 URL 요청 을 통 해 알 수 있 듯 이 우리 가 입력 한 청 두,심 천 은 모두 대응 하 는 번호 가 되 었 다.예 를 들 어 청 두(CDW),심 천(SZQ)등 이다.그래서 우리 프로그램 이 입력 할 때 처 리 를 해 야 한다.12306 의 한 곳 에 이런 도시 이름과 인 코딩 에 대응 하 는 문서 가 저장 되 어 있다.
[
https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8971](https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8971)

사이트 인 코딩 대응
도시 이름과 번 호 를 추출 하 는 작은 프로그램 을 만 듭 니 다.

    import re,requests
    url = "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8971"
    response = requests.get(url,verify=False)
    #             
    chezhan = re.findall(r'([\u4e00-\u9fa5]+)\|([A-Z]+)', response.text)
    chezhan_code = dict(chezhan)
    #    
    chezhan_names = dict(zip(chezhan_code.values(),chezhan_code.keys()))
    #          
    print(chezhan_names)
받 은 인쇄 결 과 는 다음 과 같 습 니 다(부분 만 캡 처).
{'VAP':'북경 북','BOP':'북경 동','BJP':'북경','VNP':'북경 남','BXP':'북경 서','IZQ':
'광저우 남','CUW':'충 칭 북','CQW':'충 칭','CRW':'충 칭 남','CXW':'충 칭 서','GGQ':'광저우 동',
'SHH':'상해','SNH':'상해 남','AOH':'상해 홍교','SXH':'상해 서','TBP':'천진 북','TJP':
'천진','TIP':'천진 남','TXP':'천진 서','XJA':'홍콩 서 구 룡','CCT':'장춘','CET':'장춘 남',
'CRT':'장춘 서','ICW':'청 두 동','CNW':'청 두 남','CDW':'청 두','CSQ':'장사','CWQ':
'장사 남',}
다음은 프로그램의 주요 코드 작성 을 시작 합 니 다.

    def main():
      date     = input("     ( 2019-01-22):
") from_station = chezhan_code[input(" :
")] to_station = chezhan_code[input(" :
")] url = "https://kyfw.12306.cn/otn/leftTicket/queryZ?" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5702.400 QQBrowser/10.2.1893.400" } url=url+"leftTicketDTO.train_date="+date+"&leftTicketDTO.from_station="+from_station+"&leftTicketDTO.to_station="+to_station+"&purpose_codes=ADULT" #print(url) URL #request r = requests.get(url,headers=headers) r.raise_for_status() # , r.encoding = r.apparent_encoding showTicket(r.text)
사용자 가 시간,시작 사이트,목적 사 이 트 를 입력 한 다음 get 을 통 해 요청 한 다음 에 우 리 는 돌아 오 는 웹 페이지 정 보 를 분석 합 니 다.우 리 는 현재 위 코드 의 r.text 를 인쇄 하여 우리 가 요청 한 후에 어떤 정 보 를 되 돌려 주 었 는 지 보고 우리 가 어떻게 해석 해 야 할 지 결정 합 니 다.

실행 결과
이렇게 보면 불편 하 다.우 리 는 수첩 에 붙 여 상세 한 분석 을 한다.

반환 요청 결과 정보
12306 에 표 시 된 정보 와 비교 해 보면 K829 는 차량 번호 이 고 CDW 와 BJQ 는 출발지 와 목적지 이 며 10:10 은 출발 시간 이 며 06:13 은 도착 시간 이 고 44:21 은 시간 이 걸 리 며 20190123 은 조회 날짜 이 며 나머지 는 일련의 표 의 각종 정보 이다.
다음은 이 되 돌아 오 는 정 보 를 분석 하 는 것 입 니 다.사실 이것 도 python 파충류 의 관건 입 니 다.바로 분석 입 니 다!!
우 리 는 먼저 정 보 를 json 형식 으로 바 꾸 었 습 니 다.모두'|'으로 구 분 된 것 을 볼 수 있 습 니 다.그러면 우 리 는 split 함수 로 나 누 겠 습 니 다.다음은 주요 기능 코드 입 니 다.

    def showTicket(html):
      html = json.loads(html)
      table = PrettyTable(["    ","    ","    ","    ","    ","    ","   ","    ","   ","    ","  ","  ","  ","  ","  ","  ","  ","  "])
      for i in html['data']['result']:
        name = [
              "station_train_code",
              "from_station_name",
              "to_station_name",
              "start_time",
              "arrive_time",
              "lishi",
              "swz_num",
              "zy_num",
              "ze_num",
              "dw_num",
              "gr_num",
              "rw_num",
              "yw_num",
              "rz_num",
              "yz_num",
              "wz_num",
              "qt_num",
              "note_num"
            ]
        data = {
              "station_train_code": '',
              "from_station_name": '',
              "to_station_name": '',
              "start_time": '',
              "arrive_time": '',
              "lishi": '',
              "swz_num": '',
              "zy_num": '',
              "ze_num": '',
              "dw_num": '',
              "gr_num": '',
              "rw_num": '',
              "yw_num": '',
              "rz_num": '',
              "yz_num": '',
              "wz_num": '',
              "qt_num": '',
              "note_num": ''
            }
        #          
        item = i.split('|')                 #  “|”    
        data["station_train_code"] = item[3]        #      , 3   
        data["from_station_name"]  = item[6]        #      6   
        data["to_station_name"]   = item[7]        #      7   
        data["start_time"]     = item[8]        #     8   
        data["arrive_time"]     = item[9]        #     9   
        data["lishi"]        = item[10]       #     10   
        data["swz_num"]       = item[32] or item[25] #    ,    32 25  
        data["zy_num"]       = item[31]       #      31   
        data["ze_num"]       = item[30]       #      30   
        data["gr_num"]       = item[21]       #       21   
        data["rw_num"]       = item[23]       #     23   
        data["dw_num"]       = item[27]       #     27   
        data["yw_num"]       = item[28]       #     28   
        data["rz_num"]       = item[24]       #     24   
        data["yz_num"]       = item[29]       #     29   
        data["wz_num"]       = item[26]       #     26   
        data["qt_num"]       = item[22]       #     22   
        data["note_num"]      = item[1]        #     1   
        color = Colored()
        data["note_num"] = color.white(item[1])
        #      ,    “-”  
        for pos in name:
          if data[pos] == "":
            data[pos] = "-"
        tickets = []
        cont = []
        cont.append(data)
        for x in cont:
          tmp = []
          for y in name:
            if y == "from_station_name":
              s = color.green(chezhan_names[data["from_station_name"]])
              tmp.append(s)
            elif y == "to_station_name":
              s = color.red(chezhan_names[data["to_station_name"]])
              tmp.append(s)
            elif y == "start_time":
              s = color.green(data["start_time"])
              tmp.append(s)
            elif y == "arrive_time":
              s = color.red(data["arrive_time"])
              tmp.append(s)
            elif y == "station_train_code":
              s = color.yellow(data["station_train_code"])
              tmp.append(s)
            else:
              tmp.append(data[y])
          tickets.append(tmp)
        for ticket in tickets:
          table.add_row(ticket)
      print(table)
그럼 우리 프로그램 성공!!

실행 결과
그러나 컴 파일 러 에서 Prettytable 의 칸 이 정렬 되 지 않 았 습 니 다.걱정 하지 마 세 요.터미널 에서 스 크 립 트 를 실행 하면 보기 좋 은 출력 을 볼 수 있 습 니 다.

터미널 실행 결과

완성!!!다음은 전체 코드 입 니 다.main.py

    # -*- coding: utf-8 -*-
    import re,requests,datetime,time,json
    from prettytable import PrettyTable
    from colorama import init,Fore
    from stationinfo import chezhan_code,chezhan_names
    init(autoreset=False)
    class Colored(object):
      def yeah(self,s):
        return Fore.LIGHTCYAN_EX + s + Fore.RESET
      def green(self,s):
        return Fore.LIGHTGREEN_EX + s + Fore.RESET
      def yellow(self,s):
        return Fore.LIGHTYELLOW_EX + s + Fore.RESET
      def white(self,s):
        return Fore.LIGHTWHITE_EX + s + Fore.RESET
      def blue(self,s):
        return Fore.LIGHTBLUE_EX + s + Fore.RESET
    def showTicket(html):
      html = json.loads(html)
      table = PrettyTable(["    ","    ","    ","    ","    ","    ","   ","    ","   ","    ","  ","  ","  ","  ","  ","  ","  ","  "])
      for i in html['data']['result']:
        name = [
              "station_train_code",
              "from_station_name",
              "to_station_name",
              "start_time",
              "arrive_time",
              "lishi",
              "swz_num",
              "zy_num",
              "ze_num",
              "dw_num",
              "gr_num",
              "rw_num",
              "yw_num",
              "rz_num",
              "yz_num",
              "wz_num",
              "qt_num",
              "note_num"
            ]
        data = {
              "station_train_code": '',
              "from_station_name": '',
              "to_station_name": '',
              "start_time": '',
              "arrive_time": '',
              "lishi": '',
              "swz_num": '',
              "zy_num": '',
              "ze_num": '',
              "dw_num": '',
              "gr_num": '',
              "rw_num": '',
              "yw_num": '',
              "rz_num": '',
              "yz_num": '',
              "wz_num": '',
              "qt_num": '',
              "note_num": ''
            }
        #          
        item = i.split('|')                 #  “|”    
        data["station_train_code"] = item[3]        #      , 3   
        data["from_station_name"]  = item[6]        #      6   
        data["to_station_name"]   = item[7]        #      7   
        data["start_time"]     = item[8]        #     8   
        data["arrive_time"]     = item[9]        #     9   
        data["lishi"]        = item[10]       #     10   
        data["swz_num"]       = item[32] or item[25] #    ,    32 25  
        data["zy_num"]       = item[31]       #      31   
        data["ze_num"]       = item[30]       #      30   
        data["gr_num"]       = item[21]       #       21   
        data["rw_num"]       = item[23]       #     23   
        data["dw_num"]       = item[27]       #     27   
        data["yw_num"]       = item[28]       #     28   
        data["rz_num"]       = item[24]       #     24   
        data["yz_num"]       = item[29]       #     29   
        data["wz_num"]       = item[26]       #     26   
        data["qt_num"]       = item[22]       #     22   
        data["note_num"]      = item[1]        #     1   
        color = Colored()
        data["note_num"] = color.white(item[1])
        #      ,    “-”  
        for pos in name:
          if data[pos] == "":
            data[pos] = "-"
        tickets = []
        cont = []
        cont.append(data)
        for x in cont:
          tmp = []
          for y in name:
            if y == "from_station_name":
              s = color.green(chezhan_names[data["from_station_name"]])
              tmp.append(s)
            elif y == "to_station_name":
              s = color.yeah(chezhan_names[data["to_station_name"]])
              tmp.append(s)
            elif y == "start_time":
              s = color.green(data["start_time"])
              tmp.append(s)
            elif y == "arrive_time":
              s = color.yeah(data["arrive_time"])
              tmp.append(s)
            elif y == "station_train_code":
              s = color.yellow(data["station_train_code"])
              tmp.append(s)
            else:
              tmp.append(data[y])
          tickets.append(tmp)
        for ticket in tickets:
          table.add_row(ticket)
      print(table)
    def main():
      date     = input("     :
") from_station = chezhan_code[input(" :
")] to_station = chezhan_code[input(" :
")] url = "https://kyfw.12306.cn/otn/leftTicket/queryZ?" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5702.400 QQBrowser/10.2.1893.400" } url=url+"leftTicketDTO.train_date="+date+"&leftTicketDTO.from_station="+from_station+"&leftTicketDTO.to_station="+to_station+"&purpose_codes=ADULT" #print(url) URL #request r = requests.get(url,headers=headers) r.raise_for_status() # , r.encoding = r.apparent_encoding showTicket(r.text) #print(r.text) main()
stationinfo.py

    import re,requests
    url = "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8971"
    response = requests.get(url,verify=False)
    #             
    chezhan = re.findall(r'([\u4e00-\u9fa5]+)\|([A-Z]+)', response.text)
    chezhan_code = dict(chezhan)
    chezhan_names = dict(zip(chezhan_code.values(),chezhan_code.keys()))
    #print(chezhan_names)
python 으로 12306 여 표를 조회 하 는 것 을 가 르 치 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 python 이 12306 여 표를 조회 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기