見出し画像

【Python】Instagramに自動ログインしてみる(M1 Mac)

見出しの画像ですが、『ニシタロウ|スキマで向上ノート』 さんの記事を参考に作成させていただきました!

こういうの非常にありがたいです!
他のデザインも色々作ってみようと思います!


ということで本題に入ります。

まずは準備から

ちなみにブラウザはGoogle Chromeで行います。

準備

■Seleniumのインストール

SeleniumとはWebブラウザで行うクリック操作やキーボード入力などをプログラム上から自動で操作できるようにしたライブラリのこと

Jupyter NotebookでもターミナルでもOKです。

pip install selenium


■ChromeDriverのインストール

ChromeDriverとはChromeをプログラムで動かすためのドライバー

Homebrewでインストールしました。

brew install chromedriver

たったこれだけです。
こんな感じの実行結果が出ればOKです。

Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
Updated 182 formulae.

==> Tapping homebrew/cask
Cloning into '/opt/homebrew/Library/Taps/homebrew/homebrew-cask'...
remote: Enumerating objects: 581133, done.
remote: Counting objects: 100% (63/63), done.
remote: Compressing objects: 100% (33/33), done.
remote: Total 581133 (delta 32), reused 60 (delta 30), pack-reused 581070
Receiving objects: 100% (581133/581133), 255.85 MiB | 3.40 MiB/s, done.
Resolving deltas: 100% (410425/410425), done.
Tapped 3946 casks (4,026 files, 274.5MB).
==> Downloading https://chromedriver.storage.googleapis.com/91.0.4472.101/chrome
######################################################################## 100.0%
==> Installing Cask chromedriver
==> Linking Binary 'chromedriver' to '/opt/homebrew/bin/chromedriver'
🍺  chromedriver was successfully installed!


動作確認

※SeleniumもChromeDriverも最新であることが重要です。

from selenium import webdriver

# CHromeが開く
browser = webdriver.Chrome()

sample.pyという名前で保存したとすると、
ターミナルで以下のコマンドを実行してみてください。

python sample.py

画像1

新しくChromeが立ち上がればOKです。

ちょっとここでハマったのですが、
アラート表示されて実行エラーになりました。
(具体的には、悪質かどうかの判断ができないから開けないという旨のアラートでした)

解決方法ですが、
一度ChromeDriverを手動で開く必要があります。
(Control + クリック → 開く)

その上で、再度プログラムを実行するとうまくいきました。


自動ログイン実装

先にサンプルコード載せちゃいます。

from selenium import webdriver
from time import sleep

# login情報
insta_username = 'ユーザー名';
insta_password = 'パスワード';

# Chromeを開く
browser = webdriver.Chrome()

# Instagramのログインページを開く
url = 'https://www.instagram.com/accounts/login/'
browser.get(url)

# 5秒待つ
slepp(5)

# username
elem_username = browser.find_element_by_name('username')
elem_username.send_keys(insta_username)

# password
elem_password = browser.find_element_by_name('password')
elem_password.send_keys(insta_password)

# Pythonでログイン
elem_login_btn = browser.find_element_by_css_selector('.sqdOP.L3NKy.y3zKF')
elem_login_btn.click()

かなりシンプルかと思います。

先程の動作確認でChromeを起動することはできたので、
次にInstagramのログインページを開く必要があります。

# Instagramのログインページを開く
url = 'https://www.instagram.com/accounts/login/'
browser.get(url)

brower = webdriver.Chrome()なので、1行で表すと
webdriver.Chrome().get('https://www.instagram.com/accounts/login/')
になります。

続いて、ユーザー名とパスワードを該当の箇所にそれぞれ入力していきます。

# username
elem_username = browser.find_element_by_name('username')
elem_username.send_keys(insta_username)

# password
elem_password = browser.find_element_by_name('password')
elem_password.send_keys(insta_password)

検証モードを開いて、ユーザー名とパスワードの要素を確認します。

画像2

idがないので、nameで指定(find_element_by_name('username'))
パスワードも同様にnameで指定(find_element_by_name('password'))

それらに対して、設定したユーザー名とパスワードをそれぞれ入力していきます。(send_keys())

ログインページが完全に開く前に、
send_keysが実行されてしまうと正確に入力されない可能性があるので、sleep(5)で後続処理を5秒待つようにしています。


ここまででユーザー名とパスワードの入力が完了したので、
次に必要なのはログインボタンのクリックです。


Instagram然り他のSNSでもそうですが、
html要素にid属性がなくて特定しにくくしていたり、
複数存在するクラス名の間にスペースがたくさん入っていたりします。

理由はこういった自動処理の防止策のようです・・・

ちなみに「いいね」や「フォロー/アンフォロー」の自動化は禁止されているみたいですが、「ログイン」については特に問題ないようです。


クラス名からログインボタンの要素を取得しました。
クラス名が複数ありスペースもありましたが、
「.」をつけることで取得ができるようです。

# Pythonでログイン
elem_login_btn = browser.find_element_by_css_selector('.sqdOP.L3NKy.y3zKF')
elem_login_btn.click()

ちなみに、PythonプログラムでJavaScriptのプログラムを実行させてボタンをクリックさせることもできます。

※ログインボタンより上にボタンタグがあったので、2番目のボタンとしています(("button")[1])

# JavaScriptでログイン
js = 'document.getElementsByTagName("button")[1].click();'
browser.execute_script(js)

こっちのコードでも動作確認できています。



要素の取得の方法はいくつかありますし、
正解は1つではありませんが、一つの例として参考になればと思います。

最後まで読んでくださってありがとうございます!


この記事が気に入ったらサポートをしてみませんか?