【python】seleniumとfirefoxを使って、IP変更しながら実行
【今回の要件】
・Webページにアクセスするときにアクセス元IPを変更する
・javascriptで動いてるページのHTMLソースを取得する
【環境】
・windows 7
・python 3.7
・Firefox 75.0
・selenium 3.141.0
【アドオン】
Touch VPN
※Firefox addon
1.プロファイル準備
①プロファイル指定
管理しやすいように別のプロファイルを作成する。
(1) Firefox のアドレスバーに about:profiles と入力して Enter キーを押す。
(2) プロファイルマネージャーが開いたら、「Create a New Profile」を選択
(3) わかりやすい名前のプロファイル名を指定して作成。
(4) 作成後、表示されたルートディレクトリーのパスをメモしておく。
②新しいプロファイルで起動
(1) Firefox の実行ファイルのショートカットを作成。
(2) ショートカットのプロパティを開き、[ショートカット]タブ – [リンク先] の末尾に「-p PROFILE_NAME
」を追加(頭に半角スペースが1つ必要)。PROFILE_NAME
は文字通り「プロファイルの名前」で、プロファイルの情報に表示される名前(例:”default”)。
③IP変更できるアドオンを追加
今回使ったのは「Touch VPN」
アクセスして、拡張機能を追加。
これで、新しく作ったプロファイルを指定して実行したら、touch VPNが入った状態のFirefoxブラウザが立ち上がる。
2.ドライバーのダウンロード
①Firefox用のwebdriverをダウンロードする。
https://github.com/mozilla/geckodriver/releases
自分の環境にあったやつでOK。
とりあえず自分は最新の「geckodriver-v0.26.0-win64.zip」をGET。
②ダウンロードしたら、解凍。
「geckodriver.exe」ができるので、そのファイルを今回コードを
書く場所に置いておく。
3.ライブラリーインストール
今回当たり前に使う「selenium」と
拡張機能をONするために使う「pyautogui」をインストールする
pip install selenium
pip install pyautogui
4.実行コード
# ライブラリの読み込み
import time
import pyautogui
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
# Selenium起動オプション
options = Options()
#options.add_argument('-headless') #ヘッドレスモードを有効にするときはここをコメントアウト #ただし、pyautoguiは使えない
#プロファイル設定(1.準備で作成したプロファイルを指定)
firefox_profile = webdriver.FirefoxProfile('D:/Users/●●●/AppData/Roaming/Mozilla/Firefox/Profiles/haab99oo.switch_user')
# firefoxドライバーの起動(2.ドライバーのダウンロードで設置したパスを指定)
DRIVER_PATH = "./geckodriver.exe"
driver = webdriver.Firefox(executable_path=DRIVER_PATH,firefox_profile=firefox_profile,firefox_options=options)
driver.set_window_size(800,900)
driver.set_window_position(0,0)
#拡張機能ON(自分のブラウザの拡張機能の位置を指定する:ピクセル定規とかつかうとすぐ)
time.sleep(2)
pyautogui.click(730, 60, 1, 1, 'left')
time.sleep(1)
# ポップアップ内クリック
pyautogui.click(560, 380, 1, 1, 'left')
time.sleep(3)
#フォーカス外す
pyautogui.click(100, 500, 1, 1, 'left')
def main():
# アクセス
url = 'https://www.ugtop.com/spill.shtml'
driver.get(url)
driver.implicitly_wait(5)
print(driver.page_source)
if __name__ == '__main__':
main()