1. 程式人生 > >Python模擬登入淘寶

Python模擬登入淘寶

最近想爬取淘寶的一些商品,但是發現如果要使用搜索等一些功能時基本都需要登入,所以就想出一篇模擬登入淘寶的文章!

看了下網上有很多關於模擬登入淘寶,但是基本都是使用scrapy、pyppeteer、selenium等庫來模擬登入,但是目前我們還沒有講到這些庫,只講了requests庫,那我們今天就來使用requests庫模擬登入淘寶!

講模擬登入淘寶之前,我們來回顧一下之前用requests庫模擬登入豆瓣和新浪微博的過程:這一類模擬登入是比較簡單的登入,只需要在請求登入時將使用者名稱和密碼上傳驗證通過就成功了,也就是說一步到位!

而淘寶登入就比較複雜,為什麼說複雜呢?因為淘寶登入涉及引數多且請求不止一次!我們就先來講講淘寶登入的流程,先把流程原理搞懂,再去敲程式碼,這樣大家就容易理解!

一、淘寶登入流程

為了便於大家理解,豬哥畫了一個非標準的淘寶登入請求時序圖

淘寶ua引數:ua(User-Agent)故名使用者代理,淘寶的ua引數加入了瀏覽器、ip、電腦、時間等資訊,然後加密生成,在很多地方使用,不僅僅是登入!

上圖是比較詳細的流程圖,從程式碼層面考慮豬哥將模擬登入淘寶分為以下四個步驟:

  1. 輸入使用者名稱後,瀏覽器會向淘寶(taobao.com)發起一個post的請求,判斷是否出現滑塊驗證!
  2. 使用者輸入密碼後,瀏覽器向淘寶(taobao.com)又發起一個post請求,驗證使用者名稱密碼是否正確,如果正確則返回一個token。
  3. 瀏覽器拿著token去阿里巴巴(alibaba.com)交換st碼!
  4. 瀏覽器獲取st碼之後,拿著st碼獲取cookies,登入成功

這裡也許有同學會提出疑問:為什麼淘寶(taobao.com)驗證通過之後還要拿著 token去阿里巴巴(alibaba.com)交換st碼呢? 這個我們放後面講!

二、模擬登入實現

上面我們只講了大概的登入流程,這裡豬哥會先詳細講解下每一步的操作,然後再貼出實現程式碼!

1.判斷是否需要驗證碼

目前我們在登入淘寶的時候,大多數情況下是不會出現滑塊驗證碼,豬哥嘗試了很多次的登入退出也只是在中間出現過一次,那究竟是什麼在控制是否需要滑塊驗證碼的呢?

從上圖可以看出,當豬哥輸入使用者名稱後,瀏覽器就會發起一個post請求,來驗證是否需要出現滑塊驗證碼,如果返回true,滑塊驗證碼則出現!否則不出現,一般是不會出現!

圖中我們可以看到這次post請求上傳了兩個引數:username、ua!

前面豬哥說過ua為瀏覽器、ip、裝置資訊等多資訊加密引數,所以豬哥猜想淘寶的驗證碼是否出現不僅僅從賬號角度,還有ip、裝置等角度!

舉個例子:某臺裝置可能出現登入過大量的賬號,這時候淘寶就可以從ua引數中獲取裝置號,然後對該裝置進行限制!

知道了流程和請求連結及引數之後,我們就可以用程式碼來請求了!

2.驗證使用者名稱密碼

這裡一步也就是上面時序圖圖中的第5步:請求登入,這裡會將使用者名稱、ua引數、加密密碼等30十幾個引數post到淘寶(taobao.com)去驗證。

我們來用程式碼實現一下,大家別被這麼多引數嚇到,都是從瀏覽器複製過來的!

看看請求結果!

可以看到申請st碼連結後面帶了一個token,具體token是幹什麼用的後面我們再分析!

3.申請st碼

上面我們已經申請到了淘寶(taobao.com)的token,這一步就是用token來換取st碼。

到這裡很多人可能會有疑問:為什麼淘寶登入需要這麼麻煩呢?直接在 taobao.com 登入不就可以嗎?為什麼要先在taobao驗證使用者名稱密碼,通過之後再去 alibaba.com 換取st碼登入呢?

任何公司的框架都是慢慢演變的結果,我想最開始的淘寶登入肯定沒這麼複雜。但是隨著阿里巴巴的慢慢壯大,很多事業線都劃分開來,但是這些事業線之間又有關聯性,比如使用者登入了淘寶賬號之後天貓就不需要再登入了呢?(注意淘寶和天貓的頂級域名不同,所以不能共享cookis)為了解決這個問題,單點登入就出現了。

單點登入(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。 ——百度百科

很多大企業幾乎都有做單點登入,那阿里的單點登入系統肯定是由母公司阿里巴巴(alibaba.com)來做啦,所有子公司去呼叫母公司介面!

我們再回來分析淘寶登入為何要如此複雜就很好理解了:使用者資料在淘寶這裡,所以需要現在淘寶(taobao.com)驗證使用者名稱和密碼,驗證通過生成一個token,瀏覽器拿著token去和阿里巴巴(alibaba.com)申請單點登入碼(st碼),阿里巴巴收到請求驗證token通過則返回st碼,所以用token換st碼的原因就在於單點登入!

理解了設計原理之後,程式碼實現起來就很清晰了!

4.使用st碼登入

成功獲取st碼之後我們就可以來登入了,這一步是通過st碼獲取登入的cookies。

到這裡我們就已經模擬登入淘寶成功了!

5.獲取淘寶暱稱

其實上面我們就已經登入淘寶成功並返回使用者主頁的連結,我們為了進一步驗證登入成功,就請求一下淘寶使用者主頁,順便把淘寶暱稱提取出來吧!

三、總結

整體講完之後我們來稍微總結一下吧,主要從程式碼結構和存在的問題兩個方面說下:

1.程式碼結構

來放出一張程式碼結構圖,讓大家直觀瞭解

這就是我們前面說過的模擬登入淘寶的四個步驟,不過這裡我們是用程式碼實現了!

2.存在問題

在寫這篇教程之前豬哥也是先在網上了解,然後自己用瀏覽器和抓包工具(Charles)一步一步實踐,最重要的是你先要了解淘寶登入的大概流程,不然你實際操作起來會一頭霧水,下面就要講講目前遇到的問題和存在的問題吧

  1. 首先第一個問題便是淘寶的滑塊解鎖,目前requests還沒有很好的破解辦法,後面介紹了一些爬蟲框架之後我們再來破解吧!
  2. 豬哥嘗試了很多次(50次以上)登入退出都沒出現過滑塊驗證碼。
  3. 網上有人使用代理ip,這裡豬哥也沒用,只要你不是超級超級超級頻繁且大量爬取資料,一般大廠都不太會去封ip,因為有誤傷率和影響使用者面太廣,也許一封就是整個小區。
  4. 在第二步驗證使用者名稱和密碼時,上傳了近30個引數,如果你把username、ua、加密密碼複製進去驗證還是不通過可嘗試把那30個引數換成你瀏覽器中的!
  5. 在第三步和第四步偶爾會出現一次錯誤,重試一下就可以!

看到這裡是不是感覺淘寶模擬登入就清晰明瞭很多了,感興趣的同學可以收藏轉發,週末有空自己嘗試一下。征服淘寶登入,其他登入也就相對簡單了!

原始碼地址:關注微信公眾號「裸睡的豬」,回覆:模擬登入淘寶