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

最近需要爬取微博的數據進行分析,對於新浪微博,官方提供了API,但是有幾個比較致命的限制(調用次數限制和授權期限限制),所以我覺得有必要研究一下爬蟲直接爬去微博的方式獲取微博數據的可行性。
由於模擬登陸微博是爬蟲爬取微博信息的第一步,所以在這裏先介紹一下怎麼模擬登陸微博(以下以新浪微博爲例)。
此過程主要分兩步:
1 腳本模擬登陸新浪微博,保存cookie;
2 有了cookie信息後,利用cookie信息直接訪問微博url。
其中,第一步是這裏討論的重點。要想能更好的模擬這一步,一個好的網絡監視工具是必須的,可以使用Firefox的Firebug和Chrome及IE自帶的開發工具(注意下,IE必須IE9以上版本纔有監視網絡的功能,Chrome的網絡交互報文可以到network部分查看)。此外,前兩天發現python支持的包比較多,用python定製自己的網絡報文比較方便,所以此處我就採用python作爲我的開發語言了。

好了,前提工作先說到這裏,下面開始分析一下用戶在登陸sina微博的過程中都進行了那些操作。下面的例子中我使用的是chrome自帶的開發者工具作爲我的網絡報文監視工具的。
首先,打開http://weibo.com/(如果你以前設置過讓瀏覽器自動記住密碼並自動登陸,你需要清楚一下cookie),之後通過網絡監視工具,我們會發現在用戶登錄過程中,瀏覽器與服務器有三次交互,分別如下:
一、第一次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串,也許你還不瞭解他們的意義,不過沒關係,現在你只需要知道這些參數在後續處理中我們會使用到就可以。
二、發送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)

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

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

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

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


如果以上各步你都進展的比較順利的話,你會得到如下響應:
新浪微博自動(模擬)登陸詳解及實現 - Lendfating - Lendfating
這是一條自動跳轉語句,裏面包含了準備跳轉的URL,如果正確登陸,則這個URL中德retcode的值爲0,否則登陸錯誤,你需要仔細檢查上面的步驟。
三、跳轉到對應微博頁面
上面我們已經得到了待跳轉的url,所以現在只需請求這個URL即可。在這裏有一點需要注意一下,要想服務器知道你是否登陸,這一步的請求需要用到前面操作的cookie信息(因爲第二步中登陸成功與否的信息會自動記錄在cookie中),所以我們在整個程序的一開始要打開cookie,保證以後的操作都能正確的使用cookie,同時,對於python的用戶,這一步就不要自己去定製header了,因爲在默認情況下urllib2會自動打包cookie信息的如果人爲去定製header時可能會漏掉cookie信息。

下面附上我的參考代碼:https://github.com/Lendfating/SinaLogin.git

參考文章:

2、http://hi.baidu.com/enmzqbeadvfhiye/item/4018b4e7775cd3edfa42bad3

轉載:http://lendfating.blog.163.com/blog/static/1820743672013285253844/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章