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

    你可能感兴趣的:(网页爬虫,python)