2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ただpythonでhtmlリクエストしたかっただけなのに躓いたので、解決までをメモ

Posted at

はじめに

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を見て対策するところもあるようなので、このケースがありうることを覚えておきたい

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?