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=<object object at 0x00000221AFDDA260>)
- 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(handler) or urllib.request.install_opener(handler)可以把 Handler 作为参数传入,当然这两个函数返回的也都是 OpenerDirector 类实例。