http协议是我们日常都会接触的,在python中,有大量的模块供我们使用来编写Web和Http客户端。
其中urllib2模块中的HTTP是最常用的协议。
既然有urllib2模块,也就应该有urllib模块。这两个模块都提供了同样的基本功能,但urllib2的扩展性更好,并且有更多的内置特性。
1. 获取Web页面
先看代码:
import sys, urllib2 req = urllib2.Request(sys.argv[1]) fd = urllib2.urlopen(req) while 1: data = fd.read(1024) if not len(data): break sys.stdout.write(data)
不得不说,python吸引我的地方就是这种简短的特性,仅仅几行代码就可以实现所需要的功能,并且扩展性更好,就像我前一阵子写的TCPUDP的服务端和客户端,已经向同事进行推广了。
首先,建立urllib2.Request对象,该对象用URL做参数,也可以设置其他参数,如 header。
当调用urlopen()的时候,对象被传进来,这样就得到一个文件对象。
下面是我获得的网页数据(就不提供源代码了,因为在本例中,获得的就是请求地址的源代码)
<html> <head> <title>Example Web Page</title> </head> <body> <p>You have reached this web page by typing "example.com", "examle.net", or "example.org" into you web browser.</p> <p>These domain names are reserved for use in documentation and are not available for registration.See <a href="http://www.rfc-editor.org/rfc/rfc2606.txt">RFC 2606</a>, Section 3.</p> </body> </html>
下面是更新的代码,可以获得一些关于接收到的数据的其他细节:
import sys, urllib2 req = urllib2.Request(sys.argv[1]) fd = urllib2.urlopen(req) print "Retrieved", fd.geturl() info = fd.info() for key, value in info.items(): print "%s = %s" % (key, value)
下面是运行结果
使用geturl()得到的值与传入Request对象的值不一样,在结尾处有一条斜线。远程服务器做了一个HTTP的转向,urllib2可以跟随这个转向,其他行显示了HTTP header的信息。
2.认证
现在很多的网站都需要我们注册,由客户端向服务器发送一个用户名和密码。HTTP认证一般显示一个弹出窗口,来询问用户名和密码。它与基于cookie和from的认证是不同的。
先看代码:
import sys, urllib2, getpass class Passwd(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 at %s\n" % (realm, authuri)) sys.stdout.write("Username: ") username = sys.stdin.readline().rstrip() password = getpass.getpass().rstrip() return (username, password) else: return retval req = urllib2.Request(sys.argv[1]) opener = urllib2.build_opener(urllib2.HTTPBasicAuthHandler(Passwd())) fd = opener.open(req) print "Received", fd.geturl() info = fd.info() for key, value in info.items(): print "%s = %s" % (key, value)
不过遗憾的是没有找到可以测试这个代码的网页。明天自己写一个需要验证的网页吧。
注: 我看的是PYTHON网络编程基础这本书,代码基本上都是书上的。作为自己的笔记吧。至少我自己敲过了,有点印象。