摘要
环境:
- 编程语言:Python 3.7
- 操作系统:Win 10
- json数据对象:https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2019-11-03&leftTicketDTO.from_station=GZQ&leftTicketDTO.to_station=SZQ&purpose_codes=ADULT
背景:
我用python写一个获取12306车票信息json数据的脚本时,遇到如下报错:
Traceback (most recent call last):
File "C:/Users/JohelLiang/Desktop/python/specialTicket.py", line 68, in <module>
json = respone.json()
File "E:\Python37\lib\site-packages\requests\models.py", line 897, in json
return complexjson.loads(self.text, **kwargs)
File "E:\Python37\lib\json\__init__.py", line 348, in loads
return _default_decoder.decode(s)
File "E:\Python37\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "E:\Python37\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
将报错信息 json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 放到百度上查询,发现大多都说是json数据格式的问题,然而我对json数据进行检查,或者按照百度说的方法,将加载json数据的方法改为兼容非标准格式模式,即 json.loads(json_str, strict=False) ,依然行不通,车票信息的json数据如下:
问题发现:
之后我无意中把自己的网络换了一个环境,意外的发现数据竟然获取成功,不再报错,频繁获取也不会报错,原先的环境无论怎么刷新都是会报错的。
于是我对DNS进行排查(之前试过用几十个代理对json数据进行获取,发现也是同一个报错,所以确定不是ip限制的问题),发现原环境解析 kyfw.12306.cn 的实际ip为 59.34.229.253 ,新环境解析 kyfw.12306.cn 的实际ip为 113.96.140.252 ,如下图:
原环境:
新环境:
kyfw.12306.cn 可解析出的实际ip地址共有 4 个,分别是 59.34.229.253、113.96.140.253、113.96.140.252、59.34.229.254 ,对其进行排查,发现只有访问的实际ip是 113.96.140.252 时,是可以成功获取json数据的。
解决问题:
于是乎,我想到在hosts中加入12306的固定域名解析,发现问题得以解决,无论如何频繁获取json数据,都不会报错,解决步骤如下:
1、win+R 输入 cmd 打开命令行工具
2、输入 nslookup 命令并访问域名对象 kyfw.12306.cn ,查询域名对应的所有实际ip
3、找到 hosts文件 ,在windows中hosts文件路径:C:\Windows\System32\drivers\etc
4、在hosts文件最后新增一行内容(对解析出的4个ip进行替换,选取可成功获取json数据的ip):113.96.140.252 kyfw.12306.cn
5、成功获取json数据