ホームページ  >  記事  >  バックエンド開発  >  【Python】Webクローラ(3): HTTPステータスコードの例外処理と分類

【Python】Webクローラ(3): HTTPステータスコードの例外処理と分類

WBOY
WBOYオリジナル
2016-08-08 09:27:161130ブラウズ

まず HTTP 例外処理について話しましょう。
urlopen が応答を処理できない場合、urlError が生成されます。
ただし、ValueError、TypeErrorなどの一般的なPython APIの例外も同時に発生します。
HTTPError は urlError のサブクラスで、通常は特定の HTTP URL で生成されます。

1.URLError
通常、URLError は、ネットワーク接続がない (特定のサーバーへのルーティングがない) か、サーバーが存在しない場合に発生します。

この場合、例外には「reason」属性もあり、これはタプル (不変の配列として理解できます) であり、

にはエラー番号とエラー メッセージが含まれます。

例外処理を体験するために urllib2_test06.py を構築しましょう:

[python] ビュー 普通のコピー

  1. import urllib2
  2. req = urllib2.Request('http://www.baibai.com')
  3. try: urllib2.urlopen(req)
  4. 以外 urllib2.URLError, e:
  5. print e.reason

F5 キーを押すと、印刷された内容が次のように表示されます:

[Errno 11001] getaddrinfo failed

つまり、エラー番号は 11001 で、内容は getaddrinfo failed


2 .HTTPError
サーバー上のすべての HTTP 応答オブジェクトの応答には、数値の「ステータス コード」が含まれています。

ステータス コードは、サーバーがリクエストを完了できないことを示す場合があります。デフォルトのハンドラーは、この応答の一部を処理します。

例: 応答が「リダイレクト」で、クライアントが別のアドレスからドキュメントを取得する必要がある場合、urllib2 がそれを処理します。

その他、処理できないもの、urlopen は HTTPError を生成します。

典型的なエラーには、「404」(ページが見つかりません)、「403」(リクエストが禁止されています)、「401」(検証付きリクエスト)などがあります。

HTTPステータスコードは、HTTPプロトコルによって返される応答のステータスを示します。

たとえば、クライアントがサーバーにリクエストを送信し、リクエストされたリソースが正常に取得された場合、返されるステータス コードは 200 で、応答が成功したことを示します。

要求されたリソースが存在しない場合、通常は 404 エラーが返されます。

HTTPステータスコードは、通常、1から5までの5つの数字から始まり、3桁の整数で構成される次の5種類に分類されます:

---------------- -------------------------------------------------- ----------------------------------

200: リクエスト成功 処理方法: レスポンス内容を取得し、処理してください

201: リクエストが完了し、新しいリソースが作成されます。新しく作成されたリソースの URI は応答エンティティで取得できます。 処理方法: クローラーでは検出されません。

202: リクエストは受け入れられますが、処理はまだ完了していません。

204: リクエストはすでにサーバー側で実行されましたが、新しい情報は返されませんでした。クライアントがユーザー エージェントの場合、この目的のために独自のドキュメント ビューを更新する必要はありません。 処理方法: 破棄

300: このステータス コードは HTTP/1.0 アプリケーションによって直接使用されませんが、3XX タイプの応答のデフォルトの解釈としてのみ使用されます。要求された利用可能なリソースが複数あります。処理方法: プログラムで処理できる場合はさらに処理され、プログラムで処理できない場合は破棄されます。そのため、要求されたリソースには永続的な URL が割り当てられます。処理方法: 割り当てられた URL にリダイレクト

: 要求されたリソースは別の URL に一時的に保存されます 処理方法: 一時 URL にリダイレクト

304 要求されたリソースは更新されていません 処理方法:破棄

400 不正なリクエスト 処理方法:破棄

401 不正な処理方法:破棄

403 禁止 処理方法:破棄

404 なしFound 処理方法: 破棄

5XX 「5」で始まるステータス コードは、サーバーがエラーを検出し、リクエストの実行を続行できないことを示します 処理方法: 破棄

---- -------------------------------------------------- - --------------------------------------

HTTPErrorインスタンスが生成されます整数の「code」属性があり、これはサーバーによって送信された関連エラー番号です。

エラー コード デフォルトのプロセッサがリダイレクト (300 以外の数字) を処理し、100 ~ 299 の範囲の数字が成功を示すため、エラー番号 400 ~ 599 のみが表示されます。
BaseHTTPServer.BaseHTTPRequestHandler.response は、HTTP プロトコルで使用されるすべての応答番号を示す、非常に便利な応答番号辞書です。

エラー番号が生成されると、サーバーはHTTPエラー番号とエラーページを返します。

ページから返される応答オブジェクトの応答として HTTPError インスタンスを使用できます。

これは、error 属性と同様に、read、geturl、info メソッドも含まれていることを意味します。

urllib2_test07.py を構築して体験してみましょう:

[python] ビュー 普通のコピー

  1. import urllib2
  2. req = urllib2.Request('http://bbs.csdn.net/callmewhy')
  3. 試してみる :
  4. urllib2.urlopen(req)
  5. 以外 urllib2.URLError、e:
  6. 印刷 e.code
  7. #print e.read()

F5 を押すと、404 エラー コードが出力されることがわかります。これは、このページが見つからないことを意味します。

3.Wrapping

したがって、HTTPError または URLError に備えたい場合、基本的な方法が 2 つあります。 2番目のものを使用することをお勧めします。

最初の例外処理ソリューションを示すために urllib2_test08.py を構築しましょう:

[python] ビュー 普通のコピー

  1. from urllib2 import Request, urlopen, URLError, HTTPError
  2. req = Request('http://bbs. csdn.net/callmewhy')
  3. 試してみてください:
  4. response = urlopen(req)
  5. HTTPError を除く、e:
  6. print 「サーバーはリクエストを実行できませんでした。」
  7. print 'エラーコード: ', e.code
  8. 以外 URLError、e:
  9. print 「サーバーに到達できませんでした。」
  10. print 'Reason: ', e.reason
  11. else:
  12. print 「例外は発生しませんでした。」
  13. # すべて問題ありません


およびその他の言説と同様に、試してから捕捉し、その内容を印刷します。

ここで注意すべき点、ただし HTTPError は必須です



🎜🎜我们建一urllib2_test09.py来示范一​​下第二种异常处理的方案:🎜🎜🎜🎜🎜🎜🎜🎜🎜[python] view 普通のコピー 🎜🎜
  1. from urllib2 import Request, urlopen, URLError, HTTPError
  2. req = Request('http://bbs. csdn.net/callmewhy')
  3. 試してみてください:
  4. response = urlopen(req)
  5. 以外 URLエラー、e:
  6. if hasattr(e, 'code'):
  7. print 「サーバーはリクエストを実行できませんでした。」
  8. print 'エラーコード: ', e.code
  9. elif hasattr(e, 「理由」) :
  10. print 「サーバーに到達できませんでした。」
  11. print '理由: ', e .reason
  12. else:
  13. print 「例外は発生しませんでした。」
  14. # すべて問題ありません

以上は、[Python] ネットワーク爬虫 (3) を紹介しました。側面の内容を含む、一般的な処理と HTTP 状態コードの分割であり、PHP 教則に関心のある友人の助けになることが望まれます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。