MENU

requestsの403 Forbiddenを突破せよ!User-Agent偽装でWebスクレイピングを成功させる道

「また…403 Forbidden」

画面に表示されたその数字の羅列を見るたび、私の胸は鉛のように重くなった。副業でWebスクレイピングによるデータ収集を始めてから、早数週間。意気揚々とPythonのrequestsライブラリを叩き、いざ特定のサイトから情報を取得しようとするたびに、この呪われたエラーコードが立ちはだかるのだ。

「もうダメかもしれない…」見えない壁に阻まれた私の焦燥

あの時の私は、まるで深い霧の中に一人取り残されたような気分だった。家族のために少しでも家計の足しになればと、休日を返上してプログラミングを学んだ。ようやく形になりそうなデータ収集のアイデアも浮かんだのに、肝心のデータが手に入らない。

「どうして僕だけこんなに壁にぶつかるんだ?」

何度もコードを見直し、インターネットで解決策を探した。タイムアウト設定、リトライ処理、IPアドレスの変更…ありとあらゆる「一般的な解決策」を試したものの、結果はいつも同じ。403 Forbidden。アクセス拒否。

夜遅くまでPCの前に座り込んでは、ため息ばかり。妻が「大丈夫?」と声をかけてくれるたびに、情けない自分が嫌になった。「このままじゃ、せっかくのチャンスを逃してしまう…」「家族に申し訳ない…」そんな心の声が、私の自信を蝕んでいく。まるで、目の前に宝の山があるのに、透明な壁に阻まれて一歩も近づけないような、そんな絶望感に苛まれていた。

転機は突然に。「パスポート」を変えれば入国できる?

完全に諦めかけていたある日、学生時代からのプログラマーの友人に愚痴をこぼした。彼から返ってきたのは、拍子抜けするほどシンプルな一言だった。

「ああ、それ、User-Agentを変えてみたら?」

User-Agent?耳慣れない単語に首を傾げる私に、彼は続けた。

「Webサイトはね、君のアクセスが『人間』からのものか、『プログラム(ボット)』からのものかを判断してるんだ。デフォルトのrequestsのアクセスは、まるで『身分不詳の旅行者』みたいなもの。だから、サイト側はセキュリティのために『入国拒否(403 Forbidden)』するんだよ。ちゃんとした『パスポート』、つまりブラウザと同じUser-Agentを提示すれば、あっさり通してくれることが多いんだ。」

彼の言葉は、私の頭の中に一筋の光を差し込んだ。まるで、見えない壁の正体がようやく分かったような気がした。

見えない「入国審査官」を欺く、たった一行のコード

Webサイトがアクセスを拒否する主な理由は、サーバー負荷の軽減、コンテンツの保護、悪意のあるスクレイピングからの防御だ。requestsライブラリのデフォルトのUser-Agentは「Python-requests/2.x.x」といった形式で、これが「ボット」と認識されやすい。これでは、まるで「私はプログラムです!」と自己紹介しているようなものだ。サイト側からすれば、怪しむのも当然だろう。

解決策は、この「自己紹介」を偽装することにある。具体的には、Webブラウザ(ChromeやFirefoxなど)が使っているUser-Agent文字列をrequestsのリクエストヘッダーに含めるのだ。これは、Webサイトの「入国審査官」に対して、「私はちゃんと身元がはっきりした人間ブラウザですよ」と偽のパスポートを提示するようなものだ。

“`python

import requests

url = ‘https://example.com’ # アクセスしたいWebサイトのURL

ブラウザのUser-Agentを偽装するヘッダー情報

headers = {

‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36’

}

ヘッダー情報を含めてリクエストを送信

response = requests.get(url, headers=headers)

ステータスコードを確認

print(f”ステータスコード: {response.status_code}”)

成功した場合、コンテンツを表示

if response.status_code == 200:

print(“アクセス成功!コンテンツの一部: “)

print(response.text[:500]) # 最初の500文字を表示

else:

print(“アクセス失敗。ステータスコードを確認してください。”)

print(response.text) # エラーレスポンスを表示

“`

上記のコードのUser-Agent文字列は、お使いのブラウザ(Chromeなど)で「開発者ツール」を開き、「Network」タブで任意のサイトにアクセスした際のリクエストヘッダーから簡単に取得できる。この一行の変更が、私の世界を大きく変えたのだ。

絶望から解放へ。たった一行がくれた「光明」

友人のアドバイス通り、私はすぐにコードを修正した。恐る恐るスクリプトを実行する。すると、どうだろう。

「ステータスコード: 200」

そして、その下には、これまでどんなに願っても手に入らなかったWebサイトのコンテンツの一部が、確かに表示されているではないか!

あの時の感動は、今でも忘れられない。まるで、長いトンネルを抜けて、ようやく光が差し込んできたような感覚だった。「やった!」「できたんだ!」私は思わず声を上げていた。数週間にも及ぶ焦燥と絶望が、一瞬にして安堵と達成感に変わったのだ。妻も、私の興奮した様子を見て、一緒に喜んでくれた。

この経験を通して、私は一つの大切な教訓を得た。それは、目の前の大きな壁にぶつかった時、表面的な解決策ばかりを追い求めるのではなく、その「壁」がなぜ存在するのか、その「ルール」を理解しようと努めることの重要性だ。

もちろん、User-Agentの偽装は、あくまで一時的な対策であり、サイトによってはさらに複雑な認証や対策が施されている場合もある。また、Webスクレイピングを行う際は、対象サイトの利用規約を遵守し、サーバーに過度な負荷をかけないよう、倫理的な配慮が不可欠だ。しかし、この知識が、かつての私と同じように見えない壁にぶつかり、諦めかけている誰かの助けになれば、これほど嬉しいことはない。

あの時の私は、確かに絶望の淵にいた。しかし、たった一行のコードと、その裏にある仕組みを理解する知恵が、私をその闇から解放してくれたのだ。あなたの目の前にある「403 Forbidden」も、きっと突破できる。