Python 파충류 실전 의 12306 티켓 오픈

오늘 은 여러분 과 함께 python 12306 여 표 조회 실현(pycharm+python 3.7)에 대해 토론 하고 python 파충류 의 간단 한 실천 을 느껴 보 겠 습 니 다.
브 라 우 저 에서 개발 자 도구(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
요청 한 필드 를 볼 수 있 습 니 다:
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

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

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':'충 칭 남','CXW':'충 칭 서','GGQ':'광저우 동','SHH':'상하 이','상하 이','SNH':'상하 이 남','AOH':'상하 이 홍교','상하 이 홍교','SXH':':'SXH':':'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)
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.

좋은 웹페이지 즐겨찾기