1. 根据抓包软件发现,station.name.js这一js文件储存了全部的地铁站信息,


历经对请求头的剖析,发现要求的url为:https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9168 ,但历经检测发现station_version要求的主要参数对与相对的結果沒有危害,因而抓取过取得成功立即忽视了要求主要参数 。
爬取站口信息编码以下:

import requests


HEADERS= {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',
}

def get_station():
    url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js'
    res_str = requests.get(url, headers=headers).text.split('=')[-1].strip("'")
    res_dic = {}
    for i in res_str[1:].split('@'):
        res = i.split('|')
        res_dic.update({res[1]: res[2]})
    retrun res_dic

if __name__ == "__main__":
      get_station()

实行結果以下:

2.再次剖析火车票信息,发现query这一要求便是查看的火车车票的票务中心信息


根据剖析要求的url链接发现上边Cookie有很多 ,因为一开始的情况下我并沒有应用Cookie,发现要求的回应自始至终获得不上恰当的結果,随后消除浏览器缓存文件的全部cookie再度点击查询查看按键 ,抓包软件以下:

发现只推送了2次ajax要求,可是这2次回应也也没有设定cookie,怎么会带上上cookie信息 ,因而猜想推送ajax要求的情况下自动生成了cookie。

3.查看cookie是怎样形成的

应用search开展全局搜索(键盘快捷键ctrl shift F),检索jc_save_fromStation寻找以下結果:

随后调成Sources对话框对检索到的js代码开展部分检索jc_save_fromStation ,发现jc_save_fromStation是jc_getcookie函数的一个主要参数,发现以下:

再次对检索到的jc_save_fromStation放入中断点开展调节,发现:

随后再次开展部分检索jc_setcookie ,发现:
,在其中前2个主要参数便是各自相匹配着cookie的键合值,而且cookie的键合值是不容易产生变化的,因而分辨js是要求的情况下形成是恰当的。
应用百度站长工具:http://tool.chinaz.com/tools/urlencode.aspx对cookie的键开展编解码:
编解码以前:

编解码以后:

发现cookie的值便是根据url编号得到 到的:
_jc_save_fromStation="北京市,BJP"的编号 # 始发地名字,始发地编号的urlEncode的编号
_jc_save_toStation="上海市,SHH"的编号 # 到达站 ,到达站编号的urlEncode的编号
_jc_save_fromDate=2020-11-30 # 考虑时间
_jc_save_toDate=2020-11-29 # 查看的具体時间
_jc_save_wfdc_flag=dc # dc是固定不动的值

详细编码完成:

import requests
import time
from urllib import parse

HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',
}


def get_station():
    url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js'
    res_str = requests.get(url, headers=HEADERS).text.split('=')[-1].strip("'")
    res_dic = {}
    for i in res_str[1:].split('@'):
        res = i.split('|')
        res_dic.update({res[1]: res[2]})
    return res_dic


def check(start_addr, end_addr, date):
    url = 'https://kyfw.12306.cn/otn/leftTicket/query'
    stations = get_station()
    start_addr_str = ","   stations[start_addr]
    end_addr_str = ","   stations[end_addr]
    cookie_mode =  '_jc_save_fromStation={}; _jc_save_toStation={}; _jc_save_fromDate={}; _jc_save_toDate={}; _jc_save_wfdc_flag=dc'
    from_cookie = str((start_addr).encode('unicode_escape')).replace(r'\\', '%').strip(r"b'").strip("'")   str(parse.quote(start_addr_str))
    end_cookie = str((end_addr).encode('unicode_escape')).replace(r'\\', '%').strip(r"b'").strip("'")   parse.quote(end_addr_str)
    from_date = date
    save_date = time.strftime("%Y-%m-%d", time.localtime(time.time()))
    cookie = cookie_mode.format(from_cookie, end_cookie, from_date, save_date)
    HEADERS['Cookie'] = cookie
    params = {
        'leftTicketDTO.train_date': date,
        'leftTicketDTO.from_station': start_addr_str.strip(','),
        'leftTicketDTO.to_station': end_addr_str.strip(','),
        'purpose_codes': 'ADULT',
    }
    response = requests.get(url, params=params, headers=HEADERS)
    print(response.text)


check('北京市', '上海市', '2020-11-30')

编码結果:

結果终于是能够一切正常的取得了,实际的代码设计全过程就没有这儿再次写了,实际的新项目能够去https://github.com/MingHao-homes/Ticket-grabbing-12306查询

文章来源于网络 ,如有侵权请联系站长QQ61910465删除
本文版权归趣营销www.SEOgUrublog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ卍61910465