Growth Hacker 奇技淫巧一則:零受權,抓取新浪微博任何用戶的微博內容

有時或基於如下凡此種種需求,咱們會想要去抓取新浪微博的內容:跨域

  • 產品冷啓動,導入外部數據,而非從頭積累;
  • 經過大數據+語義分析獲取用戶興趣行爲偏好,提供智能推薦;
  • 監控微博輿情,對特定關鍵詞或是用戶行爲進行響應;etc

想必新浪深知微博內容自己是最其有價值的資產,一旦被競爭對手大批量抓取導入,則辛苦創建起的門檻將瞬間化做他人之嫁衣,所以作了很是繁複的安全保護,包括強制登陸跳轉認證、跨域檢測、cookie 植入、禁止帳號密碼登陸而啓用 OAuth2.0 等等。瀏覽器

近期我的有一些抓取需求,在查詢大量過期的網絡資料測試無果後,決定另闢蹊徑完成這一目標,並最終測試成功。在此分享出來。(這篇文章將提供解決問題的方法思路,但不會給出具體代碼。伸手黨請移步百度或 Github。)安全

你須要準備:一個我的微博帳號,咱們將透過它去訪問其餘用戶頁面,從而抓取。除此以外,別無所求。 服務器

解題思路:cookie

1.最初我從微博 Web 版入手,發現即便是瀏覽器中可正常查看的內容,若直接經過 PHP 的 curl 或者 file_get_contents 讀取,也沒法直接取得,而是讀取到一串 js 代碼,做用是跨域判斷+cookie判斷+header跳轉。料想要模擬的請求和一重重越過的限制定會不少。網絡

2.轉換思路,既然微博的 Web 版限制不少,那就從移動版下手(移動網頁 weibo.cn,而非指移動 App)。移動版礙於手機機能的限制,身份驗證要求會下降不少。通過實驗,微博移動版的展現規則是:加V用戶、微博廣場,可直接訪問其頁面;普通用戶,則必須登陸才能看到。而斷定當前登陸用戶身份的標識,則應該是手機瀏覽器自己存儲的 cookie 與服務端的某個 session 比對。session

3.因爲我須要獲取普通用戶的微博內容,所以還要想辦法繼續繞。你固然能夠每次直接模擬用戶登陸,但相對繁瑣,我但願能一勞永逸。既然移動版的身份斷定很大程度上依賴手機瀏覽器 cookie,而通常瀏覽器 cookie 不那麼容易取,且某些土鱉機型連 cookie 都沒法記錄(號稱 1.3 億月活躍用戶的上市公司必定會照顧窮苦大衆的),那麼微博必定提供了其餘退而求其次的解決方法。因而我注意到了登錄框下的「記住登陸狀態,需支持並打開手機的cookie功能。」選項。curl

Screen Shot 2014-05-08 at 5.47.19 PM

See?默認是勾上的,也便是說微博團隊主觀上是但願用戶勾上這個,從而藉助 cookie 判斷來提升登陸安全性的。測試

我遂果斷取消勾選該選項,輸入任何一個本身的微博帳號密碼,點擊登陸。大數據

4.值得注意的狀況出現了:登陸時的驗證網頁走的是 newlogin.sina.cn,而非勾選狀態下會走的 login.sina.cn。說明此種狀況下,登陸驗證的確是進行了特殊的處理,從而讓沒有開啓 cookie 功能的手機也能被斷定爲登陸。

查看跳轉頁面的源代碼,發現有以下一行:

若是沒有自動跳轉,請<a href="http://weibo.cn/?s2w=login&amp;gsid=4uwc8bfa1vnw8ivzI9gUd706F3W&amp;vt=4">點擊這裏</a>

注意這個 gsid 參數,料想它就是斷定本地用戶身份的標識,因而整個提取出來(爲了個人帳號安全,我對這個案例中的 gsid 作了修改,大家直接照搬是沒法成功的,仍是本身跑一遍登陸流程吧)。

Screen Shot 2014-05-08 at 5.56.30 PM

5.最精彩的狀況來了。爲了驗證咱們能不能憑這一串 gsid 僞造登陸後的身份,我開啓 Chrome 的隱身模式,隨便找了一個正常狀況下必須登陸才能看到頁面的非加V用戶,而後在地址欄後面加上了 gsid 參數,URL 整個變成:

http://weibo.cn/u/1665167973?vt=4&st=7fe6&gsid=4uwc8bfa1vnw8ivzI9gUd706F3W

(固然這裏的 gsid 我也作了改動,只是做爲演示,實際 gsid 還請自行得到)

直接回車!擦,雖然此前沒有執行過登陸動做,可是已經以登陸後的的身份在看他的頁面內容了喲。這樣,我就能夠直接憑藉上述固定 URL 去爬去用戶的內容。

Screen Shot 2014-05-08 at 6.01.28 PM

(上圖中的「咱們都關注XDash」,你就能夠知道當前是登陸狀態,取到了用戶身份的。事實上的確如此。)

背後原理應該是,以 GET 方式在 URL 中發送了本地登陸後的身份標識,微博服務器比對這串標識來斷定對應的登陸用戶身份,而後返回到本地,本地因而就以這個用戶身份登陸,冠冕堂皇地獲取數據了。(大一的時候我曾參與過一個基於 ASP 的校園社區的開發,閱讀了帝國 CMS 的代碼,那時候對於手機用戶的身份認證就是這麼原始噠。)

如今想要的一覽無餘了,接下來...Hulk,smash!

hulksmash

微博手機版,阿喀琉斯的腳後跟。

相關文章
相關標籤/搜索