json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)最有效的解答

tech2025-06-01  11

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

今天爬取12306网站余票的时候,发现了该问题,找了一天的办法都无法解决,首先先分析该问题出现的原因,该问题提出获取的 JSON数据不对,可能是格式不对,或者根本就没有获取上。

例如要爬取下面的余票: 然后根据请求URL来获取它返回的JSON数据:

一般情况下直接就可以获得返回的JSON数据,但是确返回报错,显示JSON数据格式不对: 换了网络环境也不行,显然不是这原因,12306对外界爬虫做了一个稍微的障碍,用了对json数据格式进行处理还是不对,说明就根本没有获得JSON数据,难道是URL地址不对?那么在PyCharm里面按住ctrl 点击URL地址后,或者用浏览器打开这个URL地址发现: 这显示根据URL地址在浏览器中可以获取到返回的JSON数据,奇怪了,在浏览器中根据请求URL可以获得数据,那么通过python中为什么不行,显然是12306服务器拒绝了访问,设置了反爬虫,那么看看它返回的网页源码是什么,如果返回的对的JSON,那么学过网页的就知道,返回的直接就是上面一摸一样的:

url='https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2020-09-10&leftTicketDTO.from_station=TYV&leftTicketDTO.to_station=DTV&purpose_codes=ADULT' response = requests.get(url) print(response.text)

结果输出如下: 这显然返回的是一个网页啊,不是JSON数据,那么就知道了,12306设置了反爬虫,不会直接根据它的URL地址来爬得数据,那么再将上面的源代码中的乱码矫正一下:

print(response.text.encode('ISO-8859-1').decode('utf-8'))

看见返回了一个错误的网页界面,里面肯定没有JSON,所以肯定一直报错,既然12306设置了反爬虫,并且浏览器能打开,python打不开,那只有将headers带进去进行爬取,根据实验,需要将Cookie带到headers中,或者你将User-Agent也代进去:

headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0' , 'Cookie':'_uab_collina=159902892220498500233763; JSESSIONID=3BE46C069182 .... '} //将cookie复制上去就行,这里就省略了 response = requests.get(url , headers = headers) //带上头来进行访问

再来进行输出JSON:

print(response.json())

那么此时就可以获得数据了:

那么此时获取返回的网页源代码也就正确了:

最新回复(0)