Python で Urllib HTTP エラー 403 禁止メッセージを解決する

Olorunfemi Akinlua 2023年6月21日
  1. Python の urllib モジュール
  2. robots.txt をチェックして urllib HTTP エラー 403 禁止メッセージを防止する
  3. urllib HTTP エラー 403 禁止メッセージを解決するためにリクエスト ヘッダーに Cookie を追加する
  4. セッション オブジェクトを使用して urllib HTTP エラー 403 禁止メッセージを解決する
Python で Urllib HTTP エラー 403 禁止メッセージを解決する

今日の記事では、禁止されたリソースに直面したときに、request クラスに代わって error クラスによって生成されるエラー メッセージ (例外) urllib.error.HTTPError: HTTP Error 403: Forbidden の処理方法について説明します。

Python の urllib モジュール

urllib Python モジュール は、さまざまなプロトコルを介して Python の URL を処理します。 特定の Web サイトからデータを取得したい Web スクレイパーで有名です。

urllib には、URL の読み取り、解析、および robots.txt などの特定の操作を実行するクラス、メソッド、および関数が含まれています。 requesterrorparserobotparser の 4つのクラスがあります。

robots.txt をチェックして urllib HTTP エラー 403 禁止メッセージを防止する

urllib モジュールを使用して request クラスを介してクライアントまたはサーバーと対話する場合、特定のエラーが発生することがあります。 これらのエラーの 1つは、HTTP 403 エラーです。

URL の読み取り中に、urllib パッケージで urllib.error.HTTPError: HTTP Error 403: Forbidden エラー メッセージが表示されます。 HTTP 403 (Forbidden Error) は、クライアントまたはサーバーが要求されたリソースへのアクセスを禁止していることを示す HTTP ステータス コードです。

したがって、この種のエラー メッセージ urllib.error.HTTPError: HTTP Error 403: Forbidden が表示されると、サーバーはリクエストを理解しますが、送信したリクエストを処理または承認しないことを決定します。

アクセスしている Web サイトがリクエストを処理していない理由を理解するには、重要なファイル robots.txt を確認する必要があります。 Web スクレイピングや Web サイトとのやり取りを行う前に、このファイルを確認して、予期されることを把握し、これ以上の問題に直面しないようにすることをお勧めします。

任意の Web サイトで確認するには、以下の形式に従います。

https://<website.com>/robots.txt

たとえば、YouTube、Amazon、Google の robots.txt ファイルを確認してください。

https://www.youtube.com/robots.txt
https://www.amazon.com/robots.txt
https://www.google.com/robots.txt

YouTube の robots.txt を確認すると、次の結果が得られます。

# robots.txt file for YouTube
# Created in the distant future (the year 2000) after
# the robotic uprising of the mid-'90s wiped out all humans.

User-agent: Mediapartners-Google*
Disallow:

User-agent: *
Disallow: /channel/*/community
Disallow: /comment
Disallow: /get_video
Disallow: /get_video_info
Disallow: /get_midroll_info
Disallow: /live_chat
Disallow: /login
Disallow: /results
Disallow: /signup
Disallow: /t/terms
Disallow: /timedtext_video
Disallow: /user/*/community
Disallow: /verify_age
Disallow: /watch_ajax
Disallow: /watch_fragments_ajax
Disallow: /watch_popup
Disallow: /watch_queue_ajax

Sitemap: https://www.youtube.com/sitemaps/sitemap.xml
Sitemap: https://www.youtube.com/product/sitemap.xml

そこには、多くの Disallow タグがあることがわかります。 この Disallow タグは、アクセスできない Web サイトの領域を示しています。 したがって、それらの領域へのリクエストは処理されず、禁止されています。

他の robots.txt ファイルでは、Allow タグが表示される場合があります。 たとえば、http://youtube.com/comment は、urllib モジュールを使用していても、外部リクエストに対して禁止されています。

アクセス時に HTTP 403 エラーを返す Web サイトからデータをスクレイピングするコードを書きましょう。

コード例:

import urllib.request
import re

webpage = urllib.request.urlopen(
    "https://www.cmegroup.com/markets/products.html?redirect=/trading/products/#cleared=Options&sortField=oi"
).read()
findrows = re.compile('<tr class="- banding(?:On|Off)>(.*?)</tr>')
findlink = re.compile('<a href =">(.*)</a>')

row_array = re.findall(findrows, webpage)
links = re.findall(findlink, webpage)

print(len(row_array))

出力:

Traceback (most recent call last):
  File "c:\Users\akinl\Documents\Python\index.py", line 7, in <module>
    webpage = urllib.request.urlopen('https://www.cmegroup.com/markets/products.html?redirect=/trading/products/#cleared=Options&sortField=oi').read()
  File "C:\Python310\lib\urllib\request.py", line 216, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python310\lib\urllib\request.py", line 525, in open
    response = meth(req, response)
  File "C:\Python310\lib\urllib\request.py", line 634, in http_response
    response = self.parent.error(
  File "C:\Python310\lib\urllib\request.py", line 563, in error
    return self._call_chain(*args)
  File "C:\Python310\lib\urllib\request.py", line 496, in _call_chain
    result = func(*args)
  File "C:\Python310\lib\urllib\request.py", line 643, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

その理由は、ウェブサイトへのアクセスが禁止されているためです。 しかし、robots.txt ファイル を確認すると、https://www.cmegroup.com/markets/Disallow タグが付いていないことがわかります。 ただし、スクレイピングしたいWebサイトのrobots.txtファイルをたどると、以下が見つかります.

User-agent: Python-urllib/1.17
Disallow: /

上記のテキストは、Python-urllib という名前のユーザー エージェントがサイト内の URL をクロールすることを許可されていないことを意味します。 つまり、Python urllib モジュールを使用してサイトをクロールすることは許可されていません。

したがって、robots.txt をチェックまたは解析して、どのリソースにアクセスできるかを確認してください。 robotparser クラスを使用して robots.txt ファイルを解析できます。 これらにより、コードで urllib.error.HTTPError: HTTP Error 403: Forbidden エラー メッセージが発生するのを防ぐことができます。

有効なユーザー エージェントをヘッダー パラメーターとして渡すと、問題はすぐに修正されます。 Web サイトでは、スクレイピング対策として Cookie を使用する場合があります。

Web サイトは、スクレイピングを防ぐために Cookie をエコー バックするように設定して要求する場合がありますが、これはポリシーに違反している可能性があります。

from urllib.request import Request, urlopen


def get_page_content(url, head):

    req = Request(url, headers=head)
    return urlopen(req)


url = "https://example.com"
head = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
    "Accept-Encoding": "none",
    "Accept-Language": "en-US,en;q=0.8",
    "Connection": "keep-alive",
    "refere": "https://example.com",
    "cookie": """your cookie value ( you can get that from your web page) """,
}

data = get_page_content(url, head).read()
print(data)

出力:

<!doctype html>\n<html>\n<head>\n    <title>Example Domain</title>\n\n    <meta
'
'
'
<p><a href="https://www.iana.org/domains/example">More information...</a></p>\n</div>\n</body>\n</html>\n'

有効なユーザー エージェントをヘッダー パラメーターとして渡すと、問題はすぐに修正されます。

セッション オブジェクトを使用して urllib HTTP エラー 403 禁止メッセージを解決する

場合によっては、ユーザー エージェントを使用しても、このエラーの発生を止められないことがあります。 その後、requests モジュールの Session オブジェクトを使用できます。

from random import seed
import requests

url = "https://stackoverflow.com/search?q=html+error+403"
session_obj = requests.Session()
response = session_obj.get(url, headers={"User-Agent": "Mozilla/5.0"})

print(response.status_code)

出力:

200

上記の記事では、urllib.error.HTTPError: HTTP Error 403: Forbidden の原因と、それを処理するための解決策を見つけます。 mod_security は基本的にこのエラーを引き起こします。これは、異なる Web ページが異なるセキュリティ メカニズムを使用して、人間のコンピューターと自動化されたコンピューター (ボット) を区別するためです。

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

関連記事 - Python Error