urllib和urllib2的高级用法

  • Post author:
  • Post category:其他




发送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高级功能。所以要支持这些功能:

  1. 使用相关的

    Handler处理器

    来创建特定功能的处理器对象;
  2. 然后通过

    urllib2.build_opener()

    方法使用这些处理器对象,创建自定义opener对象;
  3. 使用自定义的opener对象,调用

    open()

    方法发送请求。
  4. 注意:如果程序里所有的请求都使用自定义的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 



版权声明:本文为xujiaqi1998原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。