文章摘自:https://www.cnblogs.com/wly923/archive/2013/05/07/3057122.html

urllib与urllib2的学习总结(python2.7.X)

  先啰嗦一句,我使用的版本是python2.7,没有使用3.X的原因是我觉得2.7的扩展比较多,且较之前的版本变化不大,使用顺手。3.X简直就是革命性的变化,用的蹩手。3.x的版本urllib与urllib2已经合并为一个urllib库,学着比较清晰些,2.7的版本呢urllib与urllib2各有各的作用,下面我把自己学习官方文档和其他资料的总结写下,方便以后使用。

  urllib与urllib2并不是可以代替的,只能说2是一个补充吧。先来看看他们俩的区别,有一篇文章把urllib与urllib2的关系说的很明白《difference between urllib and urllib2》,意思如下。

  Python的urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功能。他们两个最显着的差异如下:

  •   urllib2可以接受一个Request对象,并以此可以来设置一个URL的headers,但是urllib只接收一个URL。这意味着,你不能伪装你的用户代理字符串等。
  •   urllib模块可以提供进行urlencode的方法,该方法用于GET查询字符串的生成,urllib2的不具有这样的功能。这就是urllib与urllib2经常在一起使用的原因。

  

  这两点对于用过urllib与urllib2的人来说比较好理解,但是对于没用过的还是不能有好的理解,下面参考官方的文档,把自己对urllib与urllib2的学习内容总结如下。

  A.urllib2概述

  urllib2模块定义的函数和类用来获取URL(主要是HTTP的),他提供一些复杂的接口用于处理: 基本认证,重定向,Cookies等。

  urllib2支持许多的“URL schemes”(由URL中的“:”之前的字符串确定 - 例如“FTP”的URL方案如“ftp://python.org/”),且他还支持其相关的网络协议(如FTP,HTTP)。我们则重点关注HTTP。

  在简单的情况下,我们会使用urllib2模块的最常用的方法urlopen。但只要打开HTTP URL时遇到错误或异常的情况下,就需要一些HTTP传输协议的知识。我们没有必要掌握HTTP RFC2616。这是一个最全面和最权威的技术文档,且不易于阅读。在使用urllib2时会用到HTTP RFC2616相关的知识,了解即可。

  B.常用方法和类

  1) urllib2.urlopen(url[, data][, timeout])

  urlopen方法是urllib2模块最常用也最简单的方法,它打开URL网址,url参数可以是一个字符串url或者是一个Request对象。URL没什么可说的,Request对象和data在request类中说明,定义都是一样的。

  对于可选的参数timeout,阻塞操作以秒为单位,如尝试连接(如果没有指定,将使用设置的全局默认timeout值)。实际上这仅适用于HTTP,HTTPS和FTP连接。

  先看只包含URL的请求例子:

import urllib2
response = urllib2.urlopen('http://python.org/')
html = response.read()

  urlopen方法也可通过建立了一个Request对象来明确指明想要获取的url。调用urlopen函数对请求的url返回一个response对象。这个response类似于一个file对象,所以用.read()函数可以操作这个response对象,关于urlopen函数的返回值的使用,我们下面再详细说。

import urllib2
req = urllib2.Request('http://python.org/')
response = urllib2.urlopen(req)
the_page = response.read()

这里用到了urllib2.Request类,对于上例,我们只通过了URL实例化了Request类的对象,其实Request类还有其他的参数。

  2) class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

Request类是一个抽象的URL请求。5个参数的说明如下

  URL——是一个字符串,其中包含一个有效的URL。

  data——是一个字符串,指定额外的数据发送到服务器,如果没有data需要发送可以为“None”。目前使用data的HTTP请求是唯一的。当请求含有data参数时,HTTP的请求为POST,而不是GET。数据应该是缓存在一个标准的application/x-www-form-urlencoded格式中。urllib.urlencode()函数用映射或2元组,返回一个这种格式的字符串。通俗的说就是如果想向一个URL发送数据(通常这些数据是代表一些CGI脚本或者其他的web应用)。对于HTTP来说这动作叫Post。例如在网上填的form(表单)时,浏览器会POST表单的内容,这些数据需要被以标准的格式编码(encode),然后作为一个数据参数传送给Request对象。Encoding是在urlib模块中完成的,而不是在urlib2中完成的。下面是个例子:

import urllib
import urllib2
url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = {'name' : 'Michael Foord','location' : 'Northampton','language' : 'Python' }
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()

  headers——是字典类型,头字典可以作为参数在request时直接传入,也可以把每个键和值作为参数调用add_header()方法来添加。作为辨别浏览器身份的User-Agent header是经常被用来恶搞和伪装的,因为一些HTTP服务只允许某些请求来自常见的浏览器而不是脚本,或是针对不同的浏览器返回不同的版本。例如,Mozilla Firefox浏览器被识别为“Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11”。默认情况下,urlib2把自己识别为Python-urllib/x.y(这里的xy是python发行版的主要或次要的版本号,如在Python 2.6中,urllib2的默认用户代理字符串是“Python-urllib/2.6。下面的例子和上面的区别就是在请求时加了一个headers,模仿IE浏览器提交请求。

import urllib
import urllib2
url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'name' : 'Michael Foord','location' : 'Northampton','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()

标准的headers组成是(Content-Length, Content-Type and Host),只有在Request对象调用urlopen()(上面的例子也属于这个情况)或者OpenerDirector.open()时加入。两种情况的例子如下:

使用headers参数构造Request对象,如上例在生成Request对象时已经初始化header,而下例是Request对象调用add_header(key, val)方法附加header(Request对象的方法下面再介绍):

import urllib2
req = urllib2.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
r = urllib2.urlopen(req)

OpenerDirector为每一个Request自动加上一个User-Agent header,所以第二种方法如下(urllib2.build_opener会返回一个OpenerDirector对象,关于urllib2.build_opener类下面再说):

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')

urllib和urllib2的区别(很全面详细!)相关推荐

  1. python的httplib、urllib和urllib2的区别及应用

    urllib 和urllib2都是接受URL请求的相关模块,但是urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL.这意味着,你不可以伪装你 ...

  2. urllib和urllib2的区别和使用

    Python的urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功能.他们两个最显著的差异如下: urllib2可以接受一个Request对象,并以此可以来设置一个URL的h ...

  3. Py之urllib2:Python库之urllib、urllib2、urllib3系列简介、安装、使用方法之详细攻略

    Py之urllib2:Python库之urllib.urllib2.urllib3系列简介.安装.使用方法之详细攻略 目录 urllib2简介 urllib2安装 urllib2使用方法 urllib ...

  4. python urllib2模块安装,Python urllib和urllib2模块学习(二)

    一.urllib其它函数 前面介绍了 urllib 模块,以及它常用的 urlopen() 和 urlretrieve()函数的使用介绍.当然 urllib 还有一些其它很有用的辅助方法,比如对 ur ...

  5. python2.7下的urllib和urllib2

    python最恶心的地方就在于它的版本和配置了,特别是安装第三方包的时候经常会出现莫名其妙的错误,又不懂. 所以只能不断的切来切去的. 今天学习python爬虫,其中Python2.7使用了urlli ...

  6. urllib、urllib2、urllib3 和 requests 模块有什么区别?

    问: 在 Python 中,urllib.urllib2.urllib3 和 requests 模块有什么区别?为什么有三个?他们似乎在做同样的事情- 答1: HuntsBot周刊–不定时分享成功产品 ...

  7. Python urllib、urllib2、urllib3用法及区别

    简介1 在可供使用的网络库中,urllib和urllib2可能是投入产出比最高的两个,是Python中操作url的官方标准库.它们让你能够通过网络访问文件,就像这些文件位于你的计算机中一样.只需一个简 ...

  8. urllib和urllib2区别

    urllib和urllib2区别 urllib和urllib2区别: Python的urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功能.他们两个最显着的差异如下: 总结1 ...

  9. urllib,urllib2,urllib3区别

    python3中也有urllib和urllib3两个库,其中urllib几乎是python2.7中urllib和urllib2两个模块的集合,所以我们最常用的urllib模块,而urllib3则作为一 ...

最新文章

  1. laravel mysql增删改查_Laravel框架数据库操作的增删改三种方式 阿星小栈
  2. java 的分类_java的基本类型(转)
  3. 动态so库的链接:运行时链接和编译时链接
  4. 12家股份银行当中,哪个盈利能力和口碑是最好的?
  5. js实现替换指定字符后面的内容(包括指定字符)
  6. 【机器学习】梯度下降中矩阵的迹的求导证明
  7. 网站数据是怎么存取在mysql_数据是怎么存储在mysql?
  8. 网络共享服务器 samba
  9. 浏览器报错:DNS_PROBE_FINISHED_BAD_CONFIG
  10. 他山之石——VBA SQL基础
  11. Win11电脑系统使用U盘安装的方法分享
  12. shel--常用快捷键
  13. 网站的友情链接是什么?
  14. 时空序列预测之PredRNN++(Casual LSTM和GHU解决时空预测学习中的深度困境)
  15. docker中安装nacos报错 com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
  16. H5 授权微信第三方登录
  17. 获取微信昵称时 过滤特殊字符
  18. python怎么画三维函数图像_python中如何画三维的图形?
  19. SDUT 操作系统课程 CATS考试工具部分专题代码实现
  20. 国外免费公共DNS解析服务器

热门文章

  1. Web全栈~27.文件和目录的操作
  2. 通信应用中数字上变频DUC与数字下变频DDC详细原理(带图)
  3. Inventory 物料库存 mtl_transactions_interface 开发[转]
  4. 时间转换数字与日期互转
  5. 3年自动化测试,我突然想转测试开发了,开发测试工具平台......
  6. 本地服务:无法访问此网站 localhost 拒绝了我们的连接请求。ERR_CONNECTION_REFUSED
  7. Altium Designer 18 原理图编译出现off grid错误处理方法
  8. 高通平台开发系列讲解(USB篇)USB端口的说明及切换方法
  9. Licheepi_nano开发板:根文件系统编译
  10. 3.3 典型交易流程