爬虫实现12306 目的地 出发地 时间 输入 查询车次 余票

import json
import urllib.parse

import re
import requests


headers = {
'Host':'kyfw.12306.cn',
'If-Modified-Since':'0',
'Pragma':'no-cache',
'Referer':'https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc&fs=%E5%B9%BF%E5%B7%9E,GZQ&ts=%E9%BE%99%E5%B2%A9,LYS&date=2019-04-02&flag=N,N,Y',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
'X-Requested-With':'XMLHttpRequest',
}

#用于获取站点对应的编号
def get_place():
    first_url = "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9141"
    response = requests.get(first_url, headers =headers)
    response = response.content.decode("utf-8")
    place_from = input("请输入起始地:")
    plcae_to = input('请输入目的地')
    date = input("请输入时间(时间格式:2019-04-15):")#
    try:
        #匹配出发地站点号
        pattern1 = place_from+"\|"+"(.*?)\|"
        #匹配目的地站点号
        pattern = plcae_to+"\|"+"(.*?)\|"
        list1 = re.search(pattern1,response)
        list2 = re.search(pattern,response)
        place_from = list1.group(1)
        to_ = list2.group(1)
    except:
        print("城市不匹配请重新输入")
        get_place()
    return place_from,to_,date

def train_number(place_from,to_,date):
    query = {
    'leftTicketDTO.train_date':date,
    'leftTicketDTO.from_station':place_from,
    'leftTicketDTO.to_station':to_,
    'purpose_codes':'ADULT',
    }
    url2 = "https://kyfw.12306.cn/otn/leftTicket/query?" + urllib.parse.urlencode(query)

    cookise = {'_jc_save_fromStation': '%u957F%u6C40%u5357%2CCNS', '_jc_save_toStation': '%u5317%u4EAC%u897F%2CBXP', '_jc_save_fromDate': '2020-03-18', '_jc_save_toDate': '2020-03-11', '_jc_save_wfdc_flag': 'dc'} 
    response = requests.get(url2, headers =headers,cookies=cookies)
    item = json.loads(response.content.decode())
    # print(item)
    result = item.get('data').get("result")
    # https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2019-04-03&leftTicketDTO.from_station=IZQ&leftTicketDTO.to_station=HZH&purpose_codes=ADULT
    l = []
    for i in result:
        train_number = i.split("|")
        dict = {}
        dict["车次"] = train_number[3]
        dict["出发时间"] = train_number[8]
        dict["到达时间"] = train_number[9]
        dict["历时"] = train_number[10]
        dict["商务特等座"] = train_number[-7]
        dict["一等座"] = train_number[-8]
        dict["二等座"] = train_number[-9]
        dict["软卧一等卧"] = train_number[-12]
        dict["硬卧二等卧"] = train_number[-11]
        dict["硬座"] = train_number[-10]
        dict["无座"] = train_number[-13]
        print(dict)
if __name__ == '__main__':
    place_from,to_,date=get_place()
    print(place_from,to_,date)
    train_number(place_from,to_,date)

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值