乐趣区

python-urllib-request拾遗

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 类实例。

退出移动版