摘要:本人長(zhǎng)期出售超大量微博數(shù)據(jù)旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),。如果用戶傳入偽造的,則新浪微博會(huì)返回一個(gè)錯(cuò)誤。
PS:(本人長(zhǎng)期出售超大量微博數(shù)據(jù)、旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,這個(gè)代碼已經(jīng)不能用來(lái)爬數(shù)據(jù)了。如果只是為了收集數(shù)據(jù)可以咨詢我的郵箱,如果是為了學(xué)習(xí)爬蟲,建議改學(xué)phantomjs從網(wǎng)頁(yè)中爬取微博的)
利用新浪API實(shí)現(xiàn)數(shù)據(jù)的抓?。ㄓ捎赼pi接口限制增大,本文已基本廢棄)
2018.5.16 提示
微博的api接口現(xiàn)在已經(jīng)不好用了,普通權(quán)限的token已經(jīng)爬不到什么數(shù)據(jù)了,想要用這個(gè)代碼爬大量數(shù)據(jù)的已經(jīng)不太可能,只能作為熟悉微博api接口使用方法的一個(gè)小demo了。
2018.4.16 說(shuō)明
注意:今天有人言語(yǔ)惡劣地評(píng)論我的博客是垃圾,說(shuō)我的代碼有問(wèn)題,這篇博客歷史久遠(yuǎn),是我初玩爬蟲寫的博客。我非常感謝能對(duì)我的代碼提出意見的人,但是出言不遜,態(tài)度惡劣的人我是忍受不了的,有話好好說(shuō),是一個(gè)現(xiàn)代社會(huì)高學(xué)歷高知識(shí)分子的最低覺悟。
代碼我已經(jīng)改過(guò)了,如果還有問(wèn)題非常歡迎大家來(lái)溫和地指出?。。?!
同時(shí),由于新浪微博本身api機(jī)制的不斷更改,到目前為止,這篇博客的內(nèi)容已經(jīng)有了局限,對(duì)于個(gè)人開發(fā)者來(lái)說(shuō),你申請(qǐng)到的token的權(quán)限只能爬你自己的微博,所以對(duì)于想要靠api來(lái)爬數(shù)據(jù)的人,恐怕可能并不能達(dá)成自己的目的了。想要用api來(lái)爬取微博內(nèi)容只能選擇獲取更高的開發(fā)者權(quán)限了。
1. 首先來(lái)看看最后我們得到的是什么結(jié)果,是不是你想要了解的東西,再?zèng)Q定是否往下讀。我主要抓取了大概4天的數(shù)據(jù),圖上可以看的出來(lái)大概有360萬(wàn)條數(shù)據(jù),由于是在自己的電腦上爬取做數(shù)據(jù)的,有時(shí)候晚上斷網(wǎng)了就間斷了,所以大概一天可以爬取有100萬(wàn)左右的最新微博數(shù)據(jù)(因?yàn)槲艺{(diào)用的是最新的微博API public_timeline)
API文檔當(dāng)中定義了很多返回的類型(以json數(shù)據(jù)格式返回,我選取了一些我認(rèn)為重要的信息抓取下來(lái)_如圖所示_: 大概有id號(hào),所在位置,粉絲數(shù),發(fā)的微博內(nèi)容,發(fā)微博的時(shí)間等等。 當(dāng)然這些數(shù)據(jù)都可以根據(jù)自己的需要進(jìn)行定制。)
大概就是這些內(nèi)容,你如果認(rèn)為這對(duì)你有點(diǎn)幫助,就請(qǐng)繼續(xù)讀下去... 第一次寫博客有些啰嗦 2. 前期準(zhǔn)備我們需要的東西:
數(shù)據(jù)庫(kù): mongodb(可以使用客戶端MongoBooster)
開發(fā)環(huán)境: Python2.7(我用的IDE是Pycharm)
一個(gè)新浪開發(fā)者賬號(hào): 用自己的新浪微博賬號(hào)注冊(cè)就行(后面會(huì)講)
需要的庫(kù): requests和pymongo(這些都可以在Pycharm中下載)
2.1 mongodb的安裝MongoDB是一個(gè)高性能,開源,無(wú)模式的文檔型數(shù)據(jù)庫(kù),是當(dāng)前NoSql數(shù)據(jù)庫(kù)中比較熱門的一種。它在許多場(chǎng)景下可用于替代傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)或鍵/值存儲(chǔ)方式。Mongo使用C++開發(fā)。Mongo的官方網(wǎng)站地址是:http://www.mongodb.org/,讀者可以在此獲得更詳細(xì)的信息。
小插曲:什么是NoSql?網(wǎng)上有很多安裝mongodb教程我就不寫了NoSql,全稱是 Not Only Sql,指的是非關(guān)系型的數(shù)據(jù)庫(kù)。下一代數(shù)據(jù)庫(kù)主要解決幾個(gè)要點(diǎn):非關(guān)系型的、分布式的、開源的、水平可擴(kuò)展的。原始的目的是為了大規(guī)模web應(yīng)用,這場(chǎng)運(yùn)動(dòng)開始于2009年初,通常特性應(yīng)用如:模式自由、支持簡(jiǎn)易復(fù)制、簡(jiǎn)單的API、最終的一致性(非ACID)、大容量數(shù)據(jù)等。NoSQL被我們用得最多的當(dāng)數(shù)key-value存儲(chǔ),當(dāng)然還有其他的文檔型的、列存儲(chǔ)、圖型數(shù)據(jù)庫(kù)、xml數(shù)據(jù)庫(kù)等。
Windows下mongodb的安裝
Linux下mongodb的安裝
2.2 新浪開發(fā)者賬號(hào)的注冊(cè)方法注冊(cè)新浪微博賬號(hào)(163郵箱、手機(jī)號(hào))
創(chuàng)建完畢需要填寫手機(jī)號(hào)驗(yàn)證
進(jìn)入新浪開放者平臺(tái):http://open.weibo.com/
點(diǎn)擊繼續(xù)創(chuàng)建
初次創(chuàng)建應(yīng)用需要填寫如下信息:
此頁(yè)面信息不需要填寫真實(shí)信息,如地區(qū),電話,可隨意填寫。網(wǎng)站填https://www.baidu.com/即可。(郵箱要真實(shí))
繼續(xù)創(chuàng)建應(yīng)用。應(yīng)用名稱自定義,平臺(tái)如下勾選 ios 、andrioid
創(chuàng)建完畢直接返回繼續(xù)創(chuàng)建,一個(gè)賬號(hào)可以創(chuàng)建10個(gè)應(yīng)用,每個(gè)應(yīng)用對(duì)應(yīng)一個(gè)access-token(事實(shí)上我只用了一個(gè)就可以滿足需求)
前往API測(cè)試平臺(tái)
依次選取創(chuàng)建的應(yīng)用。點(diǎn)將下方的token用txt保存即可。
獲取key
回到
點(diǎn)擊我的應(yīng)用
然后選擇自己剛剛創(chuàng)建的應(yīng)用
進(jìn)入之后點(diǎn)擊應(yīng)用信息
保存下 APP Key 和 APP Secret
點(diǎn)擊高級(jí)信息
設(shè)置回調(diào)網(wǎng)址
可以設(shè)置成默認(rèn)的
http://api.weibo.com/oauth2/d...
至此你的開發(fā)者賬號(hào)就已經(jīng)完成了
2.3 依賴庫(kù)的安裝方法requests和pymongo的安裝
可以直接用pip安裝
pip install requests 和 pip install pymongo
也可以在Pycharm里面直接安裝
選擇File -> Settings -> Project -> Project Interpreter
可以看到自己安裝的Python庫(kù),點(diǎn)擊右邊的綠色 + 號(hào)
安裝即可
3. 分析問(wèn)題 3.1 OAuth 認(rèn)證授權(quán)機(jī)制說(shuō)明(很重要)
網(wǎng)上很多講利用新浪微博API發(fā)送微博什么的都是使用的請(qǐng)求用戶授權(quán)Token這種方式,但是這種方式顯然不適用于我們爬取數(shù)據(jù),因?yàn)槊看味家?qǐng)求,每次都要重新獲取code。具體可參考新浪微博API的授權(quán)機(jī)制
廖雪峰老師(sinaweibopy 的貢獻(xiàn)者)也對(duì)這個(gè)授權(quán)機(jī)制有一個(gè)說(shuō)明
通過(guò)新浪微博的API接入網(wǎng)站,由于用戶無(wú)需在您的網(wǎng)站上注冊(cè),就可以直接?使用他/她在新浪微博的帳號(hào)和口令登錄您的網(wǎng)站,這就需要確保您的網(wǎng)站在無(wú)需知道,也不能知道用戶口令的情況下確認(rèn)用戶已經(jīng)登錄成功。由于用戶的口令存儲(chǔ)在新浪微博,因此,認(rèn)證用戶的過(guò)程只能由新浪微博完成,但新浪微博如何與您的網(wǎng)站通信并告知您用戶是否登錄成功呢?這個(gè)過(guò)程稱之為第三方登錄,OAuth是一個(gè)標(biāo)準(zhǔn)的第三方登錄協(xié)議,借助OAuth,您的網(wǎng)站就可以安全地接入來(lái)自新浪微博登錄成功的用戶。
OAuth目前主要有1.0和2.0兩個(gè)版本,2.0版對(duì)1.0版做了大量簡(jiǎn)化,API也更簡(jiǎn)單。新浪微博最新的API也是采用的OAuth 2.0,整個(gè)登錄流程如下:
用戶在您的網(wǎng)站上點(diǎn)擊“使用新浪微博登錄”,您的網(wǎng)站將用戶重定向到新浪微博的OAuth認(rèn)證頁(yè),重定向鏈接中包含client_id參數(shù)作為您的網(wǎng)站ID,redirect_uri參數(shù)告訴新浪微博當(dāng)用戶登錄成功后,將瀏覽器重定向到您的網(wǎng)站;
用戶在新浪微博的認(rèn)證頁(yè)輸入帳號(hào)和口令;
新浪微博認(rèn)證成功后,將瀏覽器重定向到您的網(wǎng)站,并附上code參數(shù);
您的網(wǎng)站通過(guò)code參數(shù)向新浪微博請(qǐng)求用戶的access token;
您的網(wǎng)站拿到用戶的access token后,用戶登錄完成。
OAuth的access token是提供認(rèn)證服務(wù)的網(wǎng)站(例如新浪微博)生成的令牌,代表一個(gè)用戶認(rèn)證信息。在隨后的API調(diào)用中,傳入該access token就代表這個(gè)登錄用戶,這樣,通過(guò)OAuth協(xié)議,您的網(wǎng)站將驗(yàn)證用戶的步驟交給新浪微博完成,并由新浪微博告知您用戶是否登錄成功。
OAuth的安全性是通過(guò)步驟4完成的,通過(guò)code參數(shù)獲取access token的過(guò)程是您的網(wǎng)站后臺(tái)到新浪微博網(wǎng)站完成的,用戶無(wú)法看到獲取access token的HTTP請(qǐng)求。如果用戶傳入偽造的code,則新浪微博會(huì)返回一個(gè)錯(cuò)誤。
具體內(nèi)容請(qǐng)看廖雪峰老師的文檔
大致上來(lái)說(shuō)按照一般的請(qǐng)求用戶授權(quán)Token調(diào)用會(huì)出現(xiàn)這種情況:
獲取code
登陸后會(huì)調(diào)轉(zhuǎn)到一個(gè)連接https://api.weibo.com/oauth2/...××××××××
我們所需要的就是code=×××××××××× 的值
也就是說(shuō),每當(dāng)你調(diào)用一次API認(rèn)證在瀏覽器中都會(huì)出現(xiàn)一個(gè)code,這樣顯然不利于我們?nèi)ヅ廊【W(wǎng)站怎么解決問(wèn)題呢?首先我們想到的自然是在Python程序里面模擬登錄新浪微博,然后自然可以獲取到code的值,但是,模擬新浪微博登錄相對(duì)來(lái)說(shuō)比較復(fù)雜,而且既然都模擬登錄成功了,為啥還要調(diào)用API呢...直接自定義進(jìn)行抓取不是更加方便。
如果看了上面的那個(gè)授權(quán)機(jī)制,就應(yīng)該想到。這個(gè)時(shí)候就需要我們之前申請(qǐng)的access-token了
access-token 根據(jù)我的理解就是把你的微博授權(quán)給了第三方讓他幫你做一些事情,類似于在你的手機(jī)端通過(guò)新浪微博來(lái)登錄然后進(jìn)行操作(利用上面授權(quán)機(jī)制里面講的一句話來(lái)說(shuō)就是)_移動(dòng)端應(yīng)用可直接使用官方移動(dòng)SDK,通過(guò)呼起微博客戶端(未安裝微博客戶端的會(huì)呼起H5授權(quán)頁(yè))方式授權(quán)_
這個(gè)界面你應(yīng)該很熟悉
新浪也給出了說(shuō)明Oauth2/access token
4. 代碼實(shí)現(xiàn)有了token之后,實(shí)現(xiàn)抓取數(shù)據(jù)就十分簡(jiǎn)單了
能抓取數(shù)據(jù)的多少就取決于你的token權(quán)限了
接下來(lái)就是利用API來(lái)獲取數(shù)據(jù)了:新建一個(gè)文件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(): #授權(quán) while True: #調(diào)用statuses__public_timeline的api接口 params = { "access_token": ACCESS_TOKEN } statuses = requests.get(url=URL, params=params).json()["statuses"] length = len(statuses) #這是后來(lái)我為了查看獲取微博條數(shù)設(shè)置的 print length #連接mongodb,不需要本地的額外配置 Monclient = MongoClient("localhost", 27017) db = Monclient["Weibo"] WeiboData = db["HadSelected"] #獲取的各個(gè)數(shù)據(jù)名應(yīng)該可以清楚的看出來(lái)對(duì)應(yīng)的是什么數(shù)據(jù) 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()
剛開始我的代碼是這樣的,看起來(lái)已經(jīng)完成了。
但是,因?yàn)樾吕藭?huì)限制你的調(diào)用次數(shù),后來(lái)我試了一下重新運(yùn)行,結(jié)果發(fā)現(xiàn)了一個(gè)問(wèn)題,我之前的_print length_ 出來(lái)的每行獲取值都不一樣,總是在16-20之間徘徊,這說(shuō)明了我每次重新運(yùn)行獲取的數(shù)據(jù)都不一樣.然后我想算了,干脆寫個(gè)死循環(huán)看他什么時(shí)候再被封吧。于是代碼就變成了下面這樣
把run()刪除,換成下面這個(gè)死循環(huán)。
if __name__ == "__main__": while 1: try: run() except: pass
結(jié)果他就一直運(yùn)行下去了...運(yùn)行了四天還沒(méi)有被封,估計(jì)是封不了了...
其他接口也是一樣使用,只用改變url和params就行,具體參數(shù)參照新浪微博API文檔
開始我發(fā)現(xiàn)一天可以獲取800萬(wàn)的數(shù)據(jù),把我給樂(lè)的...后來(lái)發(fā)現(xiàn)好多好多重復(fù)的數(shù)據(jù)。最后找了半天的解決方案,在mongodb中根據(jù)用戶的id和創(chuàng)建的時(shí)間這兩點(diǎn)建立索引(因?yàn)橐粋€(gè)人不可能在同一時(shí)刻發(fā)送兩條微博),最后沒(méi)有重復(fù)數(shù)據(jù)大概一天可以獲取100萬(wàn)條左右的信息。
個(gè)人博客8aoy1.cn
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/90373.html
摘要:本人長(zhǎng)期出售超大量微博數(shù)據(jù)旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),。如果用戶傳入偽造的,則新浪微博會(huì)返回一個(gè)錯(cuò)誤。 PS:(本人長(zhǎng)期出售超大量微博數(shù)據(jù)、旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,這個(gè)代碼已經(jīng)不能用來(lái)爬數(shù)據(jù)了。如果只是為了收集數(shù)據(jù)可以咨詢我的郵箱,如果是為了學(xué)習(xí)爬蟲,...
摘要:前言利用實(shí)現(xiàn)抓取微博評(píng)論數(shù)據(jù),廢話不多說(shuō)。讓我們愉快地開始吧開發(fā)工具版本相關(guān)模塊模塊模塊模塊模塊模塊以及一些自帶的模塊。環(huán)境搭建安裝并添加到環(huán)境變量,安裝需要的相關(guān)模塊即可。 ...
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:今天為大家整理了個(gè)爬蟲項(xiàng)目。地址新浪微博爬蟲主要爬取新浪微博用戶的個(gè)人信息微博信息粉絲和關(guān)注。代碼獲取新浪微博進(jìn)行登錄,可通過(guò)多賬號(hào)登錄來(lái)防止新浪的反扒。涵蓋鏈家爬蟲一文的全部代碼,包括鏈家模擬登錄代碼。支持微博知乎豆瓣。 showImg(https://segmentfault.com/img/remote/1460000018452185?w=1000&h=667); 今天為大家整...
閱讀 1370·2021-11-04 16:09
閱讀 3605·2021-10-19 11:45
閱讀 2472·2021-10-11 10:59
閱讀 1072·2021-09-23 11:21
閱讀 2837·2021-09-22 10:54
閱讀 1216·2019-08-30 15:53
閱讀 2673·2019-08-30 15:53
閱讀 3536·2019-08-30 12:57