四: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 requestsheaders = {"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], "無票")