PythonとTwitter APIを使ってフォロー・フォロワーのアイコンを収集する

特定アカウントのフォロー・フォロワーのアイコンを一括で集めたくなったのでなんとかしました。

使うもの

環境はAnacondaを使ってます。標準環境では tweepy 入ってないので pip install tweepy でインストール。 あとTwitter API Keyが必要です。これは色んな方が記事にしているのでそちらを参考にしてください。

【2018年】TwitterのAPIに登録し、アクセスキー・トークンを取得する具体的な方法|さぎのみや家の分析録

ではやっていきます。

API Keyを使ったauth認証

Twitter API Key で認証をかけていきます。必要なモジュールを読み込んで、その後API Keyを渡します。

import tweepy

CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)

xxxのところは取得したAPI Keyを入力。

フォロー・フォロワーのリストを作る

tweepyではフォローは friends*1 , フォロワーは followers です。フォローしている人の一覧(id)が欲しい場合は

friends_id = []
friends = tweepy.Cursor(api.friends_ids, screen_name='<対象アカウント>').pages

for f in friends():
    friends_id.extend(f)

のように書くとリストにid一覧が格納されます。特定のアカウントのフォロー一覧をとる場合は<対象アカウント>のところにアカウント名(例:screen_name='Takaki_')を入れてください。

フォロワーの場合は以下のような書き方になります。

followers_id = []
followers = tweepy.Cursor(api.followers_ids, screen_name='<対象アカウント>').pages

for i in followers():
    followers_id.extend(i)

これ extend使わずに、もう少し綺麗に書く方法がある気がします。

画像を保存

作ったリストをもとにアイコン画像を取ってきます。まず画像を保存するための関数を作ります。

import urllib.request
import urllib.error

def download_image(url, dst_path):
     try:
         data = urllib.request.urlopen(url).read()
         with open(dst_path, mode="wb") as f:
             f.write(data)
     except urllib.error.URLError as e:
         print(e)

nkmkさんの記事をそのまま参考にしました。いつもお世話になってます。

PythonでWeb上の複数の画像を一括ダウンロード・保存 | note.nkmk.me

この関数にアイコンのURLを引き渡して画像を取ります。tweepyのget_userにidを引き渡すとユーザ情報が取れるので

# idを渡すとユーザ情報が取れる
usr = api.get_user(<ユーザid>)

それにnameやstatus噛ませて色々情報を引っ張ってくることができます。

f:id:kazutaka83:20180911233248p:plain

で、profile_image_url_httpsメソッドを噛ますとアイコンのURLが取れるので、これをidでループさせて画像をダウンロード。

for i in friends_ids:
     img = api.get_user(i)
     url = img.profile_image_url_https
     dst_path = './' + str(i) + '.png'
     download_image(url, dst_path)

このまま叩くとAPI制限に引っかかるので、1,000件以上のアイコンを取りたい場合は適宜sleepを噛ませてください。

やるぞー。

*1:この呼び方ちょっと好き


スポンサード リンク