• urllib 学习二


    编码解码:

    python2 用法:
        urllib.urlencode()   编码
       urlparse.parse_qs()  解码
    
    
    python3 用法:
      urllib.parse.urlencode() 编码 
      urllib.parse.parse_qs() 解码
    
    作用:
    1)把字典数据转化成URL编码 2)用途 a)对URL参数进行编码 b)对post上去的form数据进行编码

    示例

    #python2.x
    import urllib
    import urlparse
    
    def urlencode():
        params = {'score': 100, 'name': '爬虫基础', 'comment': 'very good'}
        qs = urllib.urlencode(params)     ###编码
        print(qs)
        unqs = urlparse.parse_qs(qs)               ##解码
        print unqs
    if __name__ == '__main__':
        urlencode()

    #python3.x


    import urllib import urllib.parse def urlencode(): params = {'score': 100, 'name': '爬虫基础', 'comment': 'very good'} qs = urllib.parse.urlencode(params) ###编码 print(qs) unqs = urllib.parse.urlparse(qs) ##解码 print (unqs) if __name__ == '__main__': urlencode()

    结果:



    python2.x


    urllib2中的两个重要概念:Openers和Handlers
      1.Openers:
            当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。
            正常情况下,我们使用默认opener:通过urlopen。
            但你能够创建个性的openers。
    
        2.Handles:
            openers使用处理器handlers,所有的“繁重”工作由handlers处理。
            每个handlers知道如何通过特定协议打开URLs,或者如何处理URL打开时的各个方面。例如HTTP重定向或者HTTP cookies。

    实例:
       import http.cookiejar
        import urllib2
        def cookies():
             cookejar = http.cookiejar.CookieJar()
             hadler = urllib.request.HTTPCookieProcessor(cookiejar=cookejar)
             opener = urllib.request.build_opener(hadler,urllib.request.HTTPHandler(debuglevel=1))  #####打印调试信息
             s = opener.open("http://www.douban.com")
             print (s.read(100))
             s.close()
             print ('=' * 80)
             print (cookejar._cookies)
             print ("=" * 80)
             s = opener.open("http://www.douban.com")
             s.close()
        
        cookies()

    urllib2.Request
    自定制headers
    # -*- coding: utf-8 -*-
        import urllib2
    
        def request():
            # 定制 HTTP 头
            headers = {'User-Agent': 'Mozilla/5.0', 'x-my-header': 'my value'}  #在http里面自定义的头一般是x开头的
            req = urllib2.Request('http://blog.kamidox.com', headers=headers)  #创建一个请求
            s = urllib2.urlopen(req)              #打开这个请求,urlopen不仅仅可以接受一个网址作为参数,也可以接受request作为它的对象
            print(s.read(100))
            s.close()
    
        if __name__ == '__main__':
            request()
     

    urllib2.bulid-opener

    
    
        可以让我们去定制这个http的行为
    
        1)BeseHandler及其子类
    
            BeseHandler是所有HTTPHandler的父类
    
            a.HTTPHandler(处理http请求的)
    
            b.HTTPSHandler(处理安全链接的请求)
    
            c.HTTPCookieProcessor(处理cookie的请求)
    
        2)bulid-opener
    
            a.返回Handler列表,会把这个Handler都给它串起来,串起来以后,就类似于我们管道一样,当http请求应答回来的时候,它会流经这个Handler,让这个里面每一个Handler去处理不同的东西
    
            b.返回OpenerDirector,这个参数很重要的方法就是open,这个open就是要去打开这个远程的链接去处理这个数
    
        3)默认会创建的Handler链
    
            Handler的链,实际上是一个Handler的数组,在调用这个urlOpener的时候,它默认的时候会是以下的链表,也就是,它会默认的把这个链表给你创建起来
    
            a.ProxyHandler(如果设置了代理)
    
            b.UnknownHandler(不知道什么协议的时候,它会去调)
    
            d.HTTPHandler(处理http的请求)
    
            c.HTTPDefaultEorrorHandler(处理错误的请求)
    
            d.HTTPRedirectHandler(处理跳转,比如http出现301,302这种应答码的时候)
    
            e.FTPHandler(可以去支持FTP的协议)
    
            f.FileHandler(可以支持本地的文件打开)
    
            g.HTTPEorrorProcessor(可以去处理http的错误)
    
            e.HTTPSHandler(如果安装了ssl模块)

    实例:
    # -*- coding: utf-8 -*-
            import urllib2
            import urllib
    
            def request_post_debug():
                # POST
                data = {'username': 'kamidox', 'password': 'xxxxxxxx'}   ##数据体
                # headers = {'User-Agent': 'Mozilla/5.0', 'Content-Type': 'plain/text'}
                headers = {'User-Agent': 'Mozilla/5.0'}   ###定制的头
                req = urllib2.Request('http://www.douban.com', data=urllib.urlencode(data), headers=headers)  //创建一个请求,这个请求是发送给豆瓣
                opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1))  ##创建一个open打开器,如果不传参数,它就是给你传系统默认的Handler,如果我们传了参数给它,如果系统里面默认有的它就去去替换掉,如果系统没有它就去去添加
                s = opener.open(req)        ###用这个open去打开这个请求
                print(s.read(100))          ###打印前面100个字节
            s.close()
    
            if __name__ == '__main__':
                Request_post_debug()
    如果我创建了一个opener,那我后面的函数还想用该怎么办呢?怎么将这个opener保存起来呢?
    
    保存opener为默认
    
                1.urllib2.install_opener (我们可以把创建处理的opener,给它保存到urllib2这个库里面,调用urllib2的时候,就会直接去下载安装这个opener了)
    
                2.示例:install_debug_opener
    示例:
     # -*- coding: utf-8 -*-
                import urllib2
    
                def request():
                    # 定制 HTTP 头
                    headers = {'User-Agent': 'Mozilla/5.0', 'x-my-header': 'my value'}
                    req = urllib2.Request('http://blog.kamidox.com', headers=headers)
                    s = urllib2.urlopen(req)
                    print(s.read(100))
                    print(req.headers)
                s.close()
    
                def request_post_debug():
                    # POST
                    data = {'username': 'kamidox', 'password': 'xxxxxxxx'}
                    # headers = {'User-Agent': 'Mozilla/5.0', 'Content-Type': 'plain/text'}
                    headers = {'User-Agent': 'Mozilla/5.0'}
                    req = urllib2.Request('http://www.douban.com', data=urllib.urlencode(data), headers=headers)
                    opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1))
                    s = opener.open(req)
                    print(s.read(100))
                s.close()
    
                def install_debug_handler():
                    opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1),
                                                  urllib2.HTTPSHandler(debuglevel=1))
                                                  ##这里能处理HTTP协议和HTTPS协议
    
                    urllib2.install_opener(opener)   ##将Handler安装到系统默认区,要打开的就是我们这里要安装的opener
    
                if __name__ == '__main__':
                    install_debug_handler()
                request()

    Cookies

    1)cookieillib.CookieJar
    
      提供解析并保存cookie的接口,因为cookie有些有生命周期,还有很多参数,这个类就是提供这些cookie的处理。
    
    2)HTTPCookieProcessor
    
      提供自动处理cookie的功能,它的父类也是BeseHandler,所以我们可以把这个cookie串起来,这样就可以处理一些信息。


    示例:handle_cookies
    # -*- coding: utf-8 -*-
            import urllib2
    
            def handle_cookie():            #先定义一个处理cookie的信息
                cookiejar = cookielib.CookieJar()  ##先串联一个CookieJar的对象
                handler = urllib2.HTTPCookieProcessor(cookiejar=cookiejar)  ##创建一个HTTPCookieProcessor的对象,传入一个参数CookieJar进去
    
                ##还需要创建一个新的handler,打印出它的调试信息
                opener = urllib2.build_opener(handler, urllib2.HTTPHandler(debuglevel=1))
                s = opener.open('http://www.douban.com')
                print(s.read(100))
                s.close()
            if __name__ == '__main__':
                handle_cookie()
    运行结果,这个应答里面有一个set_cookie,有一个bid


    在收到这个请求之后,我们的CookieJar,包含这些服务器返回的cookie,我们可以把它打印出来。代码如下:
    # -*- coding: utf-8 -*-
            import urllib2
    
            def handle_cookie():            ##先定义一个处理cookie的信息
                cookiejar = cookielib.CookieJar()  ##先串联一个CookieJar的对象
                handler = urllib2.HTTPCookieProcessor(cookiejar=cookiejar)  ##创建一个HTTPCookieProcessor的对象,传入一个参数CookieJar进去
                opener = urllib2.build_opener(handler, urllib2.HTTPHandler(debuglevel=1))###还需要创建一个新的handler,打印出它的调试信息
                s = opener.open('http://www.douban.com')
                print(s.read(100))
                s.close()
                print('=' * 80)
                print(cookiejar._cookies)  ###这个属性就是服务器所有的cookie
                print('=' * 80)
    
            if __name__ == '__main__':
                handle_cookie()

    opener实际上是带着这些cookie信息的,那我下次再发一个请求过去的时候,它会把这个cookie也发送过去。
  • 相关阅读:
    第十八章所有者权益部分考点知识点
    会计基础模拟练习一(3)
    会计基础模拟练习一(2)
    会计基础模拟练习一(1)
    第三章 复式记账
    第二章 会计科目和账户 笔记
    【Flink系列一】Flink开启Checkpoint,以及从Checkpoint恢复
    【已解决】解决Gradle在使用代理的情况下访问中央仓库返回403 Forbidden的问题
    Surface Laptop 3三个月使用心得
    Spring跨系统转发HTTP请求的简易实现(支持下载文件二进制流)
  • 原文地址:https://www.cnblogs.com/FRESHMANS/p/8058920.html
Copyright © 2020-2023  润新知