urllib2

2016-01-18  本文已影响1866人  盗花

1.urllib2和urllib的区别

但是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头

示例:
#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处理

示例:
#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简介

示例:爬取豆瓣热播电影

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

上一篇下一篇

猜你喜欢

热点阅读