今回はIPアドレスブロックのリスクを回避するIP分散・IP自動ローテーションのテクニックをご紹介します。テクニックと言っても実際には、スクレイピングのコードに数行追加するだけの簡単な作業なので覚えておくと必ず役に立ちますよ。
IPアドレスを隠す4つの方法
IPアドレスを変える方法はいくつかありますが、スクレイピング時に使える方法を4つご紹介します。これだけ覚えておけばIPアドレスのブロックに悩まされる事は格段に減ると思います。
プロキシサービスを使う
有料プロキシサービスの中には、アクセスの度に自動でIPアドレスを変化させる機能を提供しているサービスもあります。僕が使っているのはbrightdata.comですが探せば類似サービスもあるかもしれません。
プランはいくつかありますが僕が使っているのは月額$0.5の激安なのに、日本のIPアドレスをアクセス毎に自動変更してくれるので大満足しています。
登録&設定方法
■ brightdataにアクセスして会員登録する
■ アカウントを作成するのでそれぞれ入力する
first name:名前
last name:苗字
work email:メールアドレス
campany size:従業員数(個人なら1人)
vertical:業種的な(今回はスクレイピング)
■ アカウントのパスワードを設定する
■ 下記の画面に移行後、認証メールが届くので確認する
■ メールの認証ボタンを押す、迷惑メールに振り分けられる事もあるので要確認
■ 使用プランを聞いてくるので一番安い「web unlocker」を選択
■ さっそく使ってみよう、みたいに言ってくるけど無視する
■ クレジットカードかネット決済サービスで本人確認を行う、ちなみに僕はpaypalで登録してます。今登録すると5ドル分のチャージが貰えるみたいで、安いプランならこれで10か月も使える。
■ 登録は終わったのでゾーンを作る
■ ここで色々設定できるので、慣れてきたら試してみるとより便利になると思います。
■ ゾーン作成の確定ボタン、これを押すとチャージが消費され始めます。
■ 新しくゾーンができたのを確認
■ ナビメニューの「proxy&web unlocker API」を開く
■ 各言語のサンプルコードが掲載されてるのでこれでプロキシをテストできます。「例を選択」で入門的な内容から、並列処理のサンプルまであるので勉強になる
brightdataを刺してseleniumでスクレイピングしてみる
次にpythonスクレイピングで一般的に用いられる、ブラウザ操作ライブラリseleniumにbrightdataをプロキシとしてスクレイピングを行うサンプルコードを書いてみます。
brightdata+seleniumで気を付けるポイントは、ヘッドレスモードを使うか使わないかで求められる動作が異なる点です。「seleniumのヘッドレスモードで認証付きプロキシを刺す方法」でも書きましたが、ヘッドレスモードの場合はseleniumでは認証ポップアップの入力を行えないため、brightdataのプロキシマネージャーを事前に起動して認証済み状態を維持する必要があります。
一方、ヘッドレスモードを使わない場合は、認証ポップアップの入力をPyAutoGUIなどのRPAライブラリを使用して入力する動作が必要になります。
通常モード+brightdata
下記のサンプルはbrightdataの認証入力をpyautoguiというユーザー入力を言語化するライブラリを使用して行っています。RPAライブラリなら何でも良さそうですがメジャーなやつで試しました。
動作はこんな感じ。
from selenium import webdriver
from fake_useragent import UserAgent
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from webdriver_manager.chrome import ChromeDriverManager
import pyautogui
target_url = "https://ipinfo.io"
proxy_username = "brightゾーンユーザー名"
proxy_password = "brightゾーンパスワード"
#ドライバ設定
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=zproxy.lum-superproxy.io:22225")
options.add_argument('user-agent='+UserAgent().random)
capabilities = DesiredCapabilities.CHROME.copy()
capabilities['acceptInsecureCerts'] = True
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options, desired_capabilities=capabilities)
driver.implicitly_wait(10)
#url開く
driver.get(target_url)
#認証入力操作
pyautogui.typewrite(proxy_username)
pyautogui.press('tab')
pyautogui.typewrite(proxy_password)
pyautogui.press('enter')
ヘッドレスモード+brightdata
■ まずはbrightdataからプロキシマネージャーをダウンロードします。
■ 画面が切り替わるのでインストーラーをクリックしてダウンロード
■ ダウンロードしたインストーラーを起動
■ インストールが始まるので待つ
■ インストールが終わるとプロキシマネージャーが立ち上がる、プロキシを使用する間はこれを常に起動しておく。消しちゃダメ
■ 同時にブラウザが立ち上がってプロキシの設定や通信内容を確認できるページが開く、こっちは邪魔なら消してよし
これで準備完了、ヘッドレスモードのseleniumにプロキシを刺してテストしてみます。
from selenium import webdriver
from fake_useragent import UserAgent
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from webdriver_manager.chrome import ChromeDriverManager
target_url = "https://ipinfo.io"
#ドライバ設定
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument("--proxy-server=http://127.0.0.1:24000")
options.add_argument('user-agent='+UserAgent().random)
capabilities = DesiredCapabilities.CHROME.copy()
capabilities['acceptInsecureCerts'] = True
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options, desired_capabilities=capabilities)
driver.implicitly_wait(10)
#url開く
driver.get(target_url)
print(driver.page_source)
Tor(トーア)を使う
一時期ダークウェブという単語と共に報道されたりしていましたが、Tor自体は「匿名通信システム」という技術であり違法性はないそうです。プロキシの形で通信に刺す事もできるので、ローカルのIPアドレスを隠してサイトにアクセスできます。
無料かつ強力な隠匿効果がありますが、あまりにもTorが有名になってしまったのか大きなサイトではTor対策は普通に行われている様子で、Tor経由では逆にアクセスできないパターンもありました。
インストール方法
ここではwindowsでのインストール手順について解説します。その他のOSを使っている場合は「Tor (OS名) インストール」とかでググって下さい。
■ まずは公式サイトよりTorの本体ファイルをダウンロードする
■ ダウンロードしたファイルを開く
■ 言語に日本語を選択しOKをクリック
■ 初期設定だとデスクトップにTorの本体がインストールされて邪魔なので場所を変える
■ Cドライブを選択
■ インストール先がCドライブになっている事を確認してインストールボタンをクリック
■ インストールが実行されるので終わるまで待つ
■ インストールが終わったら完了ボタンを押す
Torを刺してseleniumでスクレイピングしてみる
スクレイピング時にTorを経由するには2手必要で、
①インストールしたTorを起動する
②「socks5://127.0.0.1:9050」をプロキシとして設定する
でプロキシが刺さります。
プロキシの設定はライブラリ毎に異なるので使っているやつのプロキシオプションを調べてみて下さい。下記のサンプルコードではrequestsライブラリを使用してスクレイピングテストを行っています。
import requests
target_url = "https://ipinfo.io"
#target_url = "https://yahoo.co.jp"
#target_url = "https://www.amazon.co.jp/"
proxies = {
'http':'socks5://127.0.0.1:9050',
'https':'socks5://127.0.0.1:9050'
}
res = requests.get(target_url, proxies=proxies)
res.encoding = res.apparent_encoding
print(res.text)
無料プロキシを使う
自分のIPアドレスを隠すだけなら無料プロキシを使う方法もあります、検索すればすぐ出ますが有名なのはfreeproxylists.netでしょうか。無料である事以外に良い事はなく、セキュリティ・通信速度・使用期間すべて期待できないです。
正直オススメの方法ではないですが、コードのテスト時など使い捨てのつもりでちょこっと使ったりしてます。
モバイルwifiを使う
未検証の案で申し訳ないですが、モバイルwifiでは自動でIPアドレスを変化させたり更新するプランがあったりするみたいです。ただIPアドレスの更新頻度やタイミングを調べないと、スクレイピング用のIPとして有用かは未知数です。
すでにモバイルwifiを使っていてスクレイピングにチャレンジしようと考えている方は、プロキシを準備しなくても大丈夫かもしれませんよ、程度の話かもしませんね。
まとめ
IPアドレスを隠匿する方法として4つご紹介しました。実際にはTorとbrightdataの2つで事足りると思いますが、スクレイピングなどでアクセス元を隠したい場合などに参考にしてみて下さい。
分からない事や依頼があれば受け付けてますんでお問い合わせからご連絡下さいm(_ _)m
個人開発プログラマーを応援するメンバーシップを始めました('ω')ノ
質問・要望・共同作業など、みんなのやりたい事をスマイルがお手伝いします。立ち上げたばかりでよく分かってないので、とりあえず何でもありやってみます。
コメント
はじめまして。ブログ内のコードにある”brightゾーンユーザー名”と”brightゾーンパスワード”はサイトにログインするものとは別ですよね?
管理人のスマイルです(‘ω’)ノ
> サイトにログインするものとは別ですよね?
そうです、ゾーンのユーザー名とパスワード名の事です。
よろしくお願いしますm(_ _)m
スマイルさん
ご返答ありがとうございます。すっかり見落としていました😂
質問よろしいでしょうか。
BrightDataにつきまして、「月額$0.5の激安なのに、日本のIPアドレスをアクセス毎に自動変更してくれる」と書かれておりますが、選択するIPアドレスを日本に限定するにはどのように設定をすれば良いでしょうか。
「Zone details」の「IP Type」のところで、「Shared (Pay per IP)」を選択するしかないのでしょうか。この場合だと、「IP pool size」の数によって追加で月額がかかってしまうようです。
やりたいこととしては、Pythonを起動させるたびに異なる日本のIPアドレスになるようにしたいのですが、わりと頻繁にPythonを起動するため、「IP pool size」の数を大きくすると結構なコストになってしまうなということで悩んでおります。
何か分かることがありましたら返信いただけますと幸いです。何卒よろしくお願いいたします。
初めまして、管理人のスマイルです(‘ω’)ノ
>選択するIPアドレスを日本に限定するにはどのように設定をすれば良いでしょうか。
うろ覚えで申し訳ないですが、プロキシのエンドポイントにアクセスする際色々とパラメータを設定できたと記憶しています。
その中に出口ノードを「country-jp」みたいな形で指定できた気がするので試してみて下さい。
参考:https://help.brightdata.com/hc/en-us/articles/4413160376209-How-can-I-select-the-exit-node-country-of-the-peer-IP-using-API-
よろしくお願いしますm(_ _)m
早速お返事いただき、誠にありがとうございます。
いろいろと設定ができるんですね!試してみます。
月額$0.5ではなくなりましたか?
まだ同じ月額ならリンクを頂きたいです(´・ω・`)
管理人のスマイルです(‘ω’)ノ
>月額$0.5ではなくなりましたか?
僕のアカウントも$0.5プランが使えなくなって高いプランに誘導されてますね。
確認中ですが、会員が増えて回収ステージに移行したかもしれません。
差し支えなければTorでいいんじゃないかと笑