【超有能!】Pythonでインスタの画像分類を分析してみた(後編)

前回のおさらい

前回の記事 「【超有能!】Pythonでインスタの画像分類を分析してみた(前編)」では、インスタグラムが画像分類を行っていることを、HTMLのimgタグalt属性で確認しました。

今回は、インスタグラムがどんなタグで画像分類を行っているのかを、Pythonで抽出してみようと思います。

環境

ブラウザ:Google Chrome
Webdriver:ChromeDriver
OS:Windows10

Pythonコード

今回使用したライブラリは、ブラウザを自動的に操作するSeleniumです。

Pythonについての詳しい記事は、今後の「プログラミング特集」で載せていく予定なので、今回はざっとコードと、簡単な説明です。

from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = 'https://instagram.com/' # インスタグラムurl
tagurl = 'https://instagram.com/explore/tags/' # インスタグラムのタグ検索のurl
img_xpath = "//article/div[2]/div/div/div[1]/img" # 投稿の画像のXpath
newpost_xpath = "//article[@class='KC1QD']/div[2]/div[1]/div[1]/div[1]" # ハッシュタグの最新投稿のXpath
nextpage_xpath = "//div[@class='EfHg9']/div[@class='nf1Jg']/div[@class='DdSX2']/a[2]" # 次の投稿ボタンのXpath

def open(account_name, password, keywords, picture_counter) :

    # ------------ SeleniumでChromeブラウザを起動する
    options = webdriver.ChromeOptions()
    options.add_argument(r'--user-data-dir=C:\Users\MT4ver2-g23-cHLCokI8\AppData\Local\Google\Chrome\User Data')
    options.add_argument('--profile-directory=Default')

    driver = webdriver.Chrome(options=options)
    wait = WebDriverWait(driver, 15)
    sleep(4)

    # ------------ instagramにアクセス
    driver.get(url)
    wait.until(EC.presence_of_all_elements_located)

    # ------------ アカウントにログイン ログイン済みならスルー
    try :
        sleep(4)
        driver.find_element_by_xpath('//*[@id="loginForm"]/div/div[1]/div/label/input').send_keys(account_name)
        sleep(4)
        driver.find_element_by_xpath('//*[@id="loginForm"]/div/div[2]/div/label/input').send_keys(password)
        sleep(4)
        driver.find_element_by_xpath('//*[@id="loginForm"]/div/div[3]/button').click()
    except :
        pass

    sleep(4)

    tag_list = [] # 採取的にタグを集めたリスト

    for keyword in keywords :
        # ------------ ハッシュタグにアクセス
        driver.get(tagurl + keyword)
        wait.until(EC.presence_of_all_elements_located)
        sleep(4)

        # ------------ ハッシュタグの最新投稿をクリック
        driver.find_element_by_xpath(newpost_xpath).click()
        wait.until(EC.presence_of_all_elements_located)
        sleep(4)

        counter = 0

        while picture_counter >= counter :

            # ------------ 画像のalt属性の中身を取得
            try : # エラーだった場合(動画とか)は、スルー
                alt_element = driver.find_element_by_xpath(img_xpath).get_attribute("alt")

                # ------------ 不要な文字列は取り除いていく
                tag_inside = alt_element.split(':')[1]
                words = tag_inside.split('、')

                for word in words :
                    if 'テキスト' not in word : # 画像に含まれているテキストは、除く
                        if word not in tag_list :
                            tag_list.append(word.split('.')[0])
                sleep(4)
                counter += 1
            except :
                pass

            # ------------ 次の投稿
            try :
                driver.find_element_by_xpath(nextpage_xpath).click()
                wait.until(EC.presence_of_all_elements_located)
                sleep(4)
            except :
                break

    for tag in tag_list :
        print(tag) # タグを出力

    driver.quit()

if __name__ == '__main__' :
    # ------------ アカウント情報と取得したいキーワード
    account_name = '#######' # アカウントID
    password = '#######' # アカウントパスワード
    picture_counter = 10 # 1ハッシュタグにつき、取得する投稿の枚数
    keywords = [ # 取得するハッシュタグ
        'グルメ',
        'アウトドア',
        'スポーツ'
        'ペット',
        '自然',
        '集合写真'
    ]

    open(account_name, password, keywords, picture_counter)

抽出の結果

Pythonコードで抽出を行った結果、以下のようなタグを見つけることができました。

(画像に移っているテキストに関しては、プログラム内で除外しています。)

食べ物  2人  室内  海  山  屋外  自然  水  飲み物  1人  木  子供  コーヒーカップ  1人以上  靴  座っている人  空  テーブル  雪  植物  車  花  雲  たそがれ  夜  草  猫  ストライプ  10人  立っている人 寝ている人  クローズアップ  7人  ダンスをしている人  ステージにいる人  バイク  屋外

まとめ

今回は、インスタグラムの画像分類について、Pythonを使ってタグを抽出するというのをしました。

何かに活用できそうな予感