見出し画像

【PythonでWebスクレイピング入門】Pythonからプロキシ経由でInstagramデータを入手する

今回やりたい事として、PythonとRequestsを使って対象となるInstagramのJSONデータを入手してみたいと思います。

ご存知の通り、Instagramはスクレイピングなどに対して非常に厳しい制限を設けており、少しでも連続したアクセスなどを行うと自分のIPアドレスが一定の期間利用不可能になってしまいます。この制限で、多くのプログラマが頭を悩ませている部分かと思います。

今回の狙いとして、PythonとRequestsを別途入手するプロキシサーバーを経由し、複数のIPアドレスを切り分けて使う事で、連続してInstagramのデータを入手したいと思います。

注意事項: Instagramはスクレイピングなどを利用規約にて禁止しており、今回の記事ではPythonのお題として取り上げております。これらを利用して運用する事は、利用規約に抵触する可能性が高いので、あくまで自己責任の範囲で行ってください。

【告知】 bosyuでPythonのプログラミングのお手伝いの募集してます

Pythonは手軽に始められる反面、活用できるライブラリなども豊富で、色々と悩んだり壁にぶつかってしまう事があったりすると思います。そんな時は自分のノウハウや英語のスキルを生かしたリサーチ能力を駆使して、全力でお手伝いします!というものです。

このノートを読んで、「こういう応用の仕方はあるのかな?」や「新しくこう言った動作を取り入れてみたんだけど、上手く動かない」と言ったニーズにお答えできるかと思います。詳しくは下記のページにて。

0.まずは環境の準備

今回利用する主なライブラリは下記の通りです。

from bs4 import BeautifulSoup
import requests
import json

1. InstagramページからJSONデータを入手する - 通常の場合

Instagramのページ構造として、投稿等の情報がJavaScript内にJSON形式で埋め込まれているので、こちらはそのJSONデータを取り出す関数モジュールになります。

def get_json_data(url):

   res = requests.get(url)
   html = BeautifulSoup(res.content, 'html.parser')

   pattern = re.compile('window._sharedData = ({.*?});')
   script = html.find("script", text=pattern)
   data = pattern.search(script.text).group(1)
   json_user_data = json.loads(data)

   return(json_user_data)

2. InstagramページからJSONデータを入手する - プロキシ経由の場合

2.0プロキシサーバーを入手する

まず最初にプロキシサーバーを入手します。ネットで検索すると、無料で使えるものや有料のものなど、沢山出てくると思います。今回オススメするのは、Blazing SEOが提供するBlazing Proxiesです。こちらは有料タイプですが、安価で専用のIPアドレスがもらえる事、またロケーションを自由に選べる事が特徴です。

画像1

今回は米国を拠点とするIPアドレスを購入してみたいと思います。こちらのパッケージでは、専用IPアドレスを5個アサインするタイプで、毎月$6(約660円)ととてもお買い得です。

画像2

2日間であれば、無料で試せる期間が提供されていますので、ちょこっと試してみたい!と言う方にはオススメです。

画像3

購入画面にて、CountryUnited StatesTypeDedicatedとします。

画像4

2.1 プロキシのIPアドレスを入手する

購入の手続きが完了すると、下記の様なダッシュボードが表示されるかと思います。

画像5

この画面にあるAssigned Portsにて、今回自分専用にアサインされたプロキシサーバーのIPアドレス、及びポート番号が表示されます。

Blazing Proxiesの認証方法Authorization Typeですが、IPアドレスユーザー名/パスワードの組み合わせと2種類用意されており、今回は後者のユーザー名/パスワードを利用します。こちらを選択する事で、Username / Passwordの項目に自分専用のユーザー名とパスワードが表示されます。なお、こちらの設定が有効になるのは最大30分要する様です。

2.2 購入したプロキシで実際にテストしてみる

さて、実際にPythonで上記のプロキシサーバーが正常に機能しているか、実際にテストしてみたいと思います。今回、自分のIPアドレスがウェブサイト上で分かるこちらのサイトへアクセスしてみます。

画像6

使用するコードはこちらです。

from bs4 import BeautifulSoup
import requests
import json

url = "https://expressvpn.com/what-is-my-ip"

res = requests.get(url)
html = BeautifulSoup(res.content, 'html.parser')
for element in html.find_all('p', class_='ip-address'):
	print(element.get_text())

print(result)

まずはプロキシなしでPythonを実行してみます。

自分のマシンのパブリックIPアドレス

ここで表示されるのが、現在自分のマシン上のパブリックIPとなります。

次は下記のプロキシありのスクリプトでPythonを実行してみます。まず、下記のラインを先ほど購入したプロキシサーバー情報に置き換えてください。

proxies = {
	"http":"http://ユーザー名:パスワード@アサインされたプロキシのIPアドレス:4444",
	"https": "http://ユーザー名:パスワード@アサインされたプロキシのIPアドレス:4444"
}

で、こちらのコードを実行してみます。

from bs4 import BeautifulSoup
import requests
import json

url = "https://expressvpn.com/what-is-my-ip"
proxies = {
	"http":"http://ユーザー名:パスワード@アサインされたプロキシのIPアドレス:4444",
	"https": "http://ユーザー名:パスワード@アサインされたプロキシのIPアドレス:4444"
}

res = requests.get(url, proxies=proxies)
html = BeautifulSoup(res.content, 'html.parser')

for element in html.find_all('p', class_='ip-address'):
	print(element.get_text())

print(result)

そうすると、結果は先ほどの自分のIPアドレスとは異なる、購入したプロキシサーバーのIPアドレスに切り替わっているはずです。

アサインされたプロキシのIPアドレス

このテストで、Pythonのrequestsをプロキシサーバー経由でアクセスできる事が確認できました!

2.3 プロキシを経由してInstagramのJSONデータを取得する【有料】

冒頭にあったスクリプトに、今回のプロキシサーバーを適用した部分を実際に当てはめてみます。

def get_json_data(url):
    proxies = {
       "http":"http://ユーザー名:パスワード@アサインされたプロキシのIPアドレス:4444",
       "https": "http://ユーザー名:パスワード@アサインされたプロキシのIPアドレス:4444"
   }

   res = requests.get(url, proxies=proxies)
   res = requests.get(url)
   html = BeautifulSoup(res.content, 'html.parser')

   pattern = re.compile('window._sharedData = ({.*?});')
   script = html.find("script", text=pattern)
   data = pattern.search(script.text).group(1)
   json_user_data = json.loads(data)

   return(json_user_data)

これで、Pythonのrequestsを使い、プロキシサーバー経由でInstagramへ無事にアクセスできる様になりました。

3. 複数のプロキシサーバーを切り替えてInstagramへアクセスする【有料】

さて、先ほどはBlazing SEOにて購入した専用IPアドレス1つを利用した訳ですが、スクレイピングなどを何度も繰り返しているとプロキシサーバーを経由しているとは言え、利用制限が掛かってしまう可能性が大きいです。

それで、ここから先ほどの5つのプロキシサーバーをフル活用させる関数を書いてみます。

今回の方法としては、リストに登録した5つのプロキシーサーバーより呼び出される度にランダムに一つ抽出すると言うものです。まず、プロキシサーバー情報を下記に格納します。

ここから先は

1,885字

¥ 1,000

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