urllib 学习二

Posted FRESHMANS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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也发送过去。

以上是关于urllib 学习二的主要内容,如果未能解决你的问题,请参考以下文章

为什么二代测序的原始数据中会出现Read重复现象?

二代身份证号码编码规则

染色体基因芯片分析和第二代测序应用的区别

Python爬虫 网页图片

urllib的实现---timeout,获取http响应码,重定向,proxy的设置

谷歌开源第二代机器学习系统 TensorFlow