python Web 客户端访问

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网络编程基础这本书,代码基本上都是书上的。作为自己的笔记吧。至少我自己敲过了,有点印象。

原文地址:https://www.cnblogs.com/roicel/p/2972234.html