分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

urllib 学习二

发布时间:2023-09-06 01:31责任编辑:沈小雨关键词:url
编码解码:

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能不能完全替代urllib?

???????url里面有一个很重要的函数urllib.urlencode,这个是在urllib2里面是没有的,所以我们一般都是urllib和urllib2混用。

???????1)urllib2.urlopen()

???????这个在urllib里面也有,唯一的就是加了一个timeout参数

???????????a.url

???????????b.data

???????????c.timeout:超时时间,比如我设置了一个超时时间3秒,那么我3秒内连接不到远程的服务器,它就会直接报错

???????3)错误处理HTTPError,e


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 utllib2
????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


实例:
???# -*- 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()

???运行结果,这个就是通过定制的http头






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()


???实例2:

???????如果我创建了一个opener,那我后面的函数还想用该怎么办呢?怎么将这个opener保存起来呢?

???????保存opener为默认

???????????1.urllib2.install_opener (我们可以把创建处理的opener,给它保存到urllib2这个库里面,调用urllib2的时候,就会直接去下载安装这个opener了)

???????????2.示例:install_debug_opener

???示例:Request_post_debug
???????1.打印http调试信息
???????2.POST数据
???????????# -*- 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()

???运行结果,我们可以看到,这中间就是打印出来的cookie。
???我们的opener实际上是带着这些cookie信息的,那我下次再发一个请求过去的时候,它会把这个cookie也发送过去。

urllib 学习二

原文地址:http://www.cnblogs.com/FRESHMANS/p/8058920.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved