見出し画像

【Pythonを使ったInstagramのいいね操作自動化 プロセス-その1-]sereniumインストール/ブラウザの起動編

Pythonを使ってInstagramのいいね操作自動化を行いたいと思い、様々なサイトを参考に作業を行ったのですが中々上手くいかなかったので、
・失敗となったコード
・失敗した原因
・自分なりに情報を集めて組み直したプログラム
・なぜこのようなコードになっているか
をまとめていきたいと思う。

『selenium』『Webdriver』のインストール

まずPythonを使ってブラウザを操作する上で必要なのが『Selenium』というツールが必要になってくる。
またブラウザを操作するために『Webdriver』もインストールが必要。
※『Webdriver』は使用するブラウザ(GoogleChrome、Safariなど)によって異なる。
今回はGoogleChromeを使用するため、『ChromDriver』をインストールする。

『Selenium』は環境下でダウンロードの仕方が変わってくる。

 #pipの場合 
$ pip install selenium
$ pip install python-chromedriver-binary
 #anacondaの場合 
$ conda install -c conda-forge selenium
$ conda install -c conda-forge python-chromedriver-binary

今回はAnaconda環境での構築となるので、『condaコード』を使ったダウンロードを行う。
※いろいろなサイトで調べた所、Anaconda環境とpipでのダウンロードは相性は悪いらしく、condaでのダウンロードが推奨されていた。

ブラウザは定期的にバージョンが更新されるため、その度にそれに合わせた『Webdriver』をインストールしないといけない。その手間を解消してくれるのが『webdriver-manager』である。インストール方法は下記の通り。

 #pipの場合 
$pip install webdriver_manager
 #anacondaの場合 
conda install -c conda-forge webdriver-manager

ちなみに『conda-forge』というのは、github上で組織されているコミュニティ主体のパッケージコレクションである。

【Python】condaとpipの違いは? パッケージのインストール方法を解説

出典元

ライブラリ(Webdriver,Chromedrive,Webdriver-manager)のインポート

インストールした『WebDriver』を使用するにはインポートする必要がある。インポートするためのコードは下記の通りである。

import chromedriver_binary
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

今回インポートするに当たって失敗した例をいくつか記載する。

import python-chromedriver-binary
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

※『python-chromedriver-binary』でインストールしたので、そのままの名称でインポートしようとした。

import chromedriver
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

※『chromedriver』のみでインポートしようとした。

import chromedriver-binary
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

※インストールの際、chromedriverとbinaryの間は『- (ハイフン)』だった為、上記のように入力したのですがこちらもエラーが出てしまい、インポートできなかった。
正しくインポートするためにはchromedriverとbinaryの間は、必ず『_ (アンダーバー)』にする必要がある。

ブラウザの起動、問題の発生

WebDriverのインスタンスを作成しブラウザを起動、指定のURLを開く。
※今回はInstagramのログイン画面を開きます。
※URLを指定する際は、get後の()内に『” セミコロン』で閉じる。

# ブラウザを起動
driver = webdriver.Chrome()
# 指定のURLを開く
driver.get("https://www.instagram.com/accounts/login/")

上記の様に入力した所、指定のURLを一瞬開いて閉じてしまった。
ターミナルで直接入力する対話形式では問題なく指定ページ開いたままになるのだが、作成したPythonデータを読み込み走らせると一瞬だけ開いて閉じてしまう。
原因として考えたのは、

  • WebDriverの問題(バージョン等)

  • ターミナルの問題

  • クラッシュを起こしている

しかし、WebDriverのバージョンアップやターミナルをbashからzshに切り替えるなど行ってみたが改善されない。

さらに原因を考えてみた所、ターミナルで直接入力する対話形式の場合はターミナルを開いてる間(Pythonを起動している間)はプログラムを起動したままになるが、作成したPythonデータを読み込み走らせる場合はコーディングしたプロセスを終えるとプログラムが終了するのではないかと思い、
timeライブラリの『sleep』という関数を使って、ブラウザを開いている時間を調整できるか試してみた。
※今回は開いている時間を3秒に設定してみた。

# timeライブラリのインポート
import time #sleep関数の使用 ()内に
time.sleep(3)

これまでの内容をまとめた上で実装すると以下の様になる。

# selenium、chromedriver、webdriver-managerのインストール
$ conda install -c conda-forge selenium
$ conda install -c conda-forge python-chromedriver-binary

#各ライブラリのインポート
import chromedriver
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time

# ブラウザを起動
driver = webdriver.Chrome()

#time.sleep()を使って指定時間の間ブラウザを開いた状態にする
time.sleep(3)

# 指定のURLを開く
driver.get("https://www.instagram.com/accounts/login/")

こちらのプログラムを走らせた所、
見事に指定時間の間(3秒間)ブラウザを開くことができた。
つまりプログラムを起動している状態を維持する必要がある様だ。

Chrome は生存させたまま chromedriver プロセスに終了してもらう。

調べた所、chromedriveのOptionsを使うことによって、Chrome は生存させたまま chromedriver プロセスに終了させることが可能とのこと。
『detach』というオプションを有効にする ことで実現ができます。『detach』とは『切り離す』という意味なので、『webdriveによってブラウザを立ち上げたをdetachで切り離して、ブラウザ単体で生存させる』というプログラムかと思われる。

Python Seleniumで処理後コンソールを消してそのままChromeを使用し続ける方法

出典元

chromedriver の detach オプションを有効にする

chromedriveのOptionsを使うには、Optionsをインポートする必要がある。

from selenium.webdriver.chrome.options import Options

まずoptionsをインスタンスし、さらにdetachオプションを有効にし、最後にchromedriverにoptionを適用させたwebdriverをインスタンスさせる。

# optionsインスタンスを生成する。
options = Options()

# optionsのdetachを有効(true)にする。
options.add_experimental_option('detach', True)

# chromdriverにoptionsを適用させ、drive変数にwebdriver.Chromeをインスタンスさせる。
driver = webdriver.Chrome(options=options)

ーインスタンスとは何か?

まとめ

以上のことをまとめてコードを書くと以下の様になる、

#URLの定義(instagramログイン画面
URL = "https://www.instagram.com/accounts/login/"

from selenium import webdriver
import chromedriver_binary
from webdriver_manager.chrome import ChromeDriverManager
#オプションをインポートする
from selenium.webdriver.chrome.options import Options

# ブラウザを開いたままにする(detachオプションを使用)
options = Options()
options.add_experimental_option('detach', True)

# ブラウザを起動(webdriver.Chromeをインスタンスする)
driver = webdriver.Chrome(options=options)

# 指定のURLにアクセス
driver.get(URL)

このプログラムを走らせた所、問題なくブラウザを開き指定のURLを開きつづけることができた。

次回からは、IDとパスワードを入力しログインするプログラムを実装していく。

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