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
요청 한 필드 를 볼 수 있 습 니 다:
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)
총결산이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.