编码解码:
python2 用法: urllib.urlencode() 编码 urlparse.parse_qs() 解码 python3 用法: urllib.parse.urlencode() 编码 urllib.parse.parse_qs() 解码
作用: 1)把字典数据转化成URL编码 2)用途 a)对URL参数进行编码 b)对post上去的form数据进行编码
示例
#python2.x
import urllib import urlparse def urlencode(): params = {'score': 100, 'name': '爬虫基础', 'comment': 'very good'} qs = urllib.urlencode(params) ###编码 print(qs) unqs = urlparse.parse_qs(qs) ##解码 print unqs if __name__ == '__main__': urlencode()
#python3.x
import urllib import urllib.parse def urlencode(): params = {'score': 100, 'name': '爬虫基础', 'comment': 'very good'} qs = urllib.parse.urlencode(params) ###编码 print(qs) unqs = urllib.parse.urlparse(qs) ##解码 print (unqs) if __name__ == '__main__': urlencode()
结果:
python2.x
urllib2中的两个重要概念:Openers和Handlers
1.Openers: 当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。 正常情况下,我们使用默认opener:通过urlopen。 但你能够创建个性的openers。 2.Handles: openers使用处理器handlers,所有的“繁重”工作由handlers处理。 每个handlers知道如何通过特定协议打开URLs,或者如何处理URL打开时的各个方面。例如HTTP重定向或者HTTP cookies。
实例:
import http.cookiejar import urllib2 def cookies(): cookejar = http.cookiejar.CookieJar() hadler = urllib.request.HTTPCookieProcessor(cookiejar=cookejar) opener = urllib.request.build_opener(hadler,urllib.request.HTTPHandler(debuglevel=1)) #####打印调试信息 s = opener.open("http://www.douban.com") print (s.read(100)) s.close() print ('=' * 80) print (cookejar._cookies) print ("=" * 80) s = opener.open("http://www.douban.com") s.close() cookies()
urllib2.Request
自定制headers
# -*- coding: utf-8 -*- import urllib2 def request(): # 定制 HTTP 头 headers = {'User-Agent': 'Mozilla/5.0', 'x-my-header': 'my value'} #在http里面自定义的头一般是x开头的 req = urllib2.Request('http://blog.kamidox.com', headers=headers) #创建一个请求 s = urllib2.urlopen(req) #打开这个请求,urlopen不仅仅可以接受一个网址作为参数,也可以接受request作为它的对象 print(s.read(100)) s.close() if __name__ == '__main__': request()
urllib2.bulid-opener
可以让我们去定制这个http的行为 1)BeseHandler及其子类 BeseHandler是所有HTTPHandler的父类 a.HTTPHandler(处理http请求的) b.HTTPSHandler(处理安全链接的请求) c.HTTPCookieProcessor(处理cookie的请求) 2)bulid-opener a.返回Handler列表,会把这个Handler都给它串起来,串起来以后,就类似于我们管道一样,当http请求应答回来的时候,它会流经这个Handler,让这个里面每一个Handler去处理不同的东西 b.返回OpenerDirector,这个参数很重要的方法就是open,这个open就是要去打开这个远程的链接去处理这个数 3)默认会创建的Handler链 Handler的链,实际上是一个Handler的数组,在调用这个urlOpener的时候,它默认的时候会是以下的链表,也就是,它会默认的把这个链表给你创建起来 a.ProxyHandler(如果设置了代理) b.UnknownHandler(不知道什么协议的时候,它会去调) d.HTTPHandler(处理http的请求) c.HTTPDefaultEorrorHandler(处理错误的请求) d.HTTPRedirectHandler(处理跳转,比如http出现301,302这种应答码的时候) e.FTPHandler(可以去支持FTP的协议) f.FileHandler(可以支持本地的文件打开) g.HTTPEorrorProcessor(可以去处理http的错误) e.HTTPSHandler(如果安装了ssl模块)
实例:
# -*- coding: utf-8 -*- import urllib2 import urllib def request_post_debug(): # POST data = {'username': 'kamidox', 'password': 'xxxxxxxx'} ##数据体 # headers = {'User-Agent': 'Mozilla/5.0', 'Content-Type': 'plain/text'} headers = {'User-Agent': 'Mozilla/5.0'} ###定制的头 req = urllib2.Request('http://www.douban.com', data=urllib.urlencode(data), headers=headers) //创建一个请求,这个请求是发送给豆瓣 opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1)) ##创建一个open打开器,如果不传参数,它就是给你传系统默认的Handler,如果我们传了参数给它,如果系统里面默认有的它就去去替换掉,如果系统没有它就去去添加 s = opener.open(req) ###用这个open去打开这个请求 print(s.read(100)) ###打印前面100个字节 s.close() if __name__ == '__main__': Request_post_debug()
如果我创建了一个opener,那我后面的函数还想用该怎么办呢?怎么将这个opener保存起来呢? 保存opener为默认 1.urllib2.install_opener (我们可以把创建处理的opener,给它保存到urllib2这个库里面,调用urllib2的时候,就会直接去下载安装这个opener了) 2.示例:install_debug_opener
示例:
# -*- coding: utf-8 -*- import urllib2 def request(): # 定制 HTTP 头 headers = {'User-Agent': 'Mozilla/5.0', 'x-my-header': 'my value'} req = urllib2.Request('http://blog.kamidox.com', headers=headers) s = urllib2.urlopen(req) print(s.read(100)) print(req.headers) s.close() def request_post_debug(): # POST data = {'username': 'kamidox', 'password': 'xxxxxxxx'} # headers = {'User-Agent': 'Mozilla/5.0', 'Content-Type': 'plain/text'} headers = {'User-Agent': 'Mozilla/5.0'} req = urllib2.Request('http://www.douban.com', data=urllib.urlencode(data), headers=headers) opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1)) s = opener.open(req) print(s.read(100)) s.close() def install_debug_handler(): opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1), urllib2.HTTPSHandler(debuglevel=1)) ##这里能处理HTTP协议和HTTPS协议 urllib2.install_opener(opener) ##将Handler安装到系统默认区,要打开的就是我们这里要安装的opener if __name__ == '__main__': install_debug_handler() request()
Cookies
1)cookieillib.CookieJar 提供解析并保存cookie的接口,因为cookie有些有生命周期,还有很多参数,这个类就是提供这些cookie的处理。 2)HTTPCookieProcessor 提供自动处理cookie的功能,它的父类也是BeseHandler,所以我们可以把这个cookie串起来,这样就可以处理一些信息。
示例:handle_cookies
# -*- coding: utf-8 -*- import urllib2 def handle_cookie(): #先定义一个处理cookie的信息 cookiejar = cookielib.CookieJar() ##先串联一个CookieJar的对象 handler = urllib2.HTTPCookieProcessor(cookiejar=cookiejar) ##创建一个HTTPCookieProcessor的对象,传入一个参数CookieJar进去 ##还需要创建一个新的handler,打印出它的调试信息 opener = urllib2.build_opener(handler, urllib2.HTTPHandler(debuglevel=1)) s = opener.open('http://www.douban.com') print(s.read(100)) s.close() if __name__ == '__main__': handle_cookie()
运行结果,这个应答里面有一个set_cookie,有一个bid
在收到这个请求之后,我们的CookieJar,包含这些服务器返回的cookie,我们可以把它打印出来。代码如下:
# -*- coding: utf-8 -*-
import urllib2
def handle_cookie(): ##先定义一个处理cookie的信息
cookiejar = cookielib.CookieJar() ##先串联一个CookieJar的对象
handler = urllib2.HTTPCookieProcessor(cookiejar=cookiejar) ##创建一个HTTPCookieProcessor的对象,传入一个参数CookieJar进去
opener = urllib2.build_opener(handler, urllib2.HTTPHandler(debuglevel=1))###还需要创建一个新的handler,打印出它的调试信息
s = opener.open('http://www.douban.com')
print(s.read(100))
s.close()
print('=' * 80)
print(cookiejar._cookies) ###这个属性就是服务器所有的cookie
print('=' * 80)
if __name__ == '__main__':
handle_cookie()
opener实际上是带着这些cookie信息的,那我下次再发一个请求过去的时候,它会把这个cookie也发送过去。