ホームページ  >  記事  >  バックエンド開発  >  【Python】Webクローラ(4):オープナとハンドラの紹介と実践

【Python】Webクローラ(4):オープナとハンドラの紹介と実践

黄舟
黄舟オリジナル
2017-01-21 13:50:521321ブラウズ

次の内容を始める前に、まず urllib2 の 2 つのメソッド、info と geturl について説明しましょう

urlopen によって返される応答オブジェクトの応答 (または HTTPError インスタンス) には、2 つの非常に便利なメソッド info() と geturl() があります

1。 geturl():

これは取得した実際の URL を返します。urlopen (またはオープナー オブジェクトによって使用されるもの) にはリダイレクトがある可能性があるため、これは非常に便利です。取得したURLはリクエストURLと異なる場合があります。

Renren のハイパーリンクを例に挙げます。


元の URL とリダイレクトされたリンクを比較するために urllib2_test10.py を構築します。

from urllib2 import Request, urlopen, URLError, HTTPError  
  
  
old_url = 'http://rrurl.cn/b1UZuP'  
req = Request(old_url)  
response = urlopen(req)    
print 'Old url :' + old_url  
print 'Real url :' + response.geturl()

実行後、実際のリンクが指す URL を確認できます。

【Python】Webクローラ(4):オープナとハンドラの紹介と実践

2.info():

これは、取得したページの状況を記述するオブジェクトの辞書オブジェクトを返します。通常、サーバーによって送信される特定のヘッダー。現在は httplib.HTTPMessage のインスタンスです。

クラシックヘッダーには、「Content-length」、「Content-type」、およびその他のコンテンツが含まれます。


情報アプリケーションをテストするために urllib2_test11.py を構築します:

from urllib2 import Request, urlopen, URLError, HTTPError  
  
old_url = 'http://www.baidu.com'  
req = Request(old_url)  
response = urlopen(req)    
print 'Info():'  
print response.info()

実行結果は次のとおりです。ページの関連情報を確認できます:

【Python】Webクローラ(4):オープナとハンドラの紹介と実践

urllib2 の 2 つについて話しましょう重要な概念: オープナーとハンドラー。

1.オープナー:

URL を取得するときは、オープナー (urllib2.OpenerDirector のインスタンス) を使用します。

通常、urlopen を通じてデフォルトのオープナーを使用します。

ただし、パーソナライズされたオープナーを作成することはできます。

2.ハンドル:

オープナーはプロセッサハンドラーを使用し、すべての「重い」作業はハンドラーによって処理されます。

各ハンドラーは、特定のプロトコルを介して URL を開く方法、または URL を開く際のさまざまな側面を処理する方法を知っています。

たとえば、HTTP リダイレクトまたは HTTP Cookie。


特定のハンドラーで URL を取得したい場合は、オープナーを作成する必要があります。たとえば、Cookie を処理できるオープナーを取得したり、リダイレクトしないオープナーを取得したりすることができます。


オープナーを作成するには、OpenerDirector、

をインスタンス化し、.add_handler(some_handler_instance) を呼び出します。

同様に、build_opener を使用することもできます。これは、関数呼び出しを 1 回行うだけで、オープナー オブジェクトを作成するためのより便利な関数です。
build_opener はデフォルトでいくつかのプロセッサを追加しますが、デフォルトのプロセッサを簡単に追加または更新する方法を提供します。

プロキシ、検証、およびその他の一般的だがやや特殊なケースを処理する必要があるその他のハンドラー。


install_opener は、(グローバル) デフォルトのオープナーを作成するために使用されます。これは、urlopen を呼び出すと、インストールしたオープナーが使用されることを意味します。

Opener オブジェクトには open メソッドがあります。

このメソッドは、urlopen 関数と同様に URL を取得するために直接使用できます。便宜的な場合を除いて、通常は install_opener を呼び出す必要はありません。


上記の 2 つの内容について説明した後、ここで使用する上記の Opener と Handler の基本認証の内容を見てみましょう。

Basic 認証

ハンドラーの作成とインストールを示すために、HTTPBasicAuthHandler を使用します。

基本的な検証が必要な場合、サーバーは検証を要求するヘッダー (401 エラー コード) を送信します。これはスキームと「レルム」を指定し、次のようになります: Www-authenticate: SCHEME realm="REALM".

たとえば
Www-authenticate: Basic realm="cPanel Users"

クライアントは新しいレルムを使用する必要があります。リクエストを作成し、リクエスト ヘッダーに正しい名前とパスワードを含めます。

これは「基本認証」です。このプロセスを簡素化するために、HTTPBasicAuthHandler のインスタンスを作成し、オープナーにこのハンドラーを使用させることができます。


HTTPBasicAuthHandler は、パスワード管理オブジェクトを使用して URL とレルムを処理し、ユーザー名とパスワードをマップします。

(サーバーから送信されたヘッダー内の) レルムがわかっている場合は、HTTPPasswordMgr を使用できます。


通常、人々はレルムが何であるかを気にしません。その場合は、便利な HTTPPasswordMgrWithDefaultRealm を使用できます。

これにより、URL のデフォルトのユーザー名とパスワードが指定されます。

これは、特定のレルムに他の組み合わせを指定した場合に提供されます。

add_password に提供される realm パラメーターに None を指定することで、この状況を示します。


最上位の URL は、検証が必要な最初の URL です。 .add_password() に渡すより深い URL も同様に適しています。

くだらない話をたくさんした後、上で述べたことを例を使って説明しましょう。


情報アプリケーションをテストするために urllib2_test12.py を構築しましょう:

# -*- coding: utf-8 -*-  
import urllib2  
  
# 创建一个密码管理者  
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()  
  
# 添加用户名和密码  
  
top_level_url = "http://example.com/foo/"  
  
# 如果知道 realm, 我们可以使用他代替 ``None``.  
# password_mgr.add_password(None, top_level_url, username, password)  
password_mgr.add_password(None, top_level_url,'why', '1223')  
  
# 创建了一个新的handler  
handler = urllib2.HTTPBasicAuthHandler(password_mgr)  
  
# 创建 "opener" (OpenerDirector 实例)  
opener = urllib2.build_opener(handler)  
  
a_url = 'http://www.baidu.com/'  
  
# 使用 opener 获取一个URL  
opener.open(a_url)  
  
# 安装 opener.  
# 现在所有调用 urllib2.urlopen 将用我们的 opener.  
urllib2.install_opener(opener)

注: 上記の例では、HHTTPasicAuthHandler を build_opener にのみ提供しています。

デフォルトのオープナーには通常のハンドラーがあります: ProxyHandler、UnknownHandler、HTTPHandler、HTTPDefaultErrorHandler、HTTPRedirectHandler、FTPHandler、FileHandler、HTTPErrorProcessor。

コード内の top_level_url は、実際には完全な URL (「http:」、ホスト名、オプションのポート番号を含む) にすることができます。


例: http://example.com/。

「権限」(つまり、ホスト名とオプションでポート番号) にすることもできます。

例: 「example.com」または「example.com:8080」。

後者にはポート番号が含まれます。

上記は、[Python] Web クローラー (4): オープナーとハンドラーの紹介とアプリケーション例の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


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