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)返回的OpenerDirector类实例。


鼠与我
7 声望1 粉丝

Sad