摘要:本人長期出售超大量微博數據旅游網站評論數據,并提供各種指定數據爬取服務,。如果用戶傳入偽造的,則新浪微博會返回一個錯誤。
PS:(本人長期出售超大量微博數據、旅游網站評論數據,并提供各種指定數據爬取服務,Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,這個代碼已經不能用來爬數據了。如果只是為了收集數據可以咨詢我的郵箱,如果是為了學習爬蟲,建議改學phantomjs從網頁中爬取微博的)
利用新浪API實現數據的抓取(由于api接口限制增大,本文已基本廢棄)
2018.5.16 提示
微博的api接口現在已經不好用了,普通權限的token已經爬不到什么數據了,想要用這個代碼爬大量數據的已經不太可能,只能作為熟悉微博api接口使用方法的一個小demo了。
2018.4.16 說明
注意:今天有人言語惡劣地評論我的博客是垃圾,說我的代碼有問題,這篇博客歷史久遠,是我初玩爬蟲寫的博客。我非常感謝能對我的代碼提出意見的人,但是出言不遜,態度惡劣的人我是忍受不了的,有話好好說,是一個現代社會高學歷高知識分子的最低覺悟。
代碼我已經改過了,如果還有問題非常歡迎大家來溫和地指出!!!!
同時,由于新浪微博本身api機制的不斷更改,到目前為止,這篇博客的內容已經有了局限,對于個人開發者來說,你申請到的token的權限只能爬你自己的微博,所以對于想要靠api來爬數據的人,恐怕可能并不能達成自己的目的了。想要用api來爬取微博內容只能選擇獲取更高的開發者權限了。
我主要抓取了大概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?網上有很多安裝mongodb教程我就不寫了NoSql,全稱是 Not Only Sql,指的是非關系型的數據庫。下一代數據庫主要解決幾個要點:非關系型的、分布式的、開源的、水平可擴展的。原始的目的是為了大規模web應用,這場運動開始于2009年初,通常特性應用如:模式自由、支持簡易復制、簡單的API、最終的一致性(非ACID)、大容量數據等。NoSQL被我們用得最多的當數key-value存儲,當然還有其他的文檔型的、列存儲、圖型數據庫、xml數據庫等。
Windows下mongodb的安裝
Linux下mongodb的安裝
2.2 新浪開發者賬號的注冊方法注冊新浪微博賬號(163郵箱、手機號)
創建完畢需要填寫手機號驗證
進入新浪開放者平臺:http://open.weibo.com/
點擊繼續創建
初次創建應用需要填寫如下信息:
此頁面信息不需要填寫真實信息,如地區,電話,可隨意填寫。網站填https://www.baidu.com/即可。(郵箱要真實)
繼續創建應用。應用名稱自定義,平臺如下勾選 ios 、andrioid
創建完畢直接返回繼續創建,一個賬號可以創建10個應用,每個應用對應一個access-token(事實上我只用了一個就可以滿足需求)
前往API測試平臺
依次選取創建的應用。點將下方的token用txt保存即可。
獲取key
回到
點擊我的應用
然后選擇自己剛剛創建的應用
進入之后點擊應用信息
保存下 APP Key 和 APP Secret
點擊高級信息
設置回調網址
可以設置成默認的
http://api.weibo.com/oauth2/d...
至此你的開發者賬號就已經完成了
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/...××××××××
我們所需要的就是code=×××××××××× 的值
也就是說,每當你調用一次API認證在瀏覽器中都會出現一個code,這樣顯然不利于我們去爬取網站怎么解決問題呢?首先我們想到的自然是在Python程序里面模擬登錄新浪微博,然后自然可以獲取到code的值,但是,模擬新浪微博登錄相對來說比較復雜,而且既然都模擬登錄成功了,為啥還要調用API呢...直接自定義進行抓取不是更加方便。
如果看了上面的那個授權機制,就應該想到。這個時候就需要我們之前申請的access-token了
access-token 根據我的理解就是把你的微博授權給了第三方讓他幫你做一些事情,類似于在你的手機端通過新浪微博來登錄然后進行操作(利用上面授權機制里面講的一句話來說就是)_移動端應用可直接使用官方移動SDK,通過呼起微博客戶端(未安裝微博客戶端的會呼起H5授權頁)方式授權_
這個界面你應該很熟悉
新浪也給出了說明Oauth2/access token
4. 代碼實現有了token之后,實現抓取數據就十分簡單了
能抓取數據的多少就取決于你的token權限了
接下來就是利用API來獲取數據了:新建一個文件weibo_run.py
# -*- coding:utf-8 -*- import requests from pymongo import MongoClient ACCESS_TOKEN = "2.00ZooSqFHAgn3D59864ee3170DLjNj" URL = "https://api.weibo.com/2/statuses/public_timeline.json" def run(): #授權 while True: #調用statuses__public_timeline的api接口 params = { "access_token": ACCESS_TOKEN } statuses = requests.get(url=URL, params=params).json()["statuses"] length = len(statuses) #這是后來我為了查看獲取微博條數設置的 print length #連接mongodb,不需要本地的額外配置 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"] #插入mongodb 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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41109.html
摘要:本人長期出售超大量微博數據旅游網站評論數據,并提供各種指定數據爬取服務,。如果用戶傳入偽造的,則新浪微博會返回一個錯誤。 PS:(本人長期出售超大量微博數據、旅游網站評論數據,并提供各種指定數據爬取服務,Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,這個代碼已經不能用來爬數據了。如果只是為了收集數據可以咨詢我的郵箱,如果是為了學習爬蟲,...
摘要:前言利用實現抓取微博評論數據,廢話不多說。讓我們愉快地開始吧開發工具版本相關模塊模塊模塊模塊模塊模塊以及一些自帶的模塊。環境搭建安裝并添加到環境變量,安裝需要的相關模塊即可。 ...
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:今天為大家整理了個爬蟲項目。地址新浪微博爬蟲主要爬取新浪微博用戶的個人信息微博信息粉絲和關注。代碼獲取新浪微博進行登錄,可通過多賬號登錄來防止新浪的反扒。涵蓋鏈家爬蟲一文的全部代碼,包括鏈家模擬登錄代碼。支持微博知乎豆瓣。 showImg(https://segmentfault.com/img/remote/1460000018452185?w=1000&h=667); 今天為大家整...
閱讀 787·2021-11-12 10:36
閱讀 3363·2021-09-08 10:44
閱讀 2739·2019-08-30 11:08
閱讀 1392·2019-08-29 16:12
閱讀 2667·2019-08-29 12:24
閱讀 888·2019-08-26 10:14
閱讀 676·2019-08-23 18:32
閱讀 1160·2019-08-23 17:52