学习urllib模块一定要了解的http中的get和post方法:
get方法:通常用于请求服务器发送某个资源,而且应该是安全的和幂等的。
post方法:向服务器提交数据,比如完成表单数据的提交,将数据提交给服务器处理
get和post方法的区别:
- get请求的数据会附在url之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,post则把提交的数据放置在HTTP包的包体中
- post方法的安全性要比get的安全性高
urlopen函数:
urlopen(url,data=None,timeout=<object object>)
传递一个URL参数,添加post需要的data,返回值是一个类似于file的对象,可以通过文件操作来操作这个对象
- read(),readline(),readlines(),fileno(),close():使用方法和python文件操作相同
urlib2.urlopen()参数可以用一个request的对象来代替URL,而且增加了一个URLError异常,对于HTTP协议的错误,增加了一个HTTPError的异常,其中这个HTTPError自动变成一个合法的response来返回。
import urllib2
url = "http://www.baidu.com"
response = urllib2.urlopen(url)
print response.info()
其中,response.info()可以获取返回来的http response head 的信息,response.read()用来获取response body 的信息。
如果默认只有一个url参数,那么默认是使用HTTP GET的方法来访问url
urlopen()还可以使用request对象作为参数,不过首先我们得先创建一个request的对象,通过Request类来完成,Request类有很多方法,比较常用的是add_header(self,key,val)方法,这个方法可以添加我们自己的http header。
import urllib2
request = urllib2.Request("http://www.baidu.com")
request.add_header('User-agent','Internet Explorer')
try:
response = urllib2.urlopen(request)
except urllib2.URLError, e:
print e.code
headers = response.info()
data = response.read()
这样http request头部中的user-agent就变成了Internet Explorer,如果创建request时不添加data,默认使用get方法,如果添加data,那么使用post方法。
对于简单的请求,urlopen()的参数url就是一个代表url的,但是如果需要执行更复杂的操作,如修改HTTP报头,可以创建Request实例并将其作为url参数。
参数:
- url:为url字符串
- data:是伴随url提交的数据,提供data参数时,它会将HTTP请求从get改为post。
- headers:是一个字典,包含了可表示HTTP报头的键值映射(即要提交的header中包含的内容)
- origin_req_host:通常是发出请求的主机的名称,如果请求是无法验证的url(通常是指不是用户直接输入的url,比如加载图像的页面中镶入的url),则后一个参数unverifiable设为TRUE。
- context:如果context被指定,他必须是一个ssl.SSL CONTEXT实例描述各种SSL选项,
假设Request实例r,其比较重要的方法有下面几个:
r.add_data(data):向请求添加数据。如果请求时HTTP请求,则方法改为'post'。
data是向指定url提交的数据,该方法不会将data追加到已经设置的data数据上,而是使用现在的data替换之前的。
r.add_header(key,val):向请求添加header信息,key是报头名,val是报头值,两个参数都是字符串。
r.addunredirectedheader(key,val):作用同上,但不会添加到重定向请求中。
r.set_proxy(host,tyoe):准备请求到服务器,使用host替换原来的主机,使用type替换原来的请求类型。
import urllib
import urllib2
url = 'http://www.x.com/cgi-bin/register.cgi'
values = {'name':'guo'
'age':25
'address':'China'
}
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib.urlopen(req)
the_page = response.read()