1、urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,cafile=None, capath=None, cadefault=False, context=None)
(1)用来向服务器发出请求的
import urllib2
response = urllib2.urlopen('http://python.org/')
html = response.read()
urllib2的很多应用就是那么简单(记住,除了"http:",URL同样可以使用"ftp:","file:"等等来替代)。但这篇文章是
教授HTTP的更复杂的应用。
urlopen后的参数,当url是一个字符串地址时,数据什么的需要按照括号中的传入,但当url的Request对象 时,则只需将data等添加到Request的实例中即可。
(2)urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info()和geturl()
geturl -- 这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许
会有重定向。获取的URL或许跟请求URL不同。
info -- 这个返回对象的字典对象,该字典描述了获取的页面情况。通常是服务器发送的特定头headers。目前是httplib.HTTPMessage 实例。
经典的headers包含"Content-length","Content-type",和其他。查看Quick Reference to HTTP Headers(http://www.cs.tut.fi/~jkorpela/http.html)获取有用的HTTP头列表,以及它们的解释意义。
getcode() -
返回响应的HTTP状态代码
(3)在只提供url参数时,urlopen实际上就是一个build_opener(),buildopen()中没有添加任何处理器!在提供context等参数时,分别提供了不同的heandler来build_opener,详细情况可以参见源代码,非常简短,只有几行。
build_opener()在不提供handler的情况下,默认使用default_handler,下面这个列表是default支持的handler(从源码看到的)
default_classes = [ProxyHandler, UnknownHandler, HTTPHandler,HTTPDefaultErrorHandler, HTTPRedirectHandler,FTPHandler, FileHandler, HTTPErrorProcessor]
2、类Request
类Request的构造器所需参数__init__(self,url,data=None,headers= {},origin_req_host=None,unverifiable=False)
HTTP是基于请求和应答机制的--客户端提出请求,服务端提供应答。urllib2用一个Request对象来映射你提出的HTTP请求,
在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,通过调用urlopen并传入Request对象,
将返回一个相关请求response对象,这个应答对象如同一个文件对象,所以你可以在Response中调用.read()。
import urllib2
req = urllib2.Request('http://www.pythontab.com')
response = urllib2.urlopen(req)
the_page = response.read()有时候你希望发送一些数据到URL(通常URL与CGI[通用网关接口]脚本,或其他WEB应用程序挂接)。
在HTTP中,这个经常使用熟知的POST请求发送。这个通常在你提交一个HTML表单时由你的浏览器来做。
并不是所有的POSTs都来源于表单,你能够使用POST提交任意的数据到你自己的程序。
一般的HTML表单,data需要编码成标准形式。然后做为data参数传到Request对象。
编码工作使用urllib的函数而非urllib2。
POST请求:
import urllib
import urllib2
url = 'http://www.pythontab.com'
values = {'name' : 'Michael Foord',
'location' : 'pythontab',
'language' : 'Python' }
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()
记住有时需要别的编码(例如从HTML上传文件--看http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13 HTML Specification, Form Submission的详细说明)。GET请求:
>>> import urllib2
>>> import urllib
>>> data = {}
>>> data['name'] = 'Somebody Here'
>>> data['location'] = 'pythontab'
>>> data['language'] = 'Python'
>>> url_values = urllib.urlencode(data)
>>> print url_values
name=blueelwang+Here&language=Python&location=pythontab
>>> url = 'http://www.pythontab.com'
>>> full_url = url + '?' + url_values
>>> data = urllib2.open(full_url)修改headers:有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。默认的urllib2把自己作为“Python-urllib/x.y”(x和y是Python主版本和次版本号,例如Python-urllib/2.5),
这个身份可能会让站点迷惑,或者干脆不工作。浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。下面的例子发送跟上面一样的内容,
但把自身模拟成Internet Explorer。
import urllib
import urllib2
url = 'http://www.pythontab.com'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'name' : 'Michael Foord',
'location' : 'pythontab',
'language' : 'Python' }
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()
add_data(self, data),向request实例添加data,但注意,会覆盖原始已有的data。
get_data(self),获取实例的data
(1)、urllib.build_opener([handler,...])
接受可选个handler实例作为参数,来对url请求进行处理。
(2)、urllib2.install_opener(opener)
接受一个自定义的opener作为参数,把自定义的opener作为全局标准的opener,替代urllib2.urlopen
4、handler类
官方文档翻译:http://www.knowsky.com/885444.html
本文详细介绍了Python中urllib2模块的功能与使用方法,包括如何使用urlopen发起HTTP请求、GET与POST请求的区别、Request对象的创建及headers的设置等。此外还介绍了如何通过build_opener来自定义请求处理流程。
2820

被折叠的 条评论
为什么被折叠?



