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
网友评论