• urllib包提供了一个高级接口,用于编写需要与HTTP服务器、FTP服务器和本地文件交互的客户端。典型的应用程序包括从网页抓取数据、自动化、代理、Web爬虫等。

1. urllib.request ()

  • 该模块最常见的用途是通过HTTP从Web服务器获取数据。
  • urlopen(url [,data [,timeout]

打开 URL url并返回类文件对象,可使用该对象读取返回的数据。简言之,url可以是包含URL的字符串,也可以是 Request类实例。data是URL编码的字符串,包含要上传到服务器的表单数据。

如果提供了data,那么实际使用的就是HTTP"PosT'方法,而不是'GET’(默认值)。通常使用urllib.parse.urlencode()之类的函数创建数据。timeout是可选的超时期(以秒为单位),内部存在阻塞操作时使用。

u = urllib.request.urlopen()
  • urlopen()返回的类文件对象u支持以下方法。

方法

描述

u.read( [nbytes])

u.readline()

u.readlines()

u.fileno()


u.close ()

u.info ()

u.getcode()

u.geturl()

  • 需要特别强调的是类文件对象υ以二进制模式操作。如果需要以文本形式处理响应数据,则需要使用 codecs模块或类似方式解码数据。
  • 对于简单的请求来说urlopen()的url参数就是一个字符串,如http://www.pythonorg如果需要执行更加复杂的操作,如修改HTTP请求报头,可创建Request实例并使用其作为url参数。
  • Request(url [,data [,headers [,origin_ reg host [,unverifiable]]]])
  • url指定URL(如http://www.foo.bar/spam.htm1'.)
  • data是URL编码的数据,要通过HTTP请求上传到服务器。提供该参数时,它将HTTP请求类型从'GET'改为'POST'。
  • headers是一个字典,包含了可表示HITP报头内容的键值映射。
  • origin_reg host设为事务的请求主机,通常是发出请求的主机名称。
  • 如果请求的是无法验证的URL,则 unveri fiable设为rue。无法验
    证的URL的非正式定义是:不是用户直接输入的URL,如加载图像的页面中嵌入的URL。unverifiable的默认值是False,
r= urllib.request.Request()
  • Request的实例r具有以下方法

方法

描述

r.add_ data(data)

r.add_ header (key, val)

r.add_unredirected-header(key, val)

r.get_data()

r.get_ full_url()

r.get_host()

r.get_method ()

r.get_origin_rea_host()

r.get_ selector()

r.get_ type ()

r.has_data()

r.is_unverifiable()

r.has_ header(header)

r.set_proxy(host, type)

2. 自定义opener

  • 基本的urlopen()函数不支持验证、cookie或者其他高级HTTP功能。要支持这些功能,必须使用 build_opener(函数创建自己的自定义 opener对象
  • build_opener([handler [, handler2,...]]
  • 构建用于打开URL的自定义opener对象。参数 handler1、 handler2等都是特殊处理程序对象的实例。这些处理程序的目的是向得到的opener对象添加各种功能。
  • build_opener()返回的对象具有open(ur1[,data[, timeout]])方法,其作用是根据各种处理程序提供的规则打开URL。open()的参数与传递ur⊥open()函数的参数相同。
  • insta11。 pener【 opener)
  • 安装不同的opener对象作为ur1open()使用的全局URL opener。opener通常是 build_opener()创建的opener对象。

3. 密码验证

  • 要处理涉及密码验证的请求,你可以创建一个opener,往其中添加HttpbasIcautHhandLer、HttpdiGest Authhandler、 ProxyBasicAuthHandler或 ProxyDigestAuthHandler的组合。这些处理程序都具有以下方法,可用来设置密码。
  • h.add_ password(realm, uri, user, passwd)
  • 为给定的域和UR添加用户和密码信息。所有参数都是字符串。uxi可以是URI序列,在这种情况下,用户和密码信息适用于序列中的所有URI。 realm是与验证相关联的名称或描述信息。它的值取决于远程服务器。但是,它通常是与相关网页关联的常用名称。uri是与验证相关联的基础URL.realm和uri的常见值类似于('adminIstrator','http://www.somesite.com')user和password分别 指定用户名和密码。

4. Http Cookie

  • 如果要管理 Http cookie,需要创建添加了 HttpcooKieprocessor处理程序的 opener对象。例如:
cookiehand = HttpcoOkiepRoceSsor()
opener build_opener(cookiehand)
u=opener.open("http://www.example.com/")
  • 默认情况下HttpcoOkieprOcesSor使用httpcookiejar模块中的Cookiejar对象。将不同类型的 Cookiejar对象作为 HttpcookieProcessor的参数提供,可以支持不同类型的 cookie处理方法。
    例如:
cookiehand=httpcookieprocessor(
httpcookiejar.Mozillacookiejar("cookies.txt")
opener build_opener(cookiehand)
u=opener.open("http://www.examplecom/)

5. 代理

  • 如果需要通过代理重定向请求,可创建 ProxyHandler实例。
    Proxy Handler(proxies])创建通过代理路由请求的代理处理程序。参数proxies是一个字典,将协议名称(如'http,'ftp等)映射到相应代理服务器的URL。
  • 下例演示了如何使用该方法:
proxy=proxyhandler(('http':'htTp://someproxy.com8080/')
auth=httpbasicauthhandler()
auth.add_password("realm","host","username","password")
opener = build _opener(proxy.auth)
u=openeropen("http://www.examplecom/doc.html")

urllib. response

这是一个内部模块,实现了ur11ib. request模块中函数返回的类文件对象。没有公共API。

urllib.parse

  • ur11ib.parse模块用于操作URL字符串,如"http:/www.python.org"。

1.URL解析

  • URL的一般形式为" scheme://netloc/path; parameters? query# fragment"。另外,URL的netloc部分可能包含一个端口号,如" hostname:port",也可能包含用户验证信息,如"user:pass@hostname"。
  • 以下函数用于解析URL:
  • urlparse(urlstring [ default_ scheme [ allow fragments]])
  • 在urlstring中解析URL并返回ParseResult实例。如果URL中没有任何内容,则default_scheme指定要使用的方案("http","ftp"等)。如果allow_fragments为0,则不支持片段标识符。
  • ParseResult实例r是一个指定的元组,形式为( scheme, net loc,path, parameters, query,fragment)。
  • 该实例还定义了以下只读属性。

属性

描述

r.scheme

r.netloc

r.path

r.params

r.query

r.fragment

r.username

r.password

r.hostname

r.port

  • 使用r.geturl()可将 ParseResult实例转换回URL字符串.

- urlunparse(parts)

  • 将 urlparse()返回的元组表示形式的URL转换为URL字符串。parts必须是元组或者具有6个组件的可迭代内容。
  • urlsplit(url [ default_ scheme [ allow fragments]])
  • 该方法与 unlparse(类似,不同之处在于URL的 parameters部分在路径中保持不变。该方法可以解析参数附加在单个路径组件上的URL,如' scheme:/ net loc/ path1; paramlpath2; paran2/
    path3? query# fragment'。返回的结果是 SplitResult的实例,是包含( scheme,net1oc,path,query, fragment)的指定元组。
  • 还定义了以下只读属性。 | 属性 | 描述 |
•  | :--- | :--- |
 | r.scheme | |
 | r.netloc | |
 | r.path | |
 | r.query | |
 | r.fragment | |
 | r.username | |
 | r.password | |
 | r.hostname | |
 | r.port | |
  • 使用 r.geturl()可将 SplitResult实例转换回URL字符串。
  • urldefrag(url)
  • 返回元组( newurl, fragment),其中newurl是去除了片段的url部分, fragment是包含片段部分的字符串(如果有)。如果url中没有任何片段,则newurl与url相同, fragment为空字符串。
  • urljoin(base, url [ allow_fragments])
  • 通过组合基础 URL base和相对URL构造绝对URL。url.a11ow_fragments的含义与 unlparse()中的含义相同。如果基础URL的最后一个组件不是目录,则去除最后的组件。
  • parse_gs(gs [, keep_blank_values [ strict_parsing]l)
  • 解析URL编码的(MME类型为 application/x-www-form- urlencode)查询字符串qs,并返回字典,其中键是查询变量名称,值是为每个名称定义的值列表。keep_blank_values是一个布尔值标志,控制如何处理空白值。如果为True,则它们包含在字典中,值设置为空字符串;如果为False(默认值),则将其丢弃。 strict_ parsing是一个布尔值标志,如果为πrue,则将解析错误转换为Valueerror异常。默认情况下会忽略错误。
  • parse_qsl(gs [ ,keep_blank_vaLues[ ,strict parsing]])
  • 该方法与 parse_qs()类似,不同之处在于返回的结果是一个(name, value)对列表,其中name是查询变量的名称, value是值。

2.URL编码

  • 以下函数可对组成URL的数据进行编码和解码。
  • quote(string [ safe [ encoding [ errors]]])
  • 使用适合URL内容的转义序列替换 string中的特殊字符。字母、数字和下划线()、逗号(,)句号(.)、连字符(-)都保持不变。所有其他字符都转换为'%xx'形式的转义序列。safe提供由其他不应该带有引号的字符组成的字符串,默认为'/'。 encoding指定对非ASCI字符使用的编码。默认情况下是utf-8。 errors指定遇到编码错误时的操作,默认值是'strict'。
  • quote_plus(string [ safe [ encoding [ errors]]])
  • 调用quote()并使用加号替换所有空格。string,safe, quote()中的含义相同 encoding和 errors。
  • quote_from_bytes(bytes [ safe])
  • 该方法与 quote类似,但是接受字节字符串且不执行编码。返回的值为文本字符串。
  • unquote(string [ encoding [ errors]])
  • 使用转义序列对应的单字符替换'xx'形式的转义序列。 encoding和 errors指定'xx'转义中编码数据的编码和错误处理。默认编码是'utf-8',默认的 errors策略是'replace'。
  • unquote_ plus(string [ encoding [ errors]])
  • 该方法与 unquote()类似,但使用加号替换空格。
  • **unquote_to__bytes(string)**
  • 该方法与 unquote(类似,但是不执行任何编码并返回字节字符串。
  • urlencode(query [,dosed])
  • 将query中的查询值转换为一个URL编码的字符串,该字符串可以作为URL的 query.参数包括在内,或者可以作为POST请求的一部分上传。 query是字典,或者是一个(key, value)对序列。得到的字符串是以"&字符分隔的'key=va1ue'对序列,其中key和 value都使用 quote_plus()引用。
    dosed参数是一个布尔值标志,如果 query中的vaue是序列,则应该设置为rue,表示同一个键有多个值。在这种情况下,将为value中的每个v创建一个单独的"key=v字符串。
  1. 设置headers
  2. 代理的设置
  3. Timeout的设置
  4. cookies的使用