api 微博數據專題及常見問題 - CSDN

2021-01-09 CSDN技術社區

PS:(本人長期出售超大量微博數據、旅遊網站評論數據,並提供各種指定數據爬取服務,Message to YuboonaZhang@Yahoo.com。由於微博接口更新後限制增大,這個代碼已經不能用來爬數據了。如果只是為了收集數據可以諮詢我的郵箱,如果是為了學習爬蟲,建議改學phantomjs從網頁中爬取微博的)

利用新浪API實現數據的抓取(由於api接口限制增大,本文已基本廢棄)


2018.5.16 提示
微博的api接口現在已經不好用了,普通權限的token已經爬不到什麼數據了,想要用這個代碼爬大量數據的已經不太可能,只能作為熟悉微博api接口使用方法的一個小demo了。

2018.4.16 說明

注意:今天有人言語惡劣地評論我的博客是垃圾,說我的代碼有問題,這篇博客歷史久遠,是我初玩爬蟲寫的博客。我非常感謝能對我的代碼提出意見的人,但是出言不遜,態度惡劣的人我是忍受不了的,有話好好說,是一個現代社會高學歷高知識分子的最低覺悟。

代碼我已經改過了,如果還有問題非常歡迎大家來溫和地指出!!!!

同時,由於新浪微博本身api機制的不斷更改,到目前為止,這篇博客的內容已經有了局限,對於個人開發者來說,你申請到的token的權限只能爬你自己的微博,所以對於想要靠api來爬數據的人,恐怕可能並不能達成自己的目的了。想要用api來爬取微博內容只能選擇獲取更高的開發者權限了。

1. 首先來看看最後我們得到的是什麼結果,是不是你想要了解的東西,再決定是否往下讀。 



我主要抓取了大概4天的數據,圖上可以看的出來大概有360萬條數據,由於是在自己的電腦上爬取做數據的,有時候晚上斷網了就間斷了,所以大概一天可以爬取有100萬左右的最新微博數據(因為我調用的是最新的微博API public_timeline)

API文檔當中定義了很多返回的類型(以json數據格式返回,我選取了一些我認為重要的信息抓取下來如圖所示: 大概有id號所在位置粉絲數,發的微博內容,發微博的時間等等。 當然這些數據都可以根據自己的需要進行定製。)

大概就是這些內容,你如果認為這對你有點幫助,就請繼續讀下去… 第一次寫博客有些囉嗦2. 前期準備

我們需要的東西:

資料庫: mongodb(可以使用客戶端MongoBooster)開發環境: Python2.7(我用的IDE是Pycharm)一個新浪開發者帳號: 用自己的新浪微博帳號註冊就行(後面會講)需要的庫: requests和pymongo(這些都可以在Pycharm中下載)2.1 mongodb的安裝

MongoDB是一個高性能,開源,無模式的文檔型資料庫,是當前NoSql資料庫中比較熱門的一種。它在許多場景下可用於替代傳統的關係型資料庫或鍵/值存儲方式。Mongo使用C++開發。Mongo的官方網站地址是:http://www.mongodb.org/,讀者可以在此獲得更詳細的信息。

小插曲:什麼是NoSql?

  NoSql,全稱是 Not Only Sql,指的是非關係型的資料庫。下一代資料庫主要解決幾個要點:非關係型的、分布式的、開源的、水平可擴展的。原始的目的是為了大規模web應用,這場運動開始於2009年初,通常特性應用如:模式自由、支持簡易複製、簡單的API、最終的一致性(非ACID)、大容量數據等。NoSQL被我們用得最多的當數key-value存儲,當然還有其他的文檔型的、列存儲、圖型資料庫、xml資料庫等。

網上有很多安裝mongodb教程我就不寫了

Windows下mongodb的安裝

Linux下mongodb的安裝

2.2 新浪開發者帳號的註冊方法

  * 創建完畢需要填寫手機號驗證 *





初次創建應用需要填寫如下信息:

此頁面信息不需要填寫真實信息,如地區,電話,可隨意填寫。網站填https://www.baidu.com/即可。(郵箱要真實)

繼續創建應用。應用名稱自定義,平臺如下勾選 ios 、andrioid

創建完畢直接返回繼續創建,一個帳號可以創建10個應用,每個應用對應一個access-token(事實上我只用了一個就可以滿足需求)





依次選取創建的應用。點將下方的token用txt保存即可。

回到



點擊我的應用

然後選擇自己剛剛創建的應用

進入之後點擊應用信息

保存下 APP Key 和 APP Secret

點擊高級信息

設置回調網址

可以設置成默認的
http://api.weibo.com/oauth2/default.html

至此你的開發者帳號就已經完成了

2.3 依賴庫的安裝方法

requests和pymongo的安裝

可以直接用pip安裝
pip install requests 和 pip install pymongo

也可以在Pycharm裡面直接安裝

選擇File -> Settings -> Project -> Project Interpreter

可以看到自己安裝的Python庫,點擊右邊的綠色* + * 號

安裝即可

3. 分析問題 3.1 OAuth 認證

* 授權機制說明(很重要)*

網上很多講利用新浪微博API發送微博什麼的都是使用的請求用戶授權Token這種方式,但是這種方式顯然不適用於我們爬取數據,因為每次都要請求,每次都要重新獲取code。具體可參考新浪微博API的授權機制

廖雪峰老師(sinaweibopy 的貢獻者)也對這個授權機制有一個說明

通過新浪微博的API接入網站,由於用戶無需在您的網站上註冊,就可以直接?使用他/她在新浪微博的帳號和口令登錄您的網站,這就需要確保您的網站在無需知道,也不能知道用戶口令的情況下確認用戶已經登錄成功。由於用戶的口令存儲在新浪微博,因此,認證用戶的過程只能由新浪微博完成,但新浪微博如何與您的網站通信並告知您用戶是否登錄成功呢?這個過程稱之為第三方登錄,OAuth是一個標準的第三方登錄協議,藉助OAuth,您的網站就可以安全地接入來自新浪微博登錄成功的用戶。

OAuth目前主要有1.0和2.0兩個版本,2.0版對1.0版做了大量簡化,API也更簡單。新浪微博最新的API也是採用的OAuth 2.0,整個登錄流程如下:

用戶在您的網站上點擊「使用新浪微博登錄」,您的網站將用戶重定向到新浪微博的OAuth認證頁,重定向連結中包含client_id參數作為您的網站ID,redirect_uri參數告訴新浪微博當用戶登錄成功後,將瀏覽器重定向到您的網站; 用戶在新浪微博的認證頁輸入帳號和口令; 新浪微博認證成功後,將瀏覽器重定向到您的網站,並附上code參數; 您的網站通過code參數向新浪微博請求用戶的access token; 您的網站拿到用戶的access token後,用戶登錄完成。
OAuth的access token是提供認證服務的網站(例如新浪微博)生成的令牌,代表一個用戶認證信息。在隨後的API調用中,傳入該access token就代表這個登錄用戶,這樣,通過OAuth協議,您的網站將驗證用戶的步驟交給新浪微博完成,並由新浪微博告知您用戶是否登錄成功。

OAuth的安全性是通過步驟4完成的,通過code參數獲取access token的過程是您的網站後臺到新浪微博網站完成的,用戶無法看到獲取access token的HTTP請求。如果用戶傳入偽造的code,則新浪微博會返回一個錯誤。

具體內容請看廖雪峰老師的文檔

大致上來說按照一般的請求用戶授權Token調用會出現這種情況:



獲取code

登陸後會調轉到一個連接https://api.weibo.com/oauth2/default.html?code=×××××××× 

我們所需要的就是code=×××××××××× 的值

也就是說,每當你調用一次API認證在瀏覽器中都會出現一個code,這樣顯然不利於我們去爬取網站 

怎麼解決問題呢?首先我們想到的自然是在Python程序裡面模擬登錄新浪微博,然後自然可以獲取到code的值,但是,模擬新浪微博登錄相對來說比較複雜,而且既然都模擬登錄成功了,為啥還要調用API呢…直接自定義進行抓取不是更加方便。

如果看了上面的那個授權機制,就應該想到。這個時候就需要我們之前申請的access-token了

access-token 根據我的理解就是把你的微博授權給了第三方讓他幫你做一些事情,類似於在你的手機端通過新浪微博來登錄然後進行操作(利用上面授權機制裡面講的一句話來說就是)移動端應用可直接使用官方移動SDK,通過呼起微博客戶端(未安裝微博客戶端的會呼起H5授權頁)方式授權

這個界面你應該很熟悉

新浪也給出了說明Oauth2/access token

4. 代碼實現 

有了token之後,實現抓取數據就十分簡單了
能抓取數據的多少就取決於你的token權限了

接下來就是利用API來獲取數據了:新建一個文件weibo_run.py

import requestsfrom pymongo import MongoClientACCESS_TOKEN = '2.00ZooSqFHAgn3D59864ee3170DLjNj'URL = 'https://api.weibo.com/2/statuses/public_timeline.json'def run(): while True: params = { 'access_token': ACCESS_TOKEN } statuses = requests.get(url=URL, params=params).json()['statuses'] length = len(statuses) print length Monclient = MongoClient('localhost', 27017) db = Monclient['Weibo'] WeiboData = db['HadSelected'] for i in range(0, length): created_at = statuses[i]['created_at'] id = statuses[i]['user']['id'] province = statuses[i]['user']['province'] city = statuses[i]['user']['city'] followers_count = statuses[i]['user']['followers_count'] friends_count = statuses[i]['user']['friends_count'] statuses_count = statuses[i]['user']['statuses_count'] url = statuses[i]['user']['url'] geo = statuses[i]['geo'] comments_count = statuses[i]['comments_count'] reposts_count = statuses[i]['reposts_count'] nickname = statuses[i]['user']['screen_name'] desc = statuses[i]['user']['description'] location = statuses[i]['user']['location'] text = statuses[i]['text'] WeiboData.insert_one({ 'created_at': created_at, 'id': id, 'nickname': nickname, 'text': text, 'province': province, 'location': location, 'description': desc, 'city': city, 'followers_count': followers_count, 'friends_count': friends_count, 'statuses_count': statuses_count, 'url': url, 'geo': geo, 'comments_count': comments_count, 'reposts_count': reposts_count })if __name__ == "__main__": run()

剛開始我的代碼是這樣的,看起來已經完成了。

但是,因為新浪會限制你的調用次數,後來我試了一下重新運行,結果發現了一個問題,我之前的print length 出來的每行獲取值都不一樣,總是在16-20之間徘徊,這說明了我每次重新運行獲取的數據都不一樣.然後我想算了,乾脆寫個死循環看他什麼時候再被封吧。於是代碼就變成了下面這樣

把run()刪除,換成下面這個死循環。

if __name__ == "__main__": while 1:  try:  run() except: pass

結果他就一直運行下去了…運行了四天還沒有被封,估計是封不了了…

其他接口也是一樣使用,只用改變url和params就行,具體參數參照新浪微博API文檔

開始我發現一天可以獲取800萬的數據,把我給樂的…後來發現好多好多重複的數據。最後找了半天的解決方案,在mongodb中根據用戶的id和創建的時間這兩點建立索引(因為一個人不可能在同一時刻發送兩條微博),最後沒有重複數據大概一天可以獲取100萬條左右的信息。

個人博客

8aoy1.cn

相關焦點

  • 卡方檢驗結果分析專題及常見問題 - CSDN
    簡單統計之後,得到總數和死亡率:此處需要使用到ggbarstats函數,其參數可謂是非常的多,詳細的參數表我放在另一個博客中了,有興趣的朋友可以去看看(https://blog.csdn.net/m0_45248682/article/details/104086729)。
  • a標籤 href vue專題及常見問題 - CSDN
    第二步,獲取詳情數據,渲染頁面. 第三步,獲取詳情數據成功後再獲取微信籤名,token等配置信息. 第四步,通過api配置所想要的功能 代碼: 本文實例為大家分享了vue實現微信分享功能的具體代碼,供大家參考,具體內容如下 1.引入微信js 2.從後臺獲取籤名並分享 fenxiangFun(){//詳情分享 var that = this; this.
  • Python3調用新浪微博API抓取數據
    本文介紹基於Python3+通過調用新浪微博API方式採集用戶信息的案例。1.前期準備程式語言:Python3.0+下載庫:sinaweibopy3編輯軟體:Spyder2.獲取微博授權進入http://open.weibo.com/apps/new?sort=web獲取App Key以及App Secret。
  • f檢驗 matlab專題及常見問題 - CSDN
    Mann-Kendall顯著性檢驗工具:1、MATLAB2、DPS3、示例數據(數據採用的是魏鳳英老師《現代氣候統計診斷預測技術》中的1900-1990年上海市的年平均氣溫數據)Mann-Kendall原理可詳細參考https://wenku.baidu.com
  • websocket項目 搭建node專題及常見問題 - CSDN
    項目中使用的場景:帳戶掃碼登錄,微信掃碼授權,消息實時提醒,配置結果響應,客戶端同步數據。。。之前項目裡做即時通信都是用的輪循,輪詢的效率低,非常浪費資源,後面好幾個項目都開始用的websocket配合koa和redis來實現,現在整理整理深入了解下整個即時通信實現的過程。
  • python 顯著性水平專題及常見問題 - CSDN
    年度數據pisa.csv文件記錄了從1975年到1987年測量塔的傾斜,其中lean代表了偏離的角度。在這個任務,我們將嘗試使用線性回歸來估計傾斜率以及解釋其係數和統計數據。# 讀取數據import pandasimport matplotlib.pyplot as pltpisa = pandas.DataFrame({"year": range(1975, 1988),"lean": [2.9642, 2.9644, 2.9656, 2.9667, 2.9673
  • Rocket-API 2.3.2 發布,基於 spring boot 的 API 敏捷開發框架
    功能新增或修改: 遠程部署重複判斷 添加mongo對象操作函數 mapping路徑匹配修改,解決restful下路徑可能會匹配執行邏輯錯誤問題增加配置項 駝峰轉換配置 spring.rocket-api.map-underscore-to-camel-case: true 添加工具方法 Utils.loadAPI("GET:/test"),加載其他腳本 添加request,response變量域軟體介紹:
  • 新浪微博 API開發簡介之 Python篇
    【IT168 技術】與Twitter相比,新浪微博做得更好的地方是直接提供了SDK(Twitter貌似只有第三方的SDK)。而我自然是用Python SDK,一個只有幾十k的玩意。
  • ref vue 獲取文本專題及常見問題 - CSDN
    ref的官網介紹https://cn.vuejs.org/v2/api/#ref需求在普通的js操作中,一般都是直接操作dom元素,但是對於Vue.js框架來說,一般是不允許直接操作dom元素的。那麼其實Vue.js框架提供了ref獲取dom元素,以及組件引用。
  • android啟動頁設計專題及常見問題 - CSDN
    轉載請註明出處:http://blog.csdn.net/wangjihuanghun/article/details/63255144啟動頁幾乎成為了每個app的標配,有些商家在啟動頁中增加了開屏廣告以此帶來更多的收入。
  • 卡方檢驗相關性專題及常見問題 - CSDN
    那麼有一個問題:協方差數值大小是否代表了相關程度呢?也就是說如果協方差為 100 是否一定比協方差為 10 的正相關性強呢?假如X1、Y1 和 X2、Y2 分別聯合分布圖,如下所示:考察兩個變量的相關關係,首先得看清楚兩個變量都是什麼類型的,統計分析中常見的變量類型有連續型數值變量,無序分類變量、有序分類變量:連續型數值變量:如銷售額、氣溫、工資收入、考試成績;無序分類變量:如性別男和女,血型種類;有序分類變量:如學歷水平小學、初中、高中
  • python平穩性檢驗專題及常見問題 - CSDN
    二、代碼實現1、繪製時序圖,查看數據的大概分布trainSeting.head()Out[36]:date2017-10-01 126.42017-10-02 82.42017-10-03 78.12017-10-04 51.12017-10-05 90.9
  • android藍牙相關框架專題及常見問題 - CSDN
    2.1、四部分(client、service、bluetooth、settinglib)藍牙的代碼主要分為標題的四個部分2.1.1、client客戶端主要代碼是BluetoothAdapter,我們平時開發時都是通過操作BluetoothAdapter的公開api來實現我們的功能。
  • 大數據時代,統計學專題及常見問題 - CSDN
    機器學習 Machine Learning:提供數據分析的能力,機器學習是大數據時代必不可少的核心技術,道理很簡單:收集、存儲、傳輸、管理大數據的目的,是為了「利用」大數據,而如果沒有機器學習技術分析數據,則「利用」就無從談起。
  • 方差檢驗專題及常見問題 - CSDN
    Excel雙樣本T檢驗之等方差檢驗1 聲明本文的數據來自網絡,部分代碼也有所參照,這裡做了注釋和延伸,旨在技術交流,如有冒犯之處請聯繫博主及時處理。
  • bootstrap 有統計圖專題及常見問題 - CSDN
    就是在dashboard首頁有個圖表統計直觀展示一些數據,本例用的是用戶的角色及統計。 我們只要關注傳入的group_and_count_users這個參數就可以了,這是展示內容所需的數據,來自於資料庫的查詢。
  • oracle查詢過去專題及常見問題 - CSDN
    根據2018微信數據報告,九零後發送最多的表情便是「笑哭」。在具體的語境中,笑哭除了表示「搞笑」,其實更常常伴隨在無可奈何、自嘲的情境裡。微信更新表情的另一個邏輯在於數據勘測。微信設計團隊通過微信表情平臺發現,「捂臉」的類似表情使用頻率已經很高,於是便在小黃臉上也添加了這個動作。除了捂臉,「斜眼笑」也來自於網絡流行的借鑑。
  • 垂直行業雲計算專題及常見問題 - CSDN
    首先,雲計算行業國家有制定相應的安全標準,比如雲本身是否獲得雲等保三級,規定了相應的數據處理規範。其次,金山雲根據醫療業的特殊性,制定了專屬雲服務——將數據備份在雲端,除了做脫敏之外並完全獨立存儲,近似物理隔斷。北京某三甲醫院用的就是這樣的一個服務,解決了安全問題。
  • 擬合優度專題及常見問題 - CSDN
    所謂「擬合優度」,是回歸分析中用來檢驗樣本數據點聚集在回歸線周圍的密集程度,用於評價回歸方程對樣本觀測值的擬合程度。02 擬合優度是怎麼來的?英國統計學家F.Galton研究父親身高和其成年兒子身高的關係時,從大量的樣本觀測值的散點圖中,天才般地發現了一條貫穿其中的直線,這條直線能夠描述父親和成年兒子身高之間的關係。
  • t值判斷顯著性專題及常見問題 - CSDN
    提出問題  顯著性值p是一個很常見的事。比如我們在對比兩組或者是多組數據時,對於兩組而言,會做Two Sample T Test,然後給出一個p值,判斷兩者差異的顯著性。在ggplot2中,兩組數據對比時,我們常用的,就是boxplot,那麼,如何在作出兩組或者多組的boxplot的同時,標記出顯著性的數據呢?