_’’’
cookie反反爬
案例:查12306车票信息
需求:查长沙-上海各车次车票数量
页面分析:
数据:静态加载,动态加载
1.url = https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2022-03-25&leftTicketDTO.from_station=CDW&leftTicketDTO.to_station=CQW&purpose_codes=ADULT
2:请求方式是: get
‘’’
上代码:_
import requests
import json
url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2022-03-25&leftTicketDTO.from_station=CDW&leftTicketDTO.to_station=CQW&purpose_codes=ADULT'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',
'Cookie': '_uab_collina=164813514567909479612501; JSESSIONID=B92C2713D07E7942DC4746A2DAE84F50; highContrastMode=defaltMode; guidesStatus=off; cursorStatus=off; RAIL_EXPIRATION=1648423265081; RAIL_DEVICEID=OwYpKee2YthiEUIIudKf7GoLFzK0y1kKyafYRzsaz0A-Mr18jMf8q7cilELEmRfbv9pBtTh63sUbZKhA7goitXCV1WBBkA7mhYjhMCT-YbSAdEGP7ovrGAe53vs_w3MKHMz8kCLTkCr1CVlPT2lADgc8K05ZGf8W; _jc_save_fromStation=%u6210%u90FD%2CCDW; BIGipServerpassport=887619850.50215.0000; route=6f50b51faa11b987e576cdb301e545c4; BIGipServerotn=1641611530.24610.0000; _jc_save_fromDate=2022-03-25; _jc_save_toDate=2022-03-25; _jc_save_wfdc_flag=dc; _jc_save_toStation=%u91CD%u5E86%2CCQW'
}
res = requests.get(url, headers=headers)
res.encoding = 'utf-8'
dic = res.text
#出来的dic格式为str,要用json转换成dic
dic = json.loads(res.text)
data = dic['data']['result']
print('经过成都到重庆的列车有:')
for i in data:
#num = 0 #在这里加入一个num赋值为0,是真的很巧妙,作用就是跟列表res里的各项组合排列(看下面的循环)
res= i.split('|')
#print(result)
print(f'车次为{res[3]},二等票为{res[30]},一等座票为{res[31]},商务座为{res[32]}')
#for j in res:
#print(num,j)
#num +=1
总结:
这一次对全国著名的12306下手,真的感受到了12306的强大,可以说它几乎每秒钟都在更新…好,废话不多说.
1)首先对12306网页分析,查看原代码,查找一个唯一的东西(如其中一车次:G8613,没有找到一处,证明网站数据是动态的.
2)跟着打开发者工具(按F12)点击Network,再刷新,再点XHR哪一项,好消息,只有一项,明确数据是动态的了,终于找到了URL(https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2022-03-25&leftTicketDTO.from_station=CDW&leftTicketDTO.to_station=CQW&purpose_codes=ADULT)
3)加上UA可以请求了,出来了,乱码 ==>加代码:res.encoding = ‘utf-8’
4)打印结果,12306的强大体现了,网页不知转到哪里去了,分析,可能是cookie没加上
5)加上cookie之后,好,真家伙来了(requests已经把结果转为dict了)开始剥洋葱…
6)经过两重剥皮后得到一列表:data = dic[‘data’][‘result’],在此有一很巧妙,作用就是跟列表res里的各项组合排列(看下面的循环):
num = 0
for j in res:
print(num,j)
num +=1
7)这样就很清楚了,终于找到了有用的资料(res[3]:车次 res[30]:二等票 res[31]一等票 res[32]商务票)可以打印了
8)打印结果: print(f’车次为{res[3]},二等票为{res[30]},一等座票为{res[31]},商务座为{res[32]}’)