Python で Urllib HTTP エラー 403 禁止メッセージを解決する
-
Python の
urllib
モジュール -
robots.txt
をチェックしてurllib
HTTP エラー 403 禁止メッセージを防止する -
urllib
HTTP エラー 403 禁止メッセージを解決するためにリクエスト ヘッダーに Cookie を追加する -
セッション オブジェクトを使用して
urllib
HTTP エラー 403 禁止メッセージを解決する
今日の記事では、禁止されたリソースに直面したときに、request
クラスに代わって error
クラスによって生成されるエラー メッセージ (例外) urllib.error.HTTPError: HTTP Error 403: Forbidden
の処理方法について説明します。
Python の urllib
モジュール
urllib
Python モジュール は、さまざまなプロトコルを介して Python の URL を処理します。 特定の Web サイトからデータを取得したい Web スクレイパーで有名です。
urllib
には、URL の読み取り、解析、および robots.txt
などの特定の操作を実行するクラス、メソッド、および関数が含まれています。 request、error、parse、robotparser の 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
エラー メッセージが発生するのを防ぐことができます。
urllib
HTTP エラー 403 禁止メッセージを解決するためにリクエスト ヘッダーに Cookie を追加する
有効なユーザー エージェントをヘッダー パラメーターとして渡すと、問題はすぐに修正されます。 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 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
- AttributeError の解決: 'list' オブジェクト属性 'append' は読み取り専用です
- AttributeError の解決: Python で 'Nonetype' オブジェクトに属性 'Group' がありません
- AttributeError: 'generator' オブジェクトに Python の 'next' 属性がありません
- AttributeError: 'numpy.ndarray' オブジェクトに Python の 'Append' 属性がありません
- AttributeError: Int オブジェクトに属性がありません
- AttributeError: Python で 'Dict' オブジェクトに属性 'Append' がありません