新浪微博自動(模擬)登錄詳解及實現

最近須要爬取微博的數據進行分析,對於新浪微博,官方提供了API,可是有幾個比較致命的限制(調用次數限制和受權期限限制),因此我以爲有必要研究一下爬蟲直接爬去微博的方式獲取微博數據的可行性。php

       因爲模擬登錄微博是爬蟲爬取微博信息的第一 步,因此在這裏先介紹一下怎麼模擬登錄微博(如下以新浪微博爲例)。
       此過程主要分兩步:
           1  腳本模擬登錄新浪微博,保存cookie;
           2  有了cookie信息後,利用cookie信息直接訪問微博url。
      其中,第一步是這裏討論的重點。要想能更好的模擬這一步,一個好的網絡監視工具是必須的,可使用Firefox的Firebug和Chrome及IE自 帶的開發工具(注意下,IE必須IE9以上版本纔有監視網絡的功能,Chrome的網絡交互報文能夠到network部分查看) 。此外,前兩天發現python支持的包比較多,用python定製本身的網絡報文比較方便,因此此處我就採用python做爲個人開發語言了。
 
      好了,前提工做先說到這裏,下面開始分析一下用戶在登錄sina微博的過程當中都進行了那些操做。下面的例子中我使用的是chrome自帶的開發者工具做爲個人網絡報文監視工具的。
      首先,打開 http://weibo.com/(若是你之前設置過讓瀏覽器自動記住密碼並自動登錄,你須要清楚一下cookie),以後經過網絡監視工具,咱們會發如今用戶登陸過程當中,瀏覽器與服務器有三次交互,分別以下:
1、第一次Get請求獲取一些參數
      在用戶名一欄輸入你的微博帳號,而後肯定,這時你會發現,當你的焦點離開用戶名輸入框以後,瀏覽器會自動向 「http://login.sina.com.cn/sso/prelogin.php?entry=weibo& callback=sinaSSOController.preloginCallBack&su=&rsakt=mod& checkpin=1&client=ssologin.js(v1.4.5)&_=1362808219583」發送一個GET請求, 以下:
新浪微博自動(模擬)登錄詳解及實現 - Lendfating - Lendfating 新浪微博自動(模擬)登錄詳解及實現 - Lendfating - Lendfating
       仔細查看這一個GET請求的響應內容,你會發現這個包含幾個參數的JSON串,也許你還不瞭解他們的意義,不過不要緊,如今你只須要知道這些參數在後續處理中咱們會使用到就能夠。
2、發送POST請求
       這一部分是整個登錄過程的重點。該部分用來提交用戶信息給服務器並由服務器判斷用戶信息是否正確,從而判斷是否登錄成功。
       經過Chrome自帶的開發者工具,能夠觀察POST報文的相關信息(url、headers、data),下圖是個人POST信息的截圖:
        URL信息以下:
新浪微博自動(模擬)登錄詳解及實現 - Lendfating - Lendfating
        報文Headers信息以下:
新浪微博自動(模擬)登錄詳解及實現 - Lendfating - Lendfating
          POST的報文數據信息以下:  
新浪微博自動(模擬)登錄詳解及實現 - Lendfating - Lendfating
         接下來的工做就比較簡單了,咱們要作的就是仿照上面的報文內容及格式,用python發送一個相似的報文便可。在本身定製相似報文以前,我以爲有必要對上面報文中DATA表單中每一項的意義進行如下簡單說明。
      其中, 「su" 是加密後的username,"sp"是加密後的password。"servertime"、」nonce"和"rsakv"是上一步GET請求返回的 JSON串中的內容。其餘參數是不變的。而後,着重介紹一下"su"和"sp"的加密算法。
      1. "su"的加密算法
           su是username通過BASE64計算得來的:su = base64.encodestring( urllib.quote(username) )[:-1];
      2. "sp"的加密算法
           sp的加密算法可能會常常變更(考慮到網站的安全,過一段時間變更一下登錄的報文格式與加密算法是很正常的),目前新浪採用的是RSA算法(若是你js比較牛的話,能夠直接去找網頁源代碼查找其加密方法,我是沒找到,參考的網上的)。
           在這裏簡單介紹一下RSA算法的解密過程。
                 2.1  安裝RSA模塊,下載地址爲: https://pypi.python.org/pypi/rsa/3.1.1
                 2.2   建立一個rsa公鑰,公鑰的兩個參數新浪微博都給了是固定值,不過給的都是16進制的字符串,第一個是登陸第一步中的pubkey,第二個是js加密文件中的‘10001’。 這兩個值須要先從16進制轉換成10進制,不過也能夠寫死在代碼裏。我就把‘10001’直接寫死爲65537

rsaPublickey = int(pubkey, 16)python

key = rsa.PublicKey(rsaPublickey, 65537) #建立公鑰git

message = str(servertime) + '\t' + str(nonce) + '\n' + str(password)#拼接明文 js加密文件中獲得github

passwd = rsa.encrypt(message, key)#加密算法

passwd = binascii.b2a_hex(passwd) #將加密信息轉換爲16進制。chrome

                 

      若是以上各步你都進展的比較順利的話,你會獲得以下響應:
新浪微博自動(模擬)登錄詳解及實現 - Lendfating - Lendfating
      這是一條自動跳轉語句,裏面包含了準備跳轉的URL,若是正確登錄,則這個URL中德retcode的值爲0,不然登錄錯誤,你須要仔細檢查上面的步驟。
3、跳轉到對應微博頁面

      上面咱們已經獲得了待跳轉的url,因此如今只需請求這個URL便可。在這裏有一點須要注意一下,要想服務器知道你是否登錄,這一步的請求須要用到前面操 做的cookie信息(由於第二步中登錄成功與否的信息會自動記錄在cookie中),因此咱們在整個程序的一開始要打開cookie,保證之後的操做都 能正確的使用cookie,同時,對於python的用戶,這一步就不要本身去定製header了,由於在默認狀況下urllib2會自動打包 cookie信息的若是人爲去定製header時可能會漏掉cookie信息。瀏覽器

 
下面附上個人參考代碼: https://github.com/Lendfating/SinaLogin.git
 
參考文章:
來自:http://lendfating.blog.163.com/blog/static/1820743672013285253844/
相關文章
相關標籤/搜索