こんにちは、ウチダです。
以前、インスタグラムの自動いいねプログラムを作ったことを紹介しました。
(参考:インスタの自動いいねプログラムを使って愛媛県での認知度アップにチャレンジ!)
久しぶりに動かしたら、エラーが発生することに気づきました。
調べた結果、インスタグラムのCSSのclassネームが変わっていました。
今回はプログラムを修正したので、コードを紹介します。
インスタグラムのCSSが変更されていた!プログラムを修正しよう

エラーが発生していたのは、投稿を次へに送るボタンをクリックするところです。
以前はclass='coreSpriteRightPaginationArrow'でした。
しかし、いまはclass=' l8mY4 'に変わっているではありませんか。
(※2021年11月時点)
次の投稿に送れず、延々といいねと解除を続けるプログラムに・・・
コードを直します。
from selenium import webdriver #webページを操作するライブラリのインポート
from selenium.common.exceptions import WebDriverException #例外クラスのインポート
from selenium.webdriver.common.keys import Keys #特殊なキークラスのインポート
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from time import sleep #休憩
import random #乱数作成
def login(user, psw):
driver.get('https://www.instagram.com/?hl=ja') #instagramのサイトにアクセスする
sleep(1)
driver.find_element_by_name('username').send_keys(user) #メールアドレスを記入
sleep(1)
driver.find_element_by_name('password').send_keys(psw) #パスワードを記入
sleep(1)
#ログインボタンを押す
driver.find_element_by_class_name('L3NKy ').click() #ログインボタンを押す
sleep(random.randint(2, 5)) #2〜5秒停止
print(user+'にログインしました。')
sleep(1)
def tagsearch(tag):
instaurl = 'https://www.instagram.com/explore/tags/' #タグ検索用のリンク
driver.get(instaurl + tag) #タグを検索
sleep(random.randint(2, 10)) #2〜10秒停止
print(tag+'のタグで検索しました。')
sleep(1)
def clicknice():
#_9AhH0というCSSタグをもつデータをリスト型で取得し、10番目を選択する
target = driver.find_elements_by_class_name('_9AhH0')[10]
#10番目が新着の1番最初にくる
#ActionChainsクラスのコンストラクタの引数に、対象driverを指定してインスタンスを作成
actions = ActionChains(driver)
actions.key_down(Keys.CONTROL) #キーボードを押下した状態のままにする「key_down」
#Controlキーを押下しながら移動→表示件数の最下層まで移動する
#最後に「perform」を実行することで、これまでのメソッドをビルドした後、実行していきます。
actions.perform()
print('投稿を表示しました。')
sleep(1)
try:
#_9AhH0というCSSタグをもつデータをリスト型で取得し、9番目を選択する
driver.find_elements_by_class_name('_9AhH0')[9].click()
#9番目は人気投稿の最後
sleep(random.randint(2, 10)) #2〜10秒停止
#fr66nというCSSタグをもつデータを選択し、クリックする
driver.find_element_by_class_name('fr66n').click()
#fr66nはいいねボタン
print('いいねしました。')
sleep(1)
except WebDriverException:
print('エラーが発生しました。')
return
for i in range(random.randint(70, 100)): #70〜100回繰り返す
try:
driver.find_element_by_class_name('l8mY4').click()
#l8mY4というCSSタグをもつデータを選択し、クリックする
# l8mY4が次の投稿に移る。
sleep(random.randint(random.randint(2, 5), random.randint(10, 15))) #2〜5秒から10〜15秒の間停止する
except WebDriverException:
print('エラーが発生しました。')
sleep(5)
try:
driver.find_element_by_class_name('fr66n').click()
#fr66nはいいねボタン
print('いいねしました。')
sleep(2)
except WebDriverException:
print('エラーが発生しました。')
if __name__ == '__main__':
taglist1 = ['愛媛', 'followme','いいね','ありがとう','感謝','ランチ','ごはん']
users1 = ['XXXXXXX'] #IDを入力
psws1 = ['ZZZZZZZ'] #パスワードを入力
#headlessモードで実行する
options = Options()
options.binary_location = '/usr/bin/firefox'
options.add_argument('-headless')
for user,psw in zip(users1,psws1):
#Firefoxを操作する
driver = webdriver.Firefox(options=options)
sleep(1)
#関数loginを呼び出す
login(user, psw)
#関数tagsearchを呼び出す
tagsearch(random.choice(taglist1))
clicknice() #関数clickniceを呼び出す
driver.close() #サイトを閉じる
print('ログアウトしました。')
sleep(5)
これをコピペして、FireFoxとGeckodriverを用意したら自動いいねが使えます。
余談ですが、インスタのサイトにはdiv class=' l8mY4 'と表示されています。
前後に半角スペースがあるので、Pythonのコードも
driver.find_element_by_class_name(' l8mY4 ').click()
とスペースを入れたら、エラーになりました。
Pythonコードにはスペースはいらないようです。
また、プログラムがちゃんと動くことも確認しました。

インスタはときどきCSSが直されるんですかね。
イタチごっこになる気がします。
もしPythonを独学で身につけるなら、こちらの本がおすすめです。
演習問題つきなので、とっても定着しやすいと思います。
WordやExcelを操作するプログラムのアイディアもあって、仕事に便利です。
ここまで読んでくださりありがとうございました。^^