【Python/Selenium】Instagram特定投稿のいいねユーザースクレイピング

2021年9月24日

スクレイピングは自己責任で

当記事はInstagramのスクレイピングを推奨するものではありません。Instagramの規約に従い、スクレイピングは自己責任で行ってください。

またソースコードは著作権物です。個人での利用、改変は自由ですが、転載は禁止です。

コード


# coding:utf-8

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import chromedriver_binary
import bs4
import pandas as pd
import time
import random
import sys
import argparse

#chromedriver
driver = None

# instagram login
def login(id, password):
    global driver
    name_input_e = driver.find_element_by_name("username")
    name_input_e.send_keys(id)
    pass_input_e = driver.find_element_by_name("password")
    pass_input_e.send_keys(password)
    pass_input_e.send_keys(Keys.RETURN)
    time.sleep(3)

def main():

    parser = argparse.ArgumentParser(description='インスタグラムの対象投稿のいいねを解析します。')

    parser.add_argument('url', help='解析対象の投稿URL')
    parser.add_argument('iu', help='Instagram ログインID')
    parser.add_argument('ip', help='Instagram ログインPASSWORD')

    args = parser.parse_args()

    global driver

    url = args.url;
    print("start crawling favorite of " + url)

    driver = webdriver.Chrome()
    driver.get('https://www.instagram.com/accounts/login/?source=auth_switcher')
    time.sleep(2)

    # login
    login(args.iu, args.ip)

    driver.get(url)
    time.sleep(3)
    follower_button = driver.find_elements_by_css_selector("a.zV_Nj")[0]
    follower_button.click()
    time.sleep(3)

    dialog = driver.find_element_by_css_selector("div.Igw0E.IwRSH.eGOV_.vwCYk.i0EQd").find_element(By.TAG_NAME, 'div')

    favorites = []
    favorite_not_found_count = 0;
    # scroll popup window
    for i in range(300):
        driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", dialog)
        page_url = driver.page_source
        soup = bs4.BeautifulSoup(page_url,"lxml")
        elm = soup.find_all("a", {"class": "FPmhX notranslate MBL3Z"})
        favorite_found = False
        for e in elm:
            if e.text not in favorites:
                favorites.append(e.text)
                print("favorite:"+e.text+" found.")
                favorite_found = True
                favorite_not_found_count=0
        if favorite_found == False:
            favorite_not_found_count +=1
            if favorite_not_found_count>3:
                break

        time.sleep(2)



    df = pd.Series(favorites)
    df.to_csv("insta_favorites.csv")
    print("csv file is created.")
    driver.close()

if __name__ == '__main__':
    main()

使い方

第1引数に投稿URLを指定、第2引数にInstagramのユーザーID、第3引数にパスワードを指定して実行。