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

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

常用的方法

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

对于可选的参数timeout,阻塞操作以秒为单位

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

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

  1. import urllib2
  2. req = urllib2.Request('http://python.org/')
  3. response = urllib2.urlopen(req,data='abc')
  4. the_page = response.read()
  1. urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

Request类是一个抽象的URL请求。
这里用到了urllib2.Request类,对于上例,我们只通过了URL实例化了Request类的对象,其实Request类还有其他的参数。
data是作为参数请求,如果data不等于None,则该请求为POST,否则为GET

  1. import urllib
  2. import urllib2
  3. url = 'http://www.baidu.com'
  4. values = {'name' : 'qiangzi',
  5. 'age' : 27,
  6. 'id' :1}
  7. data = urllib.urlencode(values)
  8. req = urllib2.Request(url, data)
  9. response = urllib2.urlopen(req)
  10. 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浏览器提交请求。

  1. import urllib
  2. import urllib2
  3. url = 'http://www.baidu.com'
  4. user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
  5. values = {'name' : 'qiangzi',
  6. 'age' : 27,
  7. 'id' :1}
  8. headers = { 'User-Agent' : user_agent }
  9. data = urllib.urlencode(values)
  10. req = urllib2.Request(url, data, headers)
  11. response = urllib2.urlopen(req)
  12. the_page = response.read()

添加header也可以采用另一种方案
req.add_header('Referer', 'http://www.python.org/')
3)其他的一些常用方法
geturl() — 返回检索的URL资源,这个是返回的真正url,通常是用来鉴定是否重定向的,如下面代码4行url如果等于“http://www.python.org/ ”说明没有被重定向。如果被重定向了,有可能这个被重定向的值是需要用的,比如下载的时候如果我们要获取那个最终的下载地址
getcode() — 返回响应的HTTP状态代码,运行下面代码可以得到code=200,具体各个code代表的意思请参见文后附录。

4)HTTPCookieProcessor
很多网站的资源需要用户登录之后才能获取。
我们一旦登录后再访问其他被保护的资源的时候,就不再需要再次输入账号、密码。那么网站是怎么办到的呢?
一般来说,用户在登录之后,服务器端会为该用户创建一个Session。Session相当于该用户的档案。该档案就代表着该用户。
那么某一次访问请求是属于该用户呢?登录的时候服务器要求浏览器储存了一个Session ID的Cookie值。每一个访问都带上了该Cookie。服务器将Cookie中的Session ID与服务器中的Session ID比对就知道该请求来自哪个用户了。

opener
我们在调用urllib2.urlopen(url)的时候,其实urllib2在open函数内部创建了一个默认的opener对象。然后调用opener.open()函数。
但是默认的opener并不支持cookie。
那么我们先新建一个支持cookie的opener。urllib2中供我们使用的是HTTPCookieProcessor。

创建HTTPCookieProcessor需要一个存放cookie的容器。
Python提供的存放cookie的容器位于cookielib,有以下几个。
CookieJar -> FileCookieJar -> MozillaCookieJar / LWPCookieJar

  1. import cookielib
  2. import urllib2
  3. cookies = cookielib.CookieJar()
  4. cookieHandler = urllib2.HTTPCookieProcessor(cookiejar=cookies)
  5. opener = urllib2.build_opener(cookieHandler)
  6. request = urllib2.Request("http://www.baidu.com")
  7. urllib2.urlopen(request)
  8. for cookie in cookies:
  9. print cookie.name, cookie.value

上面的代码显示,urllib2的确帮我们把cookie从response中提取出来。但是如何保存在一个文件中呢?

urllib2.install_opener(opener)
会设置 urllib2 的全局 opener

最后来讲解下这个json包
json.dumps 将 Python 对象编码成 JSON 字符串
json.loads 将已编码的 JSON 字符串解码为 Python 对象

  1.  

原作者:我是强子
链接:http://www.jianshu.com/p/1416ccc99979
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Python的urllib和urllib2模块的更多相关文章

  1. Python urllib和urllib2模块学习(二)

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

  2. Python urllib和urllib2模块学习(一)

    (参考资料:现代魔法学院 http://www.nowamagic.net/academy/detail/1302803) Python标准库中有许多实用的工具类,但是在具体使用时,标准库文档上对使用 ...

  3. [转]Python中urllib与urllib2的区别与联系

    引用文章1:http://my.oschina.net/u/558071/blog/144792 引用文章2:http://zhuoqiang.me/python-urllib2-usage.html ...

  4. Python urllib和urllib2模块学习(三)

    build_opener()详解: 1.urllib2.urlopen()函数不支持验证.cookie或者其它HTTP高级功能,要支持这些功能,必须使用build_opener()函数创建自定这句话的 ...

  5. python中urllib和urllib2的简单用法

    import urllib #引入urllib模块,这里用urllib2也可以 fpage = urllib.urlopen( url ) #打开网页:例如url=‘http://www.xxx.co ...

  6. urllib 和urllib2 模块使用简例

    一.最简单的使用 import urllib,urllib2 response = urllib2.urlopen("https://www.baidu.com") print r ...

  7. 洗礼灵魂,修炼python(54)--爬虫篇—urllib2模块

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

  8. python爬虫 urllib模块url编码处理

    案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦'的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...

  9. urllib与urllib2的学习总结

    先啰嗦一句,我使用的版本是python2.7,没有使用3.X的原因是我觉得2.7的扩展比较多,且较之前的版本变化不大,使用顺手.3.X简直就是革命性的变化,用的蹩手.3.x的版本urllib与urll ...

随机推荐

  1. Mininet python代码创建拓扑、交互式界面创建主机、交换机

          python代码创建拓扑: from mininet.net importMininet net =Mininet() # Creating nodes in the network. c ...

  2. ThreadDeath 理解

    public class RunnableTest2 { public static Object obj1 = new Object(); public static Object obj2 = n ...

  3. BZOJ3994:约数个数和(莫比乌斯反演:求[1,N]*[1,M]的矩阵的因子个数)

    Description  设d(x)为x的约数个数,给定N.M,求   Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Outpu ...

  4. ubuntu 安装nodejs/npm

    安装发行稳定版 Ubuntu 默认仓库里带有Node.js,版本较旧,这并不是最新版,但是应该很稳定.执行如下命令:   1 2 sudo apt-getupdate sudo apt-getinst ...

  5. SSZipArchive使用详解

    下载SSZipArchive,点击我.或者自己在这里下载. SSZipArchive功能: 解压zip文件 解压密码保护的zip文件 创建zip文件 追加到zip文件 压缩文件 使用一个名字来压缩NS ...

  6. 《DSP using MATLAB》示例Example7.14

    代码: M = 20; alpha = (M-1)/2; l = 0:M-1; wl = (2*pi/M)*l; Hrs = [1, 1, 1, zeros(1, 15), 1, 1]; % Idea ...

  7. 关于Visual studio 2017安装方法的若干问题

    因为忙于生活,好几年没有看关于编程方面的书了,这几天闲,就准备在电脑上装上VS的最新版本,查了查,最新版是VS2017,.搜了下网上安装后大小,还真不小.下载离线安装包,完全下载居然需要25G左右,无 ...

  8. linux 系统下配置maven环境

    1.首先到Maven官网下载安装文件,目前最新版本为3.0.3,下载文件为apache-maven-3.0.3-bin.tar.gz,下载可以使用wget命令: 2.解压源码包 通过终端在/usr/l ...

  9. maven搭建多模块企业级项目

    首先,前面几次学习已经学会了安装maven,如何创建maven项目等,最近的学习,终于有点进展了,搭建一下企业级多模块项目. 好了,废话不多说,具体如下: 首先新建一个maven项目,pom.xml的 ...

  10. c++中using的使用

    #include <iostream> #include <vector> #include <map> using namespace std; //1.相当于t ...