【selenium】python初心者がインスタ自動いいねツールを勝手に改修した話


経緯

一時期、某クラウドソーシングサイトの依頼で大流行りしていた「インスタ自動いいねツール」を試しに作りたいなーとググったところ、偉大なる先駆者様を発見。

pythonを私用でちゃんと使うのは初めてでしたが、記事がとてもわかりやすくコードまで書いてくださっているのですんなりできました。

そこで欲をかいた私は、もうちょっと自分用にカスタマイズしたいなーっと以下を実装してみます。

・現在表示されている分以上のループをしたい(次の読み込み分もいいねをつけたい)
・いいね済かどうかを判定したい

やること

・selectorやpathを修正
・指定した回数分いいねを押す
・既にいいねされていたり、読み込みきれていないものは「次へ」

※2020/01/20:パスとmax値を修正

コード

sample.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import urllib.parse
import time

#Webdriver
browser = webdriver.Chrome(executable_path='[chromedriver.exeのパス]')

#URL
MAIN_URL = "https://www.instagram.com/"
TAG_SEARCH_URL = MAIN_URL + "explore/tags/{}/?hl=ja"

#selectors
LOGIN_PATH = '//*[@id="react-root"]/section/main/article/div[2]/div[2]/p/a'
LIKE_PATH = '//button[@class="wpO6b "]/*[name()="svg"][@aria-label="いいね!"]'
LIKE_BUTTON_PATH = '//button[@class="wpO6b "]'

MEDIA_SELECTOR = 'div._9AhH0' #表示されているメディアのwebelement
NEXT_PAGE_SELECTOR = 'a.coreSpriteRightPaginationArrow' #次へボタン

#USER INFO
username = "[username]"
password = "[password]"
#params
tagName = "[タグ名]"
likedCounter = 0
likedMax = 100

if __name__ == '__main__':

    #login 
    browser.get(MAIN_URL)
    time.sleep(3)
    browser.find_element_by_xpath(LOGIN_PATH).click()
    time.sleep(3)
    usernameField = browser.find_element_by_name('username')
    usernameField.send_keys(username)
    passwordField = browser.find_element_by_name('password')
    passwordField.send_keys(password)
    passwordField.send_keys(Keys.RETURN)

    #tag search
    time.sleep(3)
    encodedTag = urllib.parse.quote(tagName) #普通にURLに日本語は入れられないので、エンコードする
    encodedURL = TAG_SEARCH_URL.format(encodedTag)
    print("encodedURL:{}".format(encodedURL))
    browser.get(encodedURL)

    #media click
    time.sleep(3)
    browser.implicitly_wait(10)
    browser.find_element_by_css_selector(MEDIA_SELECTOR).click()

    #次へボタンが表示されないか、いいねが一定数いくまで
    while likedCounter < likedMax:
        time.sleep(3)
        try:
            browser.find_element_by_xpath(LIKE_PATH)
            browser.find_element_by_xpath(LIKE_BUTTON_PATH).click()
            likedCounter += 1
            print("liked {}".format(likedCounter))
        except:
            #読み込まれなかったり既にいいねしているならパス
            print("pass")
            pass

        #次へ
        try:
            browser.find_element_by_css_selector(NEXT_PAGE_SELECTOR).click()
        except:
            break

    print("You liked {} media".format(likedCounter))

課題点

・全体的に高速化したい
 →あんまり早すぎると規制されるので悩みどころ
・既いいね時、次へ進むまでの時間が長い
・exceptでpassするのが個人的にいただけない。