赞
踩
今天爬取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())
那么此时就可以获得数据了:
那么此时获取返回的网页源代码也就正确了:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。