第6章Webクライアントアクセス
Webページの取得
まずurllib 2を構築した.URLでパラメータを作成するRequestオブジェクト.urlopenを呼び出してファイルクラスオブジェクトを取得します.もちろんurlopenはurlを直接パラメータとして使用することもできます.このほかgeturl()関数もあり、ソースのURLを取得するために使用されます.通常、リダイレクトされたページに追跡できます.info()関数は、ページのmeta-informationを取得するために使用されます.
資格認定
HTTP認証が必要なサイトもあります.HTTP認証は一般的に、クッキーとformベースの認証とは異なるユーザー名とパスワードを尋ねるポップアップウィンドウを表示します.認証が必要なURLにアクセスしようとすると、通常HTTPエラー401が得られますが、urllibは認証を処理することができます.例:
このプログラムにはTerminalPasswordクラスが定義されており、必要に応じてオペレータにユーザー名とパスワードを尋ねることができ、もう1つの呼び出しはbuild_opener().この関数を使用すると、追加のハンドラを指定できます.通常、デフォルトでは基本的なHTTPやFTPサポートなどのハンドラがありますが、他のハンドラも選択的に追加できます.このコードは基本認証をサポートするため、HTTPBasicAuthHandlerをプロセッサチェーンに追加する必要があります.前の例では、コードはurllib 2を簡単に呼び出す.urlopen()は、build_を内部で呼び出します.Opener()で、パラメータは一切付いていません.これにより、デフォルトのプロセッサのみが選択されます.接続が開かれると、変更はありません.認証が必要な場合、HTTPBasicAuthHandlerはTerminalPasswordの適切な関数を自動的に呼び出し、さらにチェックする必要はありません.認証を必要としない一般的なサイトにアクセスすると、このコードは前と同じように表現されます.
フォームデータの送信
CGIスクリプトやその他のインタラクティブなサーバ側プログラムは、一般的にフォームからデータをWebクライアントから受け取ることが多い.フォームデータをコミットするには、GETとPOSTの2つの方法があります.どの方法を使うかは、HTMLドキュメントの
#!/usr/bin/env python
import sys,urllib2
req=urllib2.Request(sys.argv[1])
fd=urllib2.urlopen(req)
while True:
data=fd.read(1024)
if not len(data):
break
sys.stdout.write(data)
まずurllib 2を構築した.URLでパラメータを作成するRequestオブジェクト.urlopenを呼び出してファイルクラスオブジェクトを取得します.もちろんurlopenはurlを直接パラメータとして使用することもできます.このほかgeturl()関数もあり、ソースのURLを取得するために使用されます.通常、リダイレクトされたページに追跡できます.info()関数は、ページのmeta-informationを取得するために使用されます.
資格認定
HTTP認証が必要なサイトもあります.HTTP認証は一般的に、クッキーとformベースの認証とは異なるユーザー名とパスワードを尋ねるポップアップウィンドウを表示します.認証が必要なURLにアクセスしようとすると、通常HTTPエラー401が得られますが、urllibは認証を処理することができます.例:
#!/usr/bin/env python
import sys,urllib2,getpass
class TerminalPassword(urllib2.HTTPPasswordMgr):
def find_user_password(self,realm,authuri):
retval=urllib2.HTTPPasswordMgr.find_user_password(self,realm,authuri)
if retval[0]==None and retval[1]==None:
sys.stdout.write("Login required for %s
" % (realm,authuri))
sys.stdout.write('Username: ')
username=sys.stdin.readline().strip()
password=getpass.getpass().rstrip()
return (username,password)
else:
return retval
req=urllib2.Request(sys.argv[1])
opener=urllib2.build_opener(urllib2.HTTPBasicAuthHandler(TerminalPassword()))
fd=opener.open(req)
print 'Retrieved',fd.geturl()
info=fd.info()
for key,value in info.items():
print '%s = %s' % (key,value)
このプログラムにはTerminalPasswordクラスが定義されており、必要に応じてオペレータにユーザー名とパスワードを尋ねることができ、もう1つの呼び出しはbuild_opener().この関数を使用すると、追加のハンドラを指定できます.通常、デフォルトでは基本的なHTTPやFTPサポートなどのハンドラがありますが、他のハンドラも選択的に追加できます.このコードは基本認証をサポートするため、HTTPBasicAuthHandlerをプロセッサチェーンに追加する必要があります.前の例では、コードはurllib 2を簡単に呼び出す.urlopen()は、build_を内部で呼び出します.Opener()で、パラメータは一切付いていません.これにより、デフォルトのプロセッサのみが選択されます.接続が開かれると、変更はありません.認証が必要な場合、HTTPBasicAuthHandlerはTerminalPasswordの適切な関数を自動的に呼び出し、さらにチェックする必要はありません.認証を必要としない一般的なサイトにアクセスすると、このコードは前と同じように表現されます.
フォームデータの送信
CGIスクリプトやその他のインタラクティブなサーバ側プログラムは、一般的にフォームからデータをWebクライアントから受け取ることが多い.フォームデータをコミットするには、GETとPOSTの2つの方法があります.どの方法を使うかは、HTMLドキュメントの