Python的urllib和urllib2模块都作与请求URL相关的操做,但他们提供不一样的功能。他们两个最显着的差别以下:html
urllib2能够接受一个Request对象,并以此能够来设置一个URL的headers,可是urllib只接收一个URL。这意味着,你不能假装你的用户代理字符串等。
urllib模块能够提供进行urlencode的方法,该方法用于GET查询字符串的生成,urllib2的不具备这样的功能。这就是urllib与urllib2常常在一块儿使用的缘由。python
经常使用的方法json
urllib2.urlopen(url[, data][, timeout])
urlopen方法是urllib2模块最经常使用也最简单的方法,它打开URL网址,url参数能够是一个字符串url或者是一个Request对象。URL没什么可说的,Request对象和data在request类中说明,定义都是同样的。浏览器
对于可选的参数timeout,阻塞操做以秒为单位服务器
import urllib2 response = urllib2.urlopen('http://python.org/') html = response.read()
urlopen方法也可经过创建了一个Request对象来明确指明想要获取的url。调用urlopen函数对请求的url返回一个response对象。这个response相似于一个file对象,因此用.read()函数能够操做这个response对象,关于urlopen函数的返回值的使用,咱们下面再详细说。cookie
import urllib2 req = urllib2.Request('http://python.org/') response = urllib2.urlopen(req,data='abc') the_page = response.read()
Request类是一个抽象的URL请求。
这里用到了urllib2.Request类,对于上例,咱们只经过了URL实例化了Request类的对象,其实Request类还有其余的参数。
data是做为参数请求,若是data不等于None,则该请求为POST,不然为GET函数
import urllib import urllib2 url = 'http://www.baidu.com' values = {'name' : 'qiangzi', 'age' : 27, 'id' :1} 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.baidu.com' user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' values = {'name' : 'qiangzi', 'age' : 27, 'id' :1} headers = { 'User-Agent' : user_agent } data = urllib.urlencode(values) req = urllib2.Request(url, data, headers) response = urllib2.urlopen(req) 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表明的意思请参见文后附录。ui
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
import cookielib import urllib2 cookies = cookielib.CookieJar() cookieHandler = urllib2.HTTPCookieProcessor(cookiejar=cookies) opener = urllib2.build_opener(cookieHandler) request = urllib2.Request("http://www.baidu.com") urllib2.urlopen(request) for cookie in cookies: print cookie.name, cookie.value
上面的代码显示,urllib2的确帮咱们把cookie从response中提取出来。可是如何保存在一个文件中呢?
urllib2.install_opener(opener)
会设置 urllib2 的全局 opener
最后来说解下这个json包
json.dumps 将 Python 对象编码成 JSON 字符串
json.loads 将已编码的 JSON 字符串解码为 Python 对象
原做者:我是强子连接:http://www.jianshu.com/p/1416ccc99979來源:简书著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。