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

  • 相关阅读:
    Linux修改主机名称
    Tachyon---基于内存的分布式存储系统
    机器学习中的基本数学知识
    Spark集群 + Akka + Kafka + Scala 开发(4) : 开发一个Kafka + Spark的应用
    Spark集群 + Akka + Kafka + Scala 开发(3) : 开发一个Akka + Spark的应用
    Spark集群 + Akka + Kafka + Scala 开发(2) : 开发一个Spark应用
    Spark集群 + Akka + Kafka + Scala 开发(1) : 配置开发环境
    JDBC常用驱动和语法汇总
    JDBC常用驱动和语法汇总
    request.getContextPath获取绝对路径
  • 原文地址:https://www.cnblogs.com/roicel/p/2972234.html
Copyright © 2020-2023  润新知