1. 程式人生 > >最新requests模擬百度登入的乾貨

最新requests模擬百度登入的乾貨

前言
百度的模擬登陸網上有很多的教程,大家可以看下.幾乎所有的教程都是到error_no=0,就說已經登入成功了.關於這個問題我開始也以為是這樣的,不過自己最近在一次嘗試登入百度網盤的時候發現,僅僅是error_no=0,是無法登入到百度的任何產品的.很多文章誤人太深

在這裡就不得不說一下python requests的session了

requests的session在一定的程度上可以很好的管理cookies,但是他是不完美的,我目前使用的是Python2,很多的時候requests的session不能很好的管理登入的cookies

說一下百度網盤的登入:

正常的最後的一個post到https://passport.baidu.com/v2/api/?login

傳送後會返回一個js,使用正則去提取這個js中的url,再次傳送,會接著返回一段js,這一段js對於使用requests的爬蟲的話沒有什麼作用.

然後網頁端網盤會跳到https://pan.baidu.com/disk/home這裡,這裡就會結果3次的重定向,才會到登入的home頁上去,沒有這一步,即使是error_no=0,也無法登入到百度的相關產品上去的

GET https://pan.baidu.com/disk/home

第一次重定向:

 url = "https://passport.baidu.com/v3/login/api/auth/"
 querystring = {"return_type": "5", "tpl": "netdisk", "u": "https://pan.baidu.com/disk/home"}

如果是預設的cookie的話,不會得到302的重定向網址,返回的結果是,頁面訪問錯誤
因為這裡的一次請求使用的是一個過期的cookies,如果使用requests的session去請求,是得不到正確的跳轉的,至於是哪一個cookie,大家可以自己分析,這裡不表.

第二次重定向:

 https://pan.baidu.com/disk/home?errno=0&errmsg=Auth Login Sucess&stoken=6Hw4OkYaALOh2vz3GlmZ6vkmGvuq454Cyk8c2Z6Q2a2B7olL2PYw1dfz5j+7QFluhqxKLYr/NR2b7BN9so0STyJJ3fCnxoc/pLbJM8Tue1XVIgrHVMai1zdm6a9JoYBl/1Fq1xgyre+LXDYpnM+esZ2iLg/5Dg0MdnAEJfWtW3Ne2xnssdmDDogRl2ABq/Zpk6DAQX5DU7QMn9pVy/PkB1QYpe+zHfzIfQynncpeIbHpDXdHYOaxO7a59iBQI5T90XFrHf7Av6700Y7ZLjLKUqw==&bduss=&ssnerror=0&traceid= 

這一步需要手動提取出重定向的url,response.headers['Location'],url中有一個加密的stoken是伺服器返回的
這一步就有點意思了,限制了帶上的cookies的數量,如果帶上的的cookies多了,會導致請求得不到正確的結果,在這裡requests的session就有些智障了,沒有關係,找到那幾個cookie不難,模擬一下

最終的重定向:

https://pan.baidu.com/disk/home?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0&traceid= 

這是第三次的重定向的url,基本是最後的home頁了,到了這一步才是完整的登入了百度網盤了,判斷是不是登入成功的話,找一下bdstoken,任何的網盤使用者有唯一bdstoken值,如果能找到說明登入成功了

結語:
很多的登入反爬會在最後的重定向上面做文章,相比的話,百度的登入還算是比較簡單的,所需的引數,js加密的也不是很難,只是需要耐心的分析