python urllib request 简介
urllib.request : open and read URLs
与许多python模块一样,urllib.request中对于我们的使用也提供了:
1.面向过程
2.面向对象
这两种使用方式。(面向过程一般是以面向对象为底层实现的)
默认HTTP访问情况下
面向过程
urllib.request.urlopen(url,data=None)
其中url为一个string或者Reuqest对象;data则是所谓的表单数据,在urllib.request模块中对于它的形式有一定规定,假如提供该参数http请求报文为post,不提供则为get。
该函数返回一个file like object,有read、readline、readlines等常见方法。注意read等方法返回的对象需要进行decode,一般是utf-8
面向对象
在urllib.request中有三大对象:Request Opener Handler
- Request是对url的一种抽象,而且可以附加上对于data和header的一些指定。定义为urllib.request.Request(url,data=None,headers={}).参数headers即是对应http报文的header部分。
-
Opener是用于访问url的类,上文的urlopen函数就是基于模块中内置的一个Opener的。模块中只有urllib.request.OpenerDirector一个Opener类,而该类的具体定义如下:
| Methods defined here: | | __init__(self) | Initialize self. | | add_handler(self, handler) | | close(self) | | error(self, proto, *args) | | open(self, fullurl, data=None, timeout=
- Handler则是用于处理访问中的一些“dirty”工作,如代理、cookies、身份认证等工作。模块中定义了很多Handler类,BaseHandler是基类,HTTPRedirectHandler处理重定向,爬虫中常用ProxyHandler,其定义为urllib.request.ProxyHandler(proxies=None),proxies参数是一个字典dict,形式为{"协议类型":"代理ip:端口号"}
内在逻辑
Request Opener Handler三类的关系可以用一句话概括:
Opener open URLs(Request) via chained Handlers.
Opener和Handler是怎么chain在一起的呢?上文OpenerDirector由一个add_handler的方法可以实现,或urllib.request.build_opener(opener) or urllib.request.install_opener(handler)可以把Handler作为参数传入,当然这两个函数返回的也都是OpenerDirector类实例。