urllib2

作者: 盗花 | 来源:发表于2016-01-18 21:01 被阅读1866次

    1.urllib2和urllib的区别

    • urllib2提供了比urllib更丰富的功能:urllib2.Request 提供了http header定制能力。
    • urllib2提供更强大的功能,包括cookie处理、鉴权,可定制化等。

    但是urllib2不能完全替代urllib,因为urllib2中没有urllib.urlencode函数。

    2.urllib2.urlopen
    参数较urllib.urlopen增加了timeout
    示例:

    import urllib2
    
    def urlopen():
        url=r'http://blog.kamidox.com/no-exist'#不存在的url地址
        try:
            s=urllib2.urlopen(url,timeout=3)
        except urllib2.HTTPError, e:
            print e
        else:
            print(s.read(100))
            s.close()
    
    if __name__=='__main__':
        urlopen()
    

    输出为:

    HTTP Error 404: Not Found
    

    3.urllib2.Request

    urllib2.Request( url, data=None, headers={}, origin_req_host=None, unverifiable=False)

    使用Request添加或修改http头

    • Accept:application/json
    • Content-Type:application/json
    • User-Agent:Chorme

    示例:
    #coding:utf-8
    import urllib2

    def request():
        # 定制HTTP头
        # x-my-header为自定义头
        headers={'User-Agent':'Mozilla/5.0','x-my-header':'my value'}
        url=r'http://blog.kamidox.com'
        req=urllib2.Request(url,headers=headers)
        s=urllib2.urlopen(req)
        print(s.read(100))
        print(req.headers)
        s.close()
    
    if __name__=='__main__':
        request()
    

    输出为:

    <!doctype html>
    <html class="no-js" lang="en">
            <head>
                    <meta charset="utf-8" />
                    <meta name="view
    {'X-my-header': 'my value', 'User-agent': 'Mozilla/5.0'}
    

    4.urllib2.build_opener,定制HTTP与服务器交互过程中的各种handler

    build_opener(*handlers)
    Create an opener object from a list of handlers.

    示例:
    #coding:utf-8
    import urllib2
    import urllib

    def request_post_debug():
        # POST
        data={'username':'kamidox','password':'xxxxxxxx'}
        headers={'User_Agent':'Mozilla/5.0'}
        req=urllib2.Request(r'http://www.douban.com',
                            data=urllib.urlencode(data),headers=headers)
        opener=urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1))#debuglevel=1,将HTTP与服务器交互过程中的信息打印出来
        s=opener.open(req)
        print(s.read(100))
        s.close()
    
    if __name__=='__main__':
        request_post_debug()
    

    输出为:

    send: 'POST / HTTP/1.1\\\\r\\\\nAccept-Encoding: identity\\\\r\\\\nContent-Length: 34\\\\r\\\\nHost: www.douban.com\\\\r\\\\nUser-Agent: Python-urllib/2.7\\\\r\\\\nConnection: close\\\\r\\\\nUser_Agent: Mozilla/5.0\\\\r\\\\nContent-Type: application/x-www-form-urlencoded\\\\r\\\\n\\\\r\\\\nusername=kamidox&password=xxxxxxxx'
    reply: 'HTTP/1.1 200 OK\\\\r\\\\n'
    header: Server: dae
    
    header: Date: Mon, 18 Jan 2016 13:37:14 GMT
    
    header: Content-Type: text/html; charset=utf-8
    
    header: Content-Length: 94426
    
    header: Connection: close
    
    header: X-Douban-Mobileapp: 0
    
    header: Expires: Sun, 1 Jan 2006 01:00:00 GMT
    
    header: X-Douban-Newbid: 88UPR6LZ0bI
    
    header: Pragma: no-cache
    
    header: Cache-Control: must-revalidate, no-cache, private
    
    header: P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
    
    header: X-Douban-Splittest: 
    
    header: Set-Cookie: bid="88UPR6LZ0bI"; path=/; domain=.douban.com; expires=Tue, 17-Jan-2017 13:37:14 GMT
    
    header: Set-Cookie: ll="108288"; path=/; domain=.douban.com; expires=Tue, 17-Jan-2017 13:37:14 GMT
    
    header: X-DAE-Node: sindar24c
    
    header: X-DAE-App: sns
    
    <!DOCTYPE HTML>
    <html lang="zh-cms-Hans" class="">
    <head>
    <meta charset="UTF-8">
    <meta content="鎻愪
    

    4.1rullib2.install_opener,将已有的opener设置为系统默认

    install_opener(opener)

    示例:
    #coding:utf-8
    import urllib2
    import urllib

    def request():
        # 定制HTTP头
        # x-my-header为自定义头
        headers={'User-Agent':'Mozilla/5.0','x-my-header':'my value'}
        url=r'https://www.python.org/'
        req=urllib2.Request(url,headers=headers)
        s=urllib2.urlopen(req)
        print(s.read(100))
        print(req.headers)
        s.close()
    
    def install_debug_handler():
        opener=urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1),
                                    urllib2.HTTPSHandler(debuglevel=1))
        urllib2.install_opener(opener)
    
    if __name__=='__main__':
        install_debug_handler()
        request()
    

    输出为:

    send: 'GET / HTTP/1.1\\\\r\\\\nAccept-Encoding: identity\\\\r\\\\nHost: www.python.org\\\\r\\\\nX-My-Header: my value\\\\r\\\\nConnection: close\\\\r\\\\nUser-Agent: Mozilla/5.0\\\\r\\\\n\\\\r\\\\n'
    reply: 'HTTP/1.1 200 OK\\\\r\\\\n'
    header: Server: nginx
    
    header: Content-Type: text/html; charset=utf-8
    
    header: X-Frame-Options: SAMEORIGIN
    
    header: X-Clacks-Overhead: GNU Terry Pratchett
    
    header: Content-Length: 46972
    
    header: Accept-Ranges: bytes
    
    header: Date: Mon, 18 Jan 2016 13:55:57 GMT
    
    header: Via: 1.1 varnish
    
    header: Age: 1728
    
    header: Connection: close
    
    header: X-Served-By: cache-itm7422-ITM
    
    header: X-Cache: HIT
    
    header: X-Cache-Hits: 8
    
    header: Vary: Cookie
    
    header: Public-Key-Pins: max-age=600; includeSubDomains; pin-sha256="WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18="; pin-sha256="5C8kvU039KouVrl52D0eZSGf4Onjo4Khs8tmyTlV3nU="; pin-sha256="5C8kvU039KouVrl52D0eZSGf4Onjo4Khs8tmyTlV3nU="; pin-sha256="lCppFqbkrlJ3EcVFAkeip0+44VaoJUymbnOaEUk7tEU="; pin-sha256="TUDnr0MEoJ3of7+YliBMBVFB4/gJsv5zO7IxD9+YoWI="; pin-sha256="x4QzPSC810K5/cMjb05Qm4k3Bw5zBn4lTdO/nEW/Td4=";
    
    header: Strict-Transport-Security: max-age=63072000; includeSubDomains
    
    <!doctype html>
    <!--[if lt IE 7]>   <html class="no-js ie6 lt-ie7 lt-ie8 lt-ie9">   <![endif]-->
    <!-
    {'X-my-header': 'my value', 'User-agent': 'Mozilla/5.0'}
    

    5.cookies处理

    • cookielib.CookieJar:提供解析并保存cookie的接口
    • urllib2.HTTPCookieProcessor:提供自动处理cookie的功能

    示例:
    #coding:utf-8
    import urllib2
    import cookielib

    def handle_cookie():
        cookiejar=cookielib.CookieJar()
        handler=urllib2.HTTPCookieProcessor(cookiejar)
        opener=urllib2.build_opener(handler,urllib2.HTTPHandler(debuglevel=1))
        s=opener.open(r'http://www.douban.com')
        print(s.read(100))
        s.close()
        print('='*80)
        print(cookiejar._cookies)#服务器已返回的cookie信息全包含在cookiejar中,使用_cookies打印出来
        print('='*80)
        s=opener.open(r'http://www.douban.com')#再次向服务器发送请求时,携带已有的cookie
        s.close()
    
    if __name__=='__main__':
        handle_cookie()
    

    输出为:

    send: 'GET / HTTP/1.1\\\\r\\\\nAccept-Encoding: identity\\\\r\\\\nHost: www.douban.com\\\\r\\\\nConnection: close\\\\r\\\\nUser-Agent: Python-urllib/2.7\\\\r\\\\n\\\\r\\\\n'
    reply: 'HTTP/1.1 200 OK\\\\r\\\\n'
    header: Server: dae
    
    header: Date: Mon, 18 Jan 2016 14:20:48 GMT
    
    header: Content-Type: text/html; charset=utf-8
    
    header: Content-Length: 94748
    
    header: Connection: close
    
    header: X-Douban-Mobileapp: 0
    
    header: Expires: Sun, 1 Jan 2006 01:00:00 GMT
    
    header: X-Douban-Newbid: rDUu4sRCuj4
    
    header: Pragma: no-cache
    
    header: Cache-Control: must-revalidate, no-cache, private
    
    header: P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
    
    header: Set-Cookie: bid="rDUu4sRCuj4"; path=/; domain=.douban.com; expires=Tue, 17-Jan-2017 14:20:48 GMT
    
    header: Set-Cookie: ll="108288"; path=/; domain=.douban.com; expires=Tue, 17-Jan-2017 14:20:48 GMT
    
    header: X-DAE-Node: sindar20b
    
    header: X-DAE-App: sns
    
    <!DOCTYPE HTML>
    <html lang="zh-cms-Hans" class="">
    <head>
    <meta charset="UTF-8">
    <meta content="鎻愪
    ================================================================================
    {'.douban.com': {'/': {'bid': Cookie(version=0, name='bid', value='"rDUu4sRCuj4"', port=None, port_specified=False, domain='.douban.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1484662848, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False), 'll': Cookie(version=0, name='ll', value='"108288"', port=None, port_specified=False, domain='.douban.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1484662848, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)}}}
    ================================================================================
    send: 'GET / HTTP/1.1\\\\r\\\\nAccept-Encoding: identity\\\\r\\\\nHost: www.douban.com\\\\r\\\\nCookie: bid="rDUu4sRCuj4"; ll="108288"\\\\r\\\\nConnection: close\\\\r\\\\nUser-Agent: Python-urllib/2.7\\\\r\\\\n\\\\r\\\\n'
    reply: 'HTTP/1.1 200 OK\\\\r\\\\n'
    header: Server: dae
    
    header: Date: Mon, 18 Jan 2016 14:20:49 GMT
    
    header: Content-Type: text/html; charset=utf-8
    
    header: Content-Length: 94748
    
    header: Connection: close
    
    header: X-Douban-Mobileapp: 0
    
    header: Expires: Sun, 1 Jan 2006 01:00:00 GMT
    
    header: Pragma: no-cache
    
    header: Cache-Control: must-revalidate, no-cache, private
    
    header: X-Douban-Splittest: 
    
    header: X-DAE-Node: sindar24a
    
    header: X-DAE-App: sns
    
    #第二次服务器的返回值不再设置cookie
    

    6.HTMLParser简介

    • feed:向解析器喂数据,可以分段提供
    • handle_starttag:处理html的开始标签
    • tag:标签名称
    • attrs:属性列表
    • handle_data:处理标签里的数据体
    • data:数据文本

    示例:爬取豆瓣热播电影

    import urllib2
    from HTMLParser import HTMLParser
    
    
    class MovieParser(HTMLParser):
        def handle_starttag(self, tag, attrs):
            def _attr(attrs):
                for attr in attrs:
                    if attr[1].strip() == 'nowplaying':
                        return True
            if tag == 'li' and _attr(attrs):
                print '*'*32
                for attr in attrs:
                    print attr[0], ': ', attr[1]
    
    if __name__=='__main__':
        url = r'http://movie.douban.com/nowplaying/beijing/'
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36 CoolNovo/2.0.9.20'}
        req = urllib2.Request(url, headers=headers)
        s = urllib2.urlopen(req)
        parser = MovieParser()
        parser.feed(s.read())
    

    输出为:
    ********************************
    id : 20326665
    class : list-item
    data-title : 星球大战:原力觉醒
    data-score : 7.3
    data-star : 40
    data-release : 2015
    data-duration : 135分钟
    data-region : 美国
    data-director : J·J·艾布拉姆斯
    data-actors : 黛西·雷德利 / 亚当·德赖弗 / 哈里森·福特
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 79157
    data-subject : 20326665
    ********************************
    id : 25819229
    class : list-item
    data-title : 云中行走
    data-score : 7.6
    data-star : 40
    data-release : 2015
    data-duration : 123分钟
    data-region : 美国
    data-director : 罗伯特·泽米吉斯
    data-actors : 约瑟夫·高登-莱维特 / 本·金斯利 / 夏洛特·勒·邦
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 20310
    data-subject : 25819229
    ********************************
    id : 10440076
    class : list-item
    data-title : 最后的巫师猎人
    data-score : 5.8
    data-star : 30
    data-release : 2015
    data-duration : 107分钟
    data-region : 美国
    data-director : 布瑞克·埃斯纳尔
    data-actors : 范·迪塞尔 / 伊利亚·伍德 / 露丝·莱斯利
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 12755
    data-subject : 10440076
    ********************************
    id : 26348798
    class : list-item
    data-title : 真相禁区
    data-score : 4.9
    data-star : 25
    data-release : 2016
    data-duration : 108分钟
    data-region : 中国大陆
    data-director : 麦咏麟
    data-actors : 任达华 / 霍建华 / 张赫
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 3072
    data-subject : 26348798
    ********************************
    id : 26330955
    class : list-item
    data-title : 熊出没之熊心归来
    data-score : 6.6
    data-star : 35
    data-release : 2016
    data-duration : 96分钟
    data-region : 中国大陆
    data-director : 丁亮 林永长
    data-actors : 张伟 / 张秉君 / 谭笑
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 2352
    data-subject : 26330955
    ********************************
    id : 26311973
    class : list-item
    data-title : 唐人街探案
    data-score : 7.6
    data-star : 40
    data-release : 2015
    data-duration : 135分钟
    data-region : 中国大陆
    data-director : 陈思诚
    data-actors : 王宝强 / 刘昊然 / 佟丽娅
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 90813
    data-subject : 26311973
    ********************************
    id : 24751756
    class : list-item
    data-title : 老炮儿
    data-score : 8.4
    data-star : 45
    data-release : 2015
    data-duration : 137分钟(中国大陆)
    data-region : 中国大陆
    data-director : 管虎
    data-actors : 冯小刚 / 许晴 / 张涵予
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 209055
    data-subject : 24751756
    ********************************
    id : 3077412
    class : list-item
    data-title : 寻龙诀
    data-score : 7.9
    data-star : 40
    data-release : 2015
    data-duration : 125分钟(中国大陆)
    data-region : 中国大陆 香港
    data-director : 乌尔善
    data-actors : 陈坤 / 黄渤 / 舒淇
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 201151
    data-subject : 3077412
    ********************************
    id : 26607739
    class : list-item
    data-title : 极限挑战之皇家宝藏
    data-score : 4.6
    data-star : 25
    data-release : 2016
    data-duration : 102分钟
    data-region : 中国大陆
    data-director : 任静 严敏
    data-actors : 黄渤 / 孙红雷 / 黄磊
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 8017
    data-subject : 26607739
    ********************************
    id : 26219651
    class : list-item
    data-title : 恶人报喜
    data-score : 4.8
    data-star : 25
    data-release : 2016
    data-duration : 100分钟
    data-region : 香港 中国大陆
    data-director : 谷德昭
    data-actors : 吴镇宇 / 江疏影 / 郑中基
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 632
    data-subject : 26219651
    ********************************
    id : 25920885
    class : list-item
    data-title : 神探夏洛克
    data-score : 7.0
    data-star : 35
    data-release : 2016
    data-duration : 115分钟(中国大陆)
    data-region : 英国
    data-director : 道格拉斯·麦金农
    data-actors : 本尼迪克特·康伯巴奇 / 马丁·弗瑞曼 / 尤娜·斯塔布斯
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 92969
    data-subject : 25920885
    ********************************
    id : 26290381
    class : list-item
    data-title : 果宝特攻之水果大逃亡
    data-score : 6.4
    data-star : 35
    data-release : 2016
    data-duration : 97分钟
    data-region : 中国大陆
    data-director : 王巍
    data-actors : 赖虹宇 / 祖晴 / 鞠月斌
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 125
    data-subject : 26290381
    ********************************
    id : 26661696
    class : list-item hidden
    data-title : 恶灵之门
    data-score : 4.0
    data-star : 20
    data-release : 2016
    data-duration : 92分钟
    data-region : 中国大陆
    data-director : 郭大雷
    data-actors : 莫少聪 / 朱珠 / 陈廷嘉
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 173
    data-subject : 26661696
    ********************************
    id : 26630517
    class : list-item hidden
    data-title : 一家老小向前冲
    data-score : 3.9
    data-star : 20
    data-release : 2016
    data-duration : 102分钟
    data-region : 中国大陆
    data-director : 李平
    data-actors : 彭宇 / 柳岩 / 杜海涛
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 176
    data-subject : 26630517
    ********************************
    id : 3217142
    class : list-item hidden
    data-title : 通灵神探
    data-score : 6.3
    data-star : 35
    data-release : 2015
    data-duration : 100分钟(中国大陆)
    data-region : 美国
    data-director : 阿方索·博亚尔特
    data-actors : 安东尼·霍普金斯 / 科林·法瑞尔 / 杰弗里·迪恩·摩根
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 8562
    data-subject : 3217142
    ********************************
    id : 26351519
    class : list-item hidden
    data-title : 爱在深秋
    data-score : 4.8
    data-star : 25
    data-release : 2016
    data-duration : 100分钟
    data-region : 香港
    data-director : 林家威
    data-actors : 温碧霞 / 谭耀文 / 赵炳锐
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 45
    data-subject : 26351519
    ********************************
    id : 26309968
    class : list-item hidden
    data-title : 消失爱人
    data-score : 4.7
    data-star : 25
    data-release : 2016
    data-duration : 109分钟
    data-region : 中国大陆
    data-director : 黄真真
    data-actors : 黎明 / 王珞丹 / 林俊杰
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 4577
    data-subject : 26309968
    ********************************
    id : 26688299
    class : list-item hidden
    data-title : 猿创世界之熊孩子部落
    data-score : 6.1
    data-star : 30
    data-release : 2016
    data-duration : 80分钟
    data-region : 中国大陆
    data-director : 刘潘
    data-actors : 吕佩玉 / 骆妍倩 / 王愫稣
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 188
    data-subject : 26688299
    ********************************
    id : 26686170
    class : list-item hidden
    data-title : 谎言大爆炸
    data-score : 4.2
    data-star : 20
    data-release : 2016
    data-duration : 90分钟
    data-region : 中国大陆
    data-director : 侯亮
    data-actors : 孙坚 / 白冰 / 潘霜霜
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 946
    data-subject : 26686170
    ********************************
    id : 26677940
    class : list-item hidden
    data-title : 爸爸我来救你了
    data-score : 2.4
    data-star : 15
    data-release : 2016
    data-duration : 90分钟
    data-region : 中国大陆
    data-director : 叶田
    data-actors : 钱枫 / 刘汉强 / 李尚翼
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 184
    data-subject : 26677940
    ********************************
    id : 25845910
    class : list-item hidden
    data-title : 小门神
    data-score : 7.0
    data-star : 35
    data-release : 2016
    data-duration : 107分钟
    data-region : 中国大陆
    data-director : 王微
    data-actors : 高晓松 / 易小星 / 白客
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 9558
    data-subject : 25845910
    ********************************
    id : 26290365
    class : list-item hidden
    data-title : 恶棍天使
    data-score : 3.9
    data-star : 20
    data-release : 2015
    data-duration : 124分钟
    data-region : 中国大陆
    data-director : 俞白眉 邓超
    data-actors : 邓超 / 孙俪 / 代乐乐
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 51226
    data-subject : 26290365
    ********************************
    id : 26686653
    class : list-item hidden
    data-title : 请把你的窗户打开
    data-score :
    data-star : 00
    data-release : 2016
    data-duration : 95分钟
    data-region : 中国大陆
    data-director : 江流
    data-actors : 杨心仪 / 胡玺龙 / 幺依田
    data-category : nowplaying
    data-enough : False
    data-showed : True
    data-votecount : 18
    data-subject : 26686653
    ********************************
    id : 26593244
    class : list-item hidden
    data-title : 咕噜咕噜美人鱼
    data-score : 5.0
    data-star : 25
    data-release : 2015
    data-duration : 90分钟
    data-region : 中国大陆
    data-director : 杨广福
    data-actors : 张美娟 / 赵梦娇 / 陈大刚
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 1118
    data-subject : 26593244
    ********************************
    id : 25894885
    class : list-item hidden
    data-title : 舌尖上的新年
    data-score : 8.5
    data-star : 45
    data-release : 2016
    data-duration : 89分钟
    data-region : 中国大陆
    data-director : 陈磊 邓洁 李勇
    data-actors : 李立宏
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 5994
    data-subject : 25894885
    ********************************
    id : 26611801
    class : list-item hidden
    data-title : 一念天堂
    data-score : 4.8
    data-star : 25
    data-release : 2015
    data-duration : 102分钟
    data-region : 中国大陆
    data-director : 张承
    data-actors : 沈腾 / 马丽 / 杜晓宇
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 13414
    data-subject : 26611801
    ********************************
    id : 1431944
    class : list-item hidden
    data-title : 过猴山
    data-score : 8.1
    data-star : 40
    data-release : 1958
    data-duration : 10分钟
    data-region : 中国
    data-director : 王树忱
    data-actors :
    data-category : nowplaying
    data-enough : True
    data-showed : True
    data-votecount : 7490
    data-subject : 1431944

    相关文章

      网友评论

          本文标题:urllib2

          本文链接:https://www.haomeiwen.com/subject/nnpkkttx.html