四:Cookie
与Session
实战
在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问。在登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。还有一些网站,在打开浏览器时就自动登录了,而且在很长时间内都不会失效,这里面所涉及的就是 Session
和 Cookie
的相关知识
(1)Cookie
通过在客户端记录的信息确定用户身份
HTTP是一种无连接协议,客户端和服务器交互仅仅限于请求 / 响应过程,结束后断开,下一次请求时,服务器会认为是一个新的客户端,为了维护他们之间的连接,让服务器知道这是前一个用户发起的请求,就必须在一个地方保存客户端信息
(2)Session
Session
,中文称之为会话,通过在服务端记录的信息确定用户身份,其本义是指有始有终的一系列动作。例如打电话时,从拿起电话拨号到挂断电话之间的一系列过程就可以称为一个 Session
爬虫图解
Cookie
与Session
– 登录流程:
文字解析:
1.再次登录其实就是验证之前生成的账号和密码,从数据库中去查询当前的用户是否存在,若存在就是登录成功了,然后通过加密算法返回session_id
2.set_cookie
是服务器返回的,因为只有服务器返回的才是set_cookie
3.服务端根据cookie
中携带的session_id
去名为session
的数据库(假设session_id
存储在名为session
的数据库中)中找session_id
是否存在
4.这样做的好处就是用户只需要输入一次账号和密码,之后在访问网页时,只需要在headers
信息利用Cookie
包含Session_id
,后台就可以根据Session_id
来判断用户是否登录
Cookie与Session实战案例 – 12306查票示例:
import requests
headers = {
"Accept": "*/*",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"If-Modified-Since": "0",
"Pragma": "no-cache",
"Referer": "https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
"sec-ch-ua": "^\\^Google",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "^\\^Windows^^"
}
cookies = {
"_uab_collina": "170210568210505922888592",
"JSESSIONID": "44EBFDF0F56EDAAB390BD3821713F910",
"BIGipServerpassport": "921174282.50215.0000",
"guidesStatus": "off",
"highContrastMode": "defaltMode",
"cursorStatus": "off",
"route": "495c805987d0f5c8c84b14f60212447d",
"BIGipServerotn": "2698445066.64545.0000",
"_jc_save_fromStation": "^%^u5317^%^u4EAC^%^2CBJP",
"_jc_save_toStation": "^%^u4E0A^%^u6D77^%^2CSHH",
"_jc_save_toDate": "2023-12-09",
"_jc_save_wfdc_flag": "dc",
"_jc_save_fromDate": "2023-12-10"
}
url = "https://kyfw.12306.cn/otn/leftTicket/query"
params = {
"leftTicketDTO.train_date": "2023-12-10",
"leftTicketDTO.from_station": "BJP",
"leftTicketDTO.to_station": "SHH",
"purpose_codes": "ADULT"
}
response = requests.get(url, headers=headers, cookies=cookies, params=params)
data = response.json()
# print(data,type(data))
result = data['data']['result']
# print(result,type(result))
for item in result: # item代表每一个车次数据
# print(item,"此时是字符串")
data_li = item.split('|') # 代表每一车次的杂乱数据
# print(data_li,"此时是列表")
# for i,f in enumerate(data_li): # 这个for循环是为了确定一等做和车次的索引
# pass
# print(i,f) # 通过 '|' 分割,拿到每一个杂乱小数据的索引值与具体的值
'''
车次 -- 索引为3
一等座 -- 索引为31
'''
if data_li[31] != "无" and data_li[31] != "":
print(data_li[3], "有票", "一等座剩余:", data_li[31])
else:
print(data_li[3], "无票")
print(data_li[3], "有票", "一等座剩余:", data_li[31])
else:
print(data_li[3], "无票")