本文主要內容來自 tweepy 官方文檔,加入了一些必要的解釋說明並剔除冗余的句子,便於國內用戶參閱使用。
純手工碼字,支持原創,轉載請注明出處。
tweepy官方文檔:http://docs.tweepy.org/en/latest/getting_started.html
what's the tweepy?
tweepy 是專門用於在 Python 中處理 Twitter API 的模塊。,使用方式相當簡潔,省去了手動開發 Twitter 爬蟲的成本。
抓取 Twitter 數據的重點是 twitter 要求所有請求都必須經過 OAuth 認證,而 tweepy 這個包提供專門的 auth 功能,在這方面的設定讓 authentication 變得十分方便。
注意:國內 Twitter 是被牆的,所以即使使用 tweepy 也必定要面對無法連接成功的狀況。記得提前架好梯子。
安裝
pip install tweepy
秘鑰
使用前需要現在 Twitter 官網上申請好秘鑰,用於鑒權。
consumer_key = 'xxxxxxxxx' consumer_secret = 'xxxxxxxxx' access_token = 'xxxxxxxxx' access_token_secret = 'xxxxxxxxx'
簡單的例子
import tweepy auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) public_tweets = api.home_timeline() for tweet in public_tweets: print(tweet.text)
API
API 類提供對整個 twitter restapi 方法的訪問。每個方法都可以接受各種參數並返回響應。下文會着重介紹。
tweepy 同時也支持長鏈接的形式得到即時信息。下文 stream 會介紹。
返回值
tweepy API 的返回值一般都是對象,不同的對象取值字段不同,具體需要自己 debug
- 推文相關—— Status 對象
- 用戶相關的—— User 對象
- 好友相關的—— FriendShip 對象
- 搜索記錄相關的—— SavedSearch 對象
一、身份驗證
tweepy 提供兩種鑒權方式:application-user 和 application-only,操作的是 tweepy.AuthHandler 類的對象
- 鑒權1——application-user
# 1.綁定公鑰 auth = tweepy.OAuthHandler(consumer_key, consumer_secret) # 使用回調函數:auth = tweepy.OAuthHandler(consumer_key, consumer_secret, callback_url) # 2.綁定私鑰 # ---- 方式一:知道私鑰,直接綁定 auth.set_access_token(access_token, access_token_secret) # ---- 方式二:不知道私鑰,先獲取后綁定 redirect_user(auth.get_authorization_url()) auth.get_access_token("verifier_value") # 3.構造api api = tweepy.API(auth)
- 鑒權2——application-only:這種方式不需要綁定私鑰,用於只需要讀權限的操作
auth = tweepy.AppAuthHandler(consumer_key, consumer_secret) api = tweepy.API(auth) # 搜索關鍵詞tweepy for tweet in tweepy.Cursor(api.search, q='tweepy').items(10): print(tweet.text)
二、分頁
有時候 Twitter 的數據量相當的龐大,所以會需要經常使用分頁。比如遍歷時間線、用戶列表、直接消息等操作。
tweepy 為我們提供了很便捷的分頁功能。
示例:迭代經過身份驗證的用戶(即當前秘鑰對應的用戶)時間線中的狀態
# 操作所有時間線 for status in tweepy.Cursor(api.user_timeline).items(): # process status here process_status(status) # 操作每一頁 for page in tweepy.Cursor(api.user_timeline).pages(): # page is a list of statuses process_page(page) # 操作前200條 for status in tweepy.Cursor(api.user_timeline).items(200): process_status(status) # 操作前3頁 for page in tweepy.Cursor(api.user_timeline).pages(3): process_page(page)
三、粉絲
tweepy 可以獲得指定用戶的粉絲數、粉絲們,並進行粉的操作
# 獲取我的粉絲 fs = tweepy.Cursor(api.followers) for follower in fs.items(): follower.follow() # 粉
粉絲數量很多的情況下可以使用生成器
# 函數封裝了生成器下一頁功能,但是如果已處於最后一頁卻還執行下一頁會報錯,這里加了容錯處理 def limit_handled(cursor): while True: try: yield cursor.next() # 生成器下一頁功能 except tweepy.RateLimitError: time.sleep(15 * 60) # 輸出好友數量小於300的用戶昵稱 for follower in limit_handled(tweepy.Cursor(api.followers).items()): if follower.friends_count < 300: print(follower.screen_name)
四、流媒體 stream
tweepy 提供類似於 websocket 的長鏈接功能,稱之為 stream。客戶端在通過身份驗證和基本的連接之后可以被動實時的獲得數據,比如:關注特朗普的推特,當特朗普發推時我們的程序就能收到;或者監聽指定關鍵詞比如新冠肺炎,只要有包含關鍵詞的推文我們就能收到。
stream 和 Rest api 不同,前者是長鏈接被動獲取實時獲取數據,后者則是主動請求以獲得數據。
tweepy 實現了 StreamListener 類,我們想要實現 stream 的功能只要繼承這個類並重寫它的 on_status 方法即可,on_status 方法會在得到數據時被調用
import tweepy # 繼承 StreamListener class MyStreamListener(tweepy.StreamListener): #重寫 on_status def on_status(self, status): print(status.text) # status 是一個對象,里面包含了該條推文的所有字段,比如推文內容、點贊數、評論數、作者id、作者昵稱、作者粉絲數等等 # 當流媒體出錯時被調用,如:身份驗證失敗、網絡錯誤等等 def on_error(self, status_code): if status_code == 420: return False #returning False in on_error disconnects the stream # 實例化 myStreamListener = MyStreamListener() # 身份驗證,綁定監聽流媒體 myStream = tweepy.Stream(auth = api.auth, listener=myStreamListener) # --- 監聽關鍵詞Python相關的推文 myStream.filter(track=['python']) # --- 關注某推特用戶,只能通過ID myStream.filter(follow=["2211149702"]) # --- 支持異步,參數is_async,推薦使用異步形式 myStream.filter(track=['python'], is_async=True) # 關閉流媒體的監聽 myStream.disconnect()
注:更多信息需要自行查看源碼,源碼並不是很難讀
五、REST API
tweepy 提供了一系列 API,基本全面支持 Twitter 網站的功能
5.1 時間線相關
API | 說明 | 參數 | 返回值 |
|
返回身份驗證用戶及其朋友發布的20個最新狀態,包括轉發。這相當於Web上的/timeline/home |
|
list,元素是status對象 |
[, include_ext_alt_text][, include_card_uri]) |
返回指定推特的詳情,最多一百條,由id_參數指定 |
|
list,元素是status對象 |
API. user_timeline ([id/user_id/screen_name][, since_id][, max_id][, count][, page]) |
返回身份驗證用戶或指定用戶發布的20個最新狀態。也可以通過id參數獲取指定用戶的時間線 |
|
list,元素是status對象 |
API. retweets_of_me ([since_id][, max_id][, count][, page]) |
返回已驗證用戶最近轉發的20條推文 |
|
list,元素是status對象 |
API. mentions_timeline ([since_id][, max_id][, count]) |
返回最近20次提及,包括轉發 |
|
list,元素是status對象 |
5.2 Status 相關(推文)
API | 說明 | 參數 | 返回值 |
[, include_my_retweet] [, include_entities] [, include_ext_alt_text] [, include_card_uri]) |
返回由指定ID的推文詳情 |
|
status對象 |
[, auto_populate_reply_metadata] [, exclude_reply_user_ids] [, attachment_url] [, media_ids] [, possibly_sensitive] [, lat][, long][, place_id] [, display_coordinates] [, trim_user][, enable_dmcommands] [, fail_dmcommands][, card_uri]) |
發表推文,注意不可重復發相同推文,否則返回403;不可一次性發布超過限制數量的推文,否則返回403 |
|
status對象 |
[, in_reply_to_status_id] [, auto_populate_reply_metadata] [, lat][, long][, source][, place_id][, file]) |
目前已不廢,推薦使用API.media_upload()。 更新已驗證用戶的狀態。重復或太長的狀態將被忽略。 |
|
|
API. destroy_status (id) |
刪除自己的一條推文 | id - 推文id | status對象 |
API. retweet (id) |
轉發 | id - 要轉發的推文id | status對象 |
API. retweeters (id[, cursor][, stringify_ids]) |
得到轉發了該條推文的用戶id列表最多返回100條 |
|
list,元素是status對象 |
API. retweets (id[, count]) |
返回指定推特的前count次轉發,最多100 |
|
list,元素是status對象 |
API. unretweet (id) |
取消轉發 | id – 指定推文id |
status對象 |
5.3 User 相關(用戶)
API | 說明 | 參數 | 返回值 |
API. get_user (id/user_id/screen_name) |
返回指定用戶信息 |
|
user對象 |
API. me () |
返回認證用戶信息 | 無 | user對象 |
[, skip_status][, include_user_entities]) |
返回指定用戶的前count個好友,最多100, 如果沒有指定用戶則為當前用戶 |
|
list,元素是user對象 |
API. followers ([id/screen_name/user_id][, cursor]) |
返回指定用戶的follower,最多100, 如果沒有指定用戶則為當前用戶 |
|
list,元素是user對象 |
API. lookup_users ([user_ids][, screen_names][, include_entities][, tweet_mode]) |
返回fully-hydrated用戶,最多100
|
|
list,元素是user對象 |
API. search_users (q[, count][, page]) |
運行類似於“查找人員”按鈕搜索Twitter.com網站; 效果等同於網站上進行用戶搜索。 只能從這個API檢索前1000個匹配項。 |
|
list,元素是user對象 |
5.4 Direct Message 相關
API | 說明 | 參數 | 返回值 |
API. get_direct_message ([id][, full_text]) |
返回指定的 direct message |
|
DirectMessage對象 |
API. list_direct_messages ([count][, cursor]) |
返回30天內接受和發送的所有 direct message 默認按時間倒序 |
|
list,元素是DirectMessage對象 |
[, quick_reply_type][, attachment_type] [, attachment_media_id]) |
向指定用戶發送一條 direct message |
|
DirectMessage對象 |
API. destroy_direct_message (id) |
刪除當前用戶的一條 direct message | id – 指定 direct message 的ID | None |
5.5 Friendship 相關
API | 說明 | 參數 | 返回值 |
API. create_friendship (id/screen_name/user_id[, follow]) |
與指定用戶建立好友關系(也可以是關注指定好友) |
|
user對象 |
API. destroy_friendship (id/screen_name/user_id) |
刪除指定用戶的好友關系(也可以是取消關注) |
|
user對象 |
API. show_friendship (source_id/source_screen_name, target_id/target_screen_name) |
返回兩個指定用戶的好友關系 |
|
FriendShip對象 |
API. friends_ids (id/screen_name/user_id[, cursor]) |
返回關注指定用戶的用戶ID列表(就是粉絲) |
|
list,元素是ID |
API. followers_ids (id/screen_name/user_id) |
返回指定用戶的關注用戶ID列表 |
|
list,元素是ID |
5.6 Account 相關(即當前用戶)
API | 說明 | 參數 | 返回值 |
API. verify_credentials ([include_entities][, skip_status][, include_email]) |
驗證用戶是否有效 |
|
user對象或False |
API. rate_limit_status () |
返回當前用戶的指定API的速率限制 | resources – 列表,元素為API。 | JSON |
API. update_profile_image (filename) |
更新頭像,必須是GIF、JPG或PNG | filename – 本地文件的路徑,不能是遠程的URL | user對象 |
API. update_profile_background_image (filename) |
更新背景圖,必須是GIF、JPG或PNG | filename – 本地文件的路徑,不能是遠程的URL | user對象 |
API. update_profile ([name][, url][, location][, description]) |
設置用戶選項,只能設置在網站設置頁的“帳戶”選項卡下的選項。 |
|
user對象 |
5.7 Favorite 相關(喜歡的推文)
API | 說明 | 參數 | 返回值 |
API. favorites ([id][, page]) |
返回指定用戶喜歡的推文列表,默認為當前用戶 |
|
list,元素是status對象 |
API. create_favorite (id) |
喜歡指定推文 | id – 推文ID |
status對象 |
API. destroy_favorite (id) |
取消喜歡指定推文 | id – 推文ID | status對象 |
5.8 Block 相關(黑名單)
API | 說明 | 參數 | 返回值 |
API. create_block (id/screen_name/user_id) |
阻止指定用戶,解除當前用戶與指定用戶的好友關系(黑名單功能) |
|
user對象 |
API. destroy_block (id/screen_name/user_id) |
取消拉黑 |
|
user對象 |
API. blocks ([page]) |
返回黑名單列表 | page – 也愛,注意頁數限制 | list,元素是user對象 |
API. blocks_ids ([cursor]) |
返回黑名單ID列表 | cursor – 分頁 | list,元素是黑名單user的ID |
5.9 Mute 相關(屏蔽)
API | 說明 | 參數 | 返回值 |
API. create_mute (id/screen_name/user_id) |
屏蔽指定用戶 |
|
user對象 |
API. destroy_mute (id/screen_name/user_id) |
取消屏蔽 |
|
user對象 |
API. mutes ([cursor][, include_entities][, skip_status]) |
返回屏蔽列表 |
|
list,元素是user對象 |
API. mutes_ids ([cursor]) |
返回屏蔽ID列表 | cursor – 分頁 | list,元素是屏蔽user的ID |
5.10 Spam Reporting 相關(垃圾信息)
API | 說明 | 參數 | 返回值 |
API. report_spam (id/screen_name/user_id[, perform_block]) |
拉黑指定用戶,並發送垃圾報告 |
|
user對象 |
5.11 Saved Searches 相關(保存的搜索,類似於收藏)
API | 說明 | 參數 | 返回值 |
API. saved_searches () |
返回當前用戶保存的搜索記錄 | 無 | list,元素是SavedSearch對象 |
API. get_saved_search (id) |
返回當前用戶保存的指定搜索記錄 | id – 搜索記錄的ID | SavedSearch對象 |
API. create_saved_search (query) |
增加一條搜索記錄 | query – 搜索的 query | SavedSearch對象 |
API. destroy_saved_search (id) |
刪除一條保存的搜索記錄,只能刪自己的 | id – 搜索記錄的ID | SavedSearch對象 |
5.12 其他
剩下的幾個相關的 API 個人覺得基本不會使用,詳情請自行參閱官網
ERROR 異常
tweepy 提供了幾個異常類,便於我們捕捉異常
tweepy.TweepError
涵蓋了幾乎所有 tweepy 的異常
tweepy.RateLimitError
當 API 訪問量超出限制時會觸發該異常,該異常也可以被 tweepy.TweepError 捕捉到