背景
スクレイピングをする際にnordvpnのWindowsソフトを使用してPCをVPNを繋いでいた
この方法だとスクレイピングではない通信もVPN経由となる為、通信速度が遅くなったりゲームとの接続が切れたり、Googleに接続できないなどの問題に悩まされる。その解消方法の一案としてスクレイピングをNordVPNのProxy経由で行うことにした。
こうすることによりスクレイピングしながらも普通にゲームが出来てGoogle検索もできるのでHappy
手順
使用するDocker Image
Docker hubにあるjeroenslot/nordvpn-proxyを使用する。github
ユーザー名とパスワードを取得する
サービス -> NordVPN -> 手動設定より、ユーザー名とパスワードを取得する。
Docker準備
Dockerより最新のDockerをダウンロードしてインストールする。
インストール直後、dockerコマンドが使用できなかったら再起動するとdockerコマンドが使えるようになる。使えなかったら手動でパスを通してみてください。
コマンド
docker run -d \
--cap-add=NET_ADMIN \
--name=vpn \
--dns=103.86.96.100 \
--dns=103.86.99.100 \
--restart=always \
-e "USERNAME=<nordvpn_username>" \
-e "PASSWORD=<nordvpn_password>" \
-e "LOCAL_NETWORK=192.168.1.0/24" \
-v /etc/localtime:/etc/localtime:ro \
-v ovpn-data:/app/ovpn/config \
-p 8118:8118 \
jeroenslot/nordvpn-proxy:latest
ここで使用するusernameとpasswordは一つ前の箇所で取得したものを使用する。
これで、 http://localhost:8118 をproxyとして設定すればnordvpnの接続ができる。
環境変数について
-
USERNAME
アカウントのユーザー名 -
PASSWORD
アカウントのパスワード -
LOCAL_NETWORK
- ローカルIPネットワークのCIDRマスク(例: 192.168.1.0/24 または 10.1.1.0/24、または複数のネットワーク 192.168.1.0/24,10.1.1.0/24,172.16.2.0/24)。これはクライアントに応答するために必要です。 -
CRON
この変数を設定して、デフォルトの15分ごとのチェックを変更できます。これは、LOADがまだOKかどうかを確認するために使用されます。この設定はCRON構文を使用して変更できます。 -
LOAD NordVPN
サーバーのロードが75を超える場合、OpenVPNが再起動され、推奨サーバーに接続されます!このチェックはCRONによって15分ごとに行われます。 -
RANDOM_TOP
任意 設定すると、推奨サーバーの上位"x"個からランダムに選択します。有効な値は1からnordが持つサーバー数までの整数です。 -
COUNTRY
任意 NordVPNがサポートする2文字の国コードを使用して、任意の国を選択できます。 -
PROTOCOL
任意 デフォルトはtcpに設定されており、udpに変更できます。 -
SERVER
任意 設定しない場合、推奨サーバーに接続します。設定すると、指定したサーバーに接続します。サーバー名の形式例: us2484.nordvpn.com。 -
REFRESH_TIME
任意 デフォルトは120分です。設定した分数後にのみNordVPN OVPNファイルを再ダウンロードします。
※Joentje/nordvpn-proxyのEnvironment Variablesより自動翻訳して引用。
動作確認 / 実際のスクレイピングで使用する方法
curl
# proxy無しでIPアドレスを取得
curl https://ifconfig.me
# 経由でIPアドレスを取得
curl -x localhost:8118 https://ifconfig.me
これで二つのIPアドレスが異なっていればOK
python requests
import requests
proxies = {
"http": "http://localhost:8118",
"https": "http://localhost:8118",
}
response = requests.get('https://ifconfig.me')
print(response.text)
response = requests.get('https://ifconfig.me', proxies=proxies)
print(response.text)
これで二つのIPアドレスが異なっていればOK
python selenium
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
driver_path = "driverのpath"
service = Service(executable_path=driver_path)
options = webdriver.EdgeOptions()
options.add_argument(f'--proxy-server={proxy_address}')
driver = webdriver.Edge(service=service, options=options)
※自分がEdgeを使用しているのでwebdriver.EdgeOptions()
とwebdriver.Edge
を使用しています。適宜FirefoxやChrome,Ie,Chromium,Safari等で読み替えてください。
上記のコードでEdgeが起動するはずなので、nordvpnのサイトにアクセスをして、ヘッダーが「無防備」ではなく「保護済み」になってればOK
※IPはマスクしました。
あるいは https://ifconfig.me を開いてIPアドレスを確認してみて、
普通に開いたブラウザでも開いてIPアドレスに差が出ているならOK
応用
docker run -d \
--cap-add=NET_ADMIN \
--name=vpn1 \
--dns=103.86.96.100 \
--dns=103.86.99.100 \
--restart=always \
-e "USERNAME=<nordvpn_username>" \
-e "PASSWORD=<nordvpn_password>" \
-e "LOCAL_NETWORK=192.168.1.0/24" \
-v /etc/localtime:/etc/localtime:ro \
-v ovpn-data:/app/ovpn/config \
-p 8119:8118 \
jeroenslot/nordvpn-proxy:latest
で、 http://localhost:8119 に二つ目のproxyを立てる事が出来ます。
同様に3つ目, 4つ目のproxyも作成することができます。
まとめ
jeroenslot/nordvpn-proxy を使用するとnordvpnのproxyコンテナを作成できます
宣伝(招待リンク)
お友達紹介リンク を使用した登録は下記の特典が付くので、もし検討している方はご一考ください。
- 1年または2年プランを選ぶと3か月分の無料期間
- 1か月プランを選ぶと1か月分の無料期間
がもらえます。
書いていて思いましたが、結構紹介特典がしょぼいのでハピタス経由でダウンロードしてポイント貰った方がお得かもしれません。