发送POST请求时,需要了解的headers一些属性:
Content-Length: 100
: 是指发送的表单数据长度为100,也就是url编码字符串的字符个数是100个。
Content-Type: application/x-www-form-urlencoded
: 表示浏览器提交 Web 表单时使用,表单数据会按照
name1=value1&name2=value2
键值对形式进行编码。
X-Requested-With: XMLHttpRequest
:表示AJAX异步请求。
问题:GET和POST的区别?
- GET方式是直接以链接形式访问,链接中包含了所有的参数,服务器端用Request.QueryString获取变量的值。如果包含了密码的话是一种不安全的选择,不过你可以直观地看到自己提交了什么内容。
- POST则不会在网址上显示所有的参数,服务器端用Request.Form获取提交的数据,在Form提交的时候。但是HTML代码里如果不指定 method 属性,则默认为GET请求,Form中提交的数据将会附加在url之后,以
?
分开与url分开。- 表单数据可以作为 URL 字段(method=“get”)或者 HTTP POST (method=“post”)的方式来发送。比如在下面的HTML代码中,表单数据将因为 (method=“get”) 而附加到 URL 上:
<form action="https://movie.douban.com/subject_search" method="get">
<fieldset>
<legend>搜索:</legend>
<label for="inp-query">
</label>
<div class="inp"><input id="inp-query" name="search_text" size="22" maxlength="60" placeholder="搜索电影、电视剧、综艺、影人" value="" autocomplete="off"></div>
<div class="inp-btn"><input type="submit" value="搜索"></div>
<input type="hidden" name="cat" value="1002">
</fieldset>
</form>
————————————————————————————————————————————
(四)urllib和urllib2的高级用法
Handler处理器 和 自定义Opener
opener是 urllib2.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就是模块帮我们构建好的)。
但是基本的urlopen()方法不支持代理、Cookie等其他的 HTTP/HTTPS高级功能。所以要支持这些功能:
-
使用相关的
Handler处理器
来创建特定功能的处理器对象; -
然后通过
urllib2.build_opener()
方法使用这些处理器对象,创建自定义opener对象; -
使用自定义的opener对象,调用
open()
方法发送请求。 -
注意:如果程序里所有的请求都使用自定义的opener,可以使用
urllib2.install_opener()
将自定义的 opener 对象 定义为 全局opener,表示如果之后凡是调用urlopen,都将使用这个opener(根据自己的需求来选择)。
简单的自定义opener()
import urllib2
# 构建一个HTTPHandler 处理器对象,支持处理HTTP请求
http_handler = urllib2.HTTPHandler()
# 调用urllib2.build_opener()方法,创建支持处理HTTP请求的opener对象
opener = urllib2.build_opener(http_handler)
# 构建 Request请求
request = urllib2.Request("http://www.baidu.com/")
# 调用自定义opener对象的open()方法,发送request请求
# (注意区别:不再通过urllib2.urlopen()发送请求)
response = opener.open(request)
# 获取服务器响应内容
print(response.read())
这种方式发送请求得到的结果,和使用
urllib2.urlopen()
发送HTTP/HTTPS请求得到的结果是一样的。
如果在 HTTPHandler()增加
debuglevel=1
参数,还会将 Debug Log 打开,这样程序在执行的时候,会把收包和发包的报头在屏幕上自动打印出来,方便调试,有时可以省去抓包的工作。
# 仅需要修改的代码部分:
# 构建一个HTTPHandler 处理器对象,支持处理HTTP请求,同时开启Debug Log,debuglevel 值默认 0
http_handler