天天看點

requests子產品的使用(三)

1.使用requests處理cookie相關的請求

1.1 回顧cookie和session的差別

  • cookie資料存放在客戶的浏覽器上,session資料放在伺服器上。
  • cookie不是很安全,别人可以分析存放在本地的cookie并進行cookie欺騙。
  • session會在一定時間内儲存在伺服器上。當通路增多,會比較占用你伺服器的性能。
  • 單個cookie儲存的資料不能超過4K,很多浏覽器都限制一個站點最多儲存20個cookie。

1.2 爬蟲中為什麼要使用cookie

  • 帶上cookie的好處
    • 能夠通路登入後的頁面
    • 正常的浏覽器在請求伺服器的時候肯定會帶上cookie(第一次請求某個位址除外),是以對方伺服器有可能會通過是否攜帶cookie來判斷我們是否是一個爬蟲,對應的能夠起到一定的反爬的效果
  • 帶上cookie的壞處
    • 一套cookie往往對應的是一個使用者的資訊,請求太頻繁有更大的可能性被對方識别為爬蟲
    • 那麼上面的問題如何解決? 使用多個賬号.

1.3 requests處理cookie相關的請求之session

  • requests 提供了一個叫做session類,來實作用戶端和服務端的會話保持
  • 會話保持有兩個内涵:
    • 儲存cookie
    • 實作和服務端的長連接配接
  • 使用方法

    session = requests.session()

    response = session.get(url,headers)

    session執行個體在請求了一個網站後,對方伺服器設定在本地的cookie會儲存在session中,下一次再使用session請求對方伺服器的時候,會帶上前一次的cookie
  • 動手:

    動手嘗試使用session來登入人人網: http://www.renren.com/PLogin.do(先不考慮這個url位址從何而來),請求體的格式:{“email”:“username”, “password”:“password”}

1.4 requests處理cookie相關的請求之cookie放在headers中

了解headers中cookie

requests子產品的使用(三)
  • headers中的cookie:
    • 使用分号(;)隔開
    • 分号兩邊的類似a=b形式的表示一條cookie
    • a=b中,a表示鍵(name),b表示值(value)
    • 在headers中僅僅使用了cookie的name和value

cookie的具體組成的字段

requests子產品的使用(三)

由于headers中對cookie僅僅使用它的name和value,是以在代碼中我們僅僅需要cookie的name和value即可

在headers中使用cookie

headers = {
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Cookie":" Pycharm-26c2d973=dbb9b300-2483-478f-9f5a-16ca4580177e; Hm_lvt_98b9d8c2fd6608d564bf2ac2ae642948=1512607763; Pycharm-26c2d974=f645329f-338e-486c-82c2-29e2a0205c74; _xsrf=2|d1a3d8ea|c5b07851cbce048bd5453846445de19d|1522379036"}

requests.get(url,headers=headers)
           

cookie有過期時間,是以直接複制浏覽器中的cookie可能意味着下一程式繼續運作的時候需要替換代碼中的cookie,對應的我們也可以通過一個程式專門來擷取cookie供其他程式使用;當然也有很多網站的cookie過期時間很長,這種情況下,直接複制cookie來使用更加簡單

1.5 requests處理cookie相關的請求之使用cookies參數

  • cookies的形式:字典
cookies = {“cookie的name”:“cookie的value”}
  • 使用方法:
requests.get(url,headers=headers,cookies=cookie_dict}

2.人人網登入之js分析流程

2.1 人人網登陸過程中url位址哪裡找?

在前面的人人網登陸過程中,我們找到了一個登陸接口,那麼這個接口從哪裡找到的呢?

requests子產品的使用(三)

可以發現,這個位址就是在登入的form表單中action對應的url位址,回顧前端的知識點,可以發現就是進行表單送出的位址,對應的,送出的資料,僅僅需要:

使用者名的input标簽中,name的值作為鍵,使用者名作為值,密碼的input标簽中,name的值作為鍵,密碼作為值即可

2.2 如果action對應的沒有url位址的時候可以怎麼做?

2.2.1 通過抓包尋找登入的url位址
requests子產品的使用(三)

通過抓包可以發現,在這個url位址和請求體中均有參數,比如

uniqueTimestamp

rkey

以及加密之後的

password

這個時候我們可以觀察手機版的登入接口,是否也是一樣的

requests子產品的使用(三)

可以發現在手機版中,依然有參數,但是參數的個數少一些,這個時候,我們可以使用手機版作為參看,來學習如何分析js

3. js分析之檢視js的位置

3.1 觀察按鈕的綁定js事件

requests子產品的使用(三)

通過點選按鈕,然後點選

Event Listener

,部分網站可以找到綁定的事件,對應的,隻需要點選即可跳轉到js的位置

3.2 通過search all file 來搜尋

部分網站的按鈕可能并沒有綁定js事件監聽,那麼這個時候可以通過搜尋請求中的關鍵字來找到js的位置,比如

livecell

requests子產品的使用(三)

點選美化輸出選項

requests子產品的使用(三)

可以繼續在其中搜尋關鍵字

requests子產品的使用(三)

3.3 js分析之觀察js的執行過程

找到js的位置之後,我們可以來通過觀察js的位置,找到js具體在如何執行,後續我們可以通過python程式來模拟js的執行,或者是使用類似js2py直接把js代碼轉化為python程式去執行

觀察js的執行過程最簡單的方式是添加斷點

requests子產品的使用(三)

添加斷點的方式:在左邊行号點選即可添加,對應的右邊BreakPoints中會出現現有的所有斷點

添加斷點之後繼續點選登入,每次程式在斷點位置都會停止,通過如果該行有變量産生,都會把變量的結果展示在Scoope中

在上圖的右上角有1,2,3三個功能,分别表示:

  • 1:繼續執行到下一個斷點
  • 2:進入調用的函數中
  • 3:從調用的函數中跳出來

4. 執行js

js也是一門動态的語言,是以在運作的時候需要js的解釋器,目前現有的類似js2py的工具都不是特别完善,對于簡單的js可以運作,但是複雜的是處理不了的

通過後面的接觸大家會發現,很多js都是進過混淆和加密的,即在js的源碼中我們會發現大量的命名為a,b,c,d的函數和變量,對于這種情況,如果必須去分析js,那麼肯定是非常頭大的,但是在後面的課程中,我們會學習通過程式其控制浏覽器的方式操作網頁、擷取資料,這個方法會更加簡單。是以在這裡我們需要掌握js的分析過程即可。