本次教程涉及到的軟件包括:
- Chrome瀏覽器
- Chrome的插件Postman
- Python的Request
假設你已經熟悉使用一切,我們直接告訴你結果:
- Python的Request
所有的請求信息在代碼本身,不會調用到瀏覽器的Cookie信息,如果請求中需要驗證Cookie需要添加到Hearders中 - Chrome的插件Postman
每次請求可能會調用瀏覽器保存的Cookie,所以如果想分析Request請求需要攜帶什么Cookie,需要先刪除瀏覽器的Cookie
如果看不懂結論,可以接下來的照步驟來學習分析,主要包含幾個要點:
- 如何清除瀏覽器的Cookie
- Postman快速獲Chrome取瀏覽器產生的請求
- Postman分析Headers中需要驗證的內容(Cookie只是其中之一)
- Postman導出Request代碼
- Selenium獲取cookie的方法
清理瀏覽器Cookie
Chrome打開某個網站后你會看到左上角有一個小鎖,點擊后刪除所有Cookie信息,如下面的GIF所示:
F12開發者模式獲取瀏覽器的請求信息
在訪問某個網站過程中,會附帶很多請求,包括js、ajax、api接口的請求等
要點:
- 注意勾選Preserve log,不然每次頁面刷新,記錄會被刪除
- 可以嘗試使用Filter那個框的功能,在Preserve log的最左邊附近
首次登陸和非首次登陸的分析
基本了解刪除Cookie和F12開發者模式后,我們來分析下首次登陸和第二次登陸的區別
按刪除步驟刪除Cookies后,關閉瀏覽器,再目標網站觀察下:
要點:
- 小鎖中的Cookie信息又恢復了(圖中有19個,具體怎么來有興趣自己可以分析下)
- Request請求中沒有Cookie信息,Response回應中右Set-cookie的信息
- 出現了選擇一個城市(這個信息是記錄再Cookie中的)
再次提醒:勾選Preserve log后,再次訪問目標網站,通過filter過濾需要的信息
要點(對比兩次請求的區別):
- 第一次:Request沒有cookie,Response中有Set-cookies
- 第二次:Request有cookie,Response沒有Set-cookies
結論:我們首次訪問網站,網站會發一個set-cookie的回應,讓我們第二次訪問的時候帶上身份信息去請求目標網站,往往很多時候我們的想要的數據不在目標網站的首頁,可能是一個API接口的請求,可能是目標網站的某個子目錄,雖然訪問首頁會帶一個set-cookie的回應給你,但是非首頁的請求就沒有那么友善了,給你的可能是一個空回應甚至把你的請求拒之門外(往下看會有分析)
Postman快速獲Chrome取瀏覽器產生的請求
這個功能是為了快速獲取我們的請求(包括Headers和Cookies),不需要手動到Postman去添,首先我們看看功能按鍵在哪里,然后將它們開啟(如果不知道軟件在哪里安裝自己Google一下就可以了)。
要點:
- 圖中標識的兩個位置記得設置為on
- 如果記錄太多影響分析,刪除下歷史記錄
瀏覽器直接訪問目標網站,你會看到所有的請求都會出現到History的標簽中,通過篩選按鈕獲取你想要的請求,為了更好分析上面所說的攔截問題,我拿了一個API接口的請求作為本次分析的目標。
這個鏈接是我多次分析目標網站后,發現每次搜索python工作崗位時候,瀏覽器向服務器發送的一個請求,Response回應中的是崗位的詳細信息(Json格式)。如圖:
要點:
- 使用過濾獲取到自己想要的網址
Postman分析Headers中需要驗證的內容
接下來正式開始,我做一個大膽的測試,刪掉所有的Headers,看看請求的結果
要點:
- 你要相信你的眼睛,沒錯結果還是請求成功了
當你在懊惱為什么的時候,我又要來一個Gif了
循環播放的,簡單說下Gif操作步驟和預期結果:
- 直接訪問發送API請求(成功返回數據)
- 刪除瀏覽器中記錄的Cookies,再次發送發送API請求(沒有數據,或者是攔截網站)
- 復制URL到瀏覽器中,查看結果(攔截網站)
仔細看,仔細看~~~
總結:哈哈,其實就是一個簡單的道理Postman會使用瀏覽器記錄的Cookie,所以在每次測試的時候(包括Postman請求成功以后也會存到瀏覽器中),先刪除掉瀏覽器的Cookie再做測試。
另外,針對目標網站我分析結果是:多個網站的分析后,我只會保留User-Agent和Cookie這兩個Headers,最后Cookie驗證只需user_trace_token=20170511230425-b1fa946e4c77442498aac65a98153141(授人以魚不如授人以漁,過程不詳解,自己去嘗試吧)
Postman導出Request代碼
步驟:
- Send按鈕下面的那個Code
- 選中Python Requests
- 復制代碼到IDLE中就能使用(前提是分析到對的Headers)
Selenium獲取cookie的方法
最后付上一段selenum獲取cookie的方法,詳細Selenium的使用這里不介紹了~~~
import requests
from selenium import webdriver
driver = webdriver.Chrome() # 指定使用的Webderiver,這里使用的是Chrome的
driver.get("https://www.lagou.com") # 目標網址
# 獲得cookie信息
# print driver.get_cookies()
# print type(driver.get_cookies())
cookie_tag = driver.get_cookies()[3]["value"] # 這里的代碼可能有問題,自己改一下
driver.close() # 關閉瀏覽器
print cookie_tag
url = "https://www.lagou.com/jobs/positionAjax.json"
querystring = {"city": "廣州", "needAddtionalResult": "false", "kd": "python", "pn": "{0}".format(1)}
headers = {
'user-agent': "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0",
'cookie': "user_trace_token={0};".format(cookie_tag)
}
response = requests.request("GET", url, headers=headers, params=querystring)
print response.text
代碼分析:
- webdriver.Chrome():此處需要下載一個Chrome的webdriver
- get_cookies() :獲取到所有的cookies,然后按需提取(代碼中的提取可能有問題)
以上都是我的跟人觀點,如果有不對,或者有更好的方法,歡迎留言指正~~~