はじめに
webスクレイピングするための前準備として、あるサイトのhtmlコンテンツを取ろうとしたらいきなり403エラーを吐かれたので、解決方法をメモしておく
発生した事象
import requests
def RequestUrl(url: str) -> requests.Response:
return requests.get(url)
ざっくりとURLを渡してリクエストするコードで、スクレイピングしたいサイトを渡したところ、403 Forbidden が返ってくる
さっそく結論
User-Agentを指定していなかった。より詳しくいうと、未指定の場合にpythonからリクエストする際にデフォルトで入る"User-Agent": "python-requests/x.xx.x"
の場合に403を返されていた。
はじめに自分のuser-agentをコンソールからnavigator.userAgent
で調べて貼り付けていたが、試しに空文字を入れても200で返ってきた
requests.get(url, headers={'User-Agent': ''})
これでも大丈夫だった
ユーザーエージェント・スニッフィング
ブラウザーを優遇するためにユーザーエージェント文字列を利用して機能の制限やアクセス可否の判定を行うことは、「ユーザーエージェント・スニッフィング」と呼ばれている。リクエストしようといたサイトでブラウザかスマホかの判定をしていて、python-requestsだとはねられたのかもしれない
新しいユーザーエージェント判別方法:User-Agent Client Hints
余談で、自分で簡単に書き換えられてしまうUser-Agnetに代わり、偽装が困難なUser-Agent Client Hints(UA-CH)が仕様策定中らしい
おわりに
実験でいくつか別のサイトのURLを入れてみたが、UAで403が返ってきたのは目当てのサイトくらいだった。このケースはかなりレアだとは思うが、サイトによってはスクレイピングを防ぐために意図的にUAを見て対策するところもあるようなので、このケースがありうることを覚えておきたい