笔记-python-urllib
笔记-python-urllib
1. 简介
PYTHON3中将urllib,urllib2整合到URLLIB中
包括以下模块
urllib.request 请求模块(核心)
urllib.error 异常处理模块
urllib.parse url解析模块(主要用于url生成,格式处理)
urllib.robotparser robots.txt解析模块
2. urllib.request
基本过程是构造handler ,opener,安装opener,构造请求,使用urlopen执行请求;
2.1. handler
具体handler不详细列出;常用的有
代理:
proxy = urllib.request.ProxyHandler({"http": proxy_addr[0]})
#使用http.cookiejar.CookieJar()创建CookieJar对象
cookie:
cjar=http.cookiejar.CookieJar()
#使用HTTPCookieProcessor创建cookie处理器,并以其为参数构建opener对象
cookie=urllib.request.HTTPCookieProcessor(cjar)
2.2. opner构造及使用
build_opener([handler,…])
返回一个OpenerDirector实例
本函数按参数中给定顺序处理实例,参数可以是BaseHandler的实例或子类的实例;
下列类会最先处理实例,除非参数中包含它们或它们的子类: ProxyHandler ,
UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor.
实例:
上文构造了代理和cookie的handler
opener=urllib.request.build_opener(proxy)或
opener=urllib.request.build_opener(cookie)
安装opener后便可以使用urlopen了;
urllib.request.install_opener(opener)
install_opener实际是将opener置为全局参数_opener
2.3. 构造请求Request
构造请求,上面部分定义了使用什么来执行请求,下面将定义请求的内容:
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
调用Request创建Request对象,调用urlopen传入Request对象,返回一个相关请求response对象,这个应答对象如同一个文件对象;
2.3.1. data生成
data是一个字典,在使用前需要转换成字节码
test_data = {'ServiceCode':'aaaa','b':'bbbbb'}
test_data_urlencode = urllib.parse.urlencode(test_data)
2.4. urlopen
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
相当于opener通用版;
参数及特性:
返回对象:
对于http,https,返回一个http.client.HTTPResponse对象。
For FTP, file, and data URLs and requests explicitly handled by legacy URLopener and FancyURLopenerclasses, this function returns a urllib.response.addinfourl object.
对于返回对象,可以使用r.info() 、r.getcode() 、r.geturl()获取相应的当前环境信息、状态码、当前网页URL
urllib.request module uses HTTP/1.1
If context is specified, it must be a ssl.SSLContext instance describing the various SSL options. See HTTPSConnection for more details.
timeout 超时,如果不指定,使用默认
data决定是get还是post,但一般复杂一点的请求都使用Request函数了;
2.5. urlretrive
urlretrieve(url, filename=None, reporthook=None, data=None)
参数filename指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
reporthook实现代码:if reporthook: reporthook(blocknum, bs, size)
参数data指post导服务器的数据,该方法返回一个包含两个元素的(filename, headers) 元组,filename 表示保存到本地的路径,header表示服务器的响应头
def cbk(a,b,c):
per = 100.0*a*b/c
if per>100:
per=100
print("%.2f%%" % per)
url = "https://dzs.qisuu.la/34/34968/%E5%8F%B2%E4%B8%8A%E6%9C%80%E7%89%9B%E8%BD%AE%E5%9B%9E.txt"
urllib.request.urlretrieve(url, "b.txt",cbk)
该函数继承于python2,python3.6.5文档提及该函数以后可能作废;
2.6. 其它函数
urllib.request.getproxies() 获取代理参数
3. 使用
添加头部,使用代理:
proxy = urllib.request.ProxyHandler({"http": proxy_addr[0]})
opener = urllib.request.build_opener(proxy)
urllib.request.install_opener(opener)
req = urllib.request.Request(self.proxy_verify_addr, headers=proxy_headers)
发送post请求:
postdata = urllib.parse.urlencode(post).encode('utf-8')
req = urllib.request.Request(url, postdata)
response = urllib.request.urlopen(req)
使用cookie:
主要流程:构建CookieJar()对象cjar,再使用HTTPCookieProcessor()处理器,处理cjar,并通过build_opener()构建opener对象,设置成全局,通过urlopen()发送请求。
注意:需要导入Cookie处理模块http.cookiejar。
Import http.cookiejar
req=urllib.request.Request(url,postdata,headers=header)
#使用http.cookiejar.CookieJar()创建CookieJar对象
cjar=http.cookiejar.CookieJar()
#使用HTTPCookieProcessor创建cookie处理器,并以其为参数构建opener对象
cookie=urllib.request.HTTPCookieProcessor(cjar)
opener=urllib.request.build_opener(cookie)
#将opener安装为全局
urllib.request.install_opener(opener)
reponse=urllib.request.urlopen(request)
4. 异常处理和http状态码
当urlopen不能够处理一个response时,产生urlError。
不过通常的Python APIs异常如ValueError,TypeError等也会同时产生。
HTTPError是urlError的子类,通常在特定HTTP URLs中产生。
1. URLError
通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。
这种情况下,异常同样会带有"reason"属性,它是一个tuple(可以理解为不可变的数组),包含了一个错误号和一个错误信息。
2. 服务器上每一个HTTP应答对象response包含一个数字状态码
典型错误包含404(页面无法找到),403(请求禁止),401(带验证请求),成功200.
HTTP状态码通常分为5种类型,1-5数字开头,由3位整数组成;
200:请求成功 处理方式:获得响应的内容,进行处理
201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到
202:请求被接受,但处理尚未完成 处理方式:阻塞等待
204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃
300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃
301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL
302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL
304 请求的资源未更新 处理方式:丢弃
400 非法请求 处理方式:丢弃
401 未授权 处理方式:丢弃
403 禁止 处理方式:丢弃
404 没有找到 处理方式:丢弃
5XX 回应代码以“5”开头的状态码表示服务器端发现自己出现错误,不能继续执行请求 处理方式:丢弃
5. 附录
在Python2.X中,分urllib和urllib2,但在Python3.X中,都统一合并到urllib中。通过下表可以看到其中常见的变动;
相对来说,Python3.X对中文的支持比Python2.X友好。
urllib库对照速查表
|
Python2.X |
Python3.X |
|
urllib |
urllib.request, urllib.error, urllib.parse |
|
urllib2 |
urllib.request, urllib.error |
|
urllib2.urlopen |
urllib.request.urlopen |
|
urllib.urlencode |
urllib.parse.urlencode |
|
urllib.quote |
urllib.request.quote |
|
urllib2.Request |
urllib.request.Request |
|
urlparse |
urllib.parse |
|
urllib.urlretrieve |
urllib.request.urlretrieve |
|
urllib2.URLError |
urllib.error.URLError |
|
cookielib.CookieJar |
http.CookieJar |
笔记-python-urllib的更多相关文章
- Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html
Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, ...
- python urllib模块的urlopen()的使用方法及实例
Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据. 一.urllib模块urlopen()函数: urlopen(url, data=N ...
- Python:urllib和urllib2的区别(转)
原文链接:http://www.cnblogs.com/yuxc/ 作为一个Python菜鸟,之前一直懵懂于urllib和urllib2,以为2是1的升级版.今天看到老外写的一篇<Python: ...
- Python urllib和urllib2模块学习(一)
(参考资料:现代魔法学院 http://www.nowamagic.net/academy/detail/1302803) Python标准库中有许多实用的工具类,但是在具体使用时,标准库文档上对使用 ...
- python urllib和urllib2 区别
python有一个基础的库叫httplib.httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现 ...
- Python urllib urlretrieve函数解析
Python urllib urlretrieve函数解析 利用urllib.request.urlretrieve函数下载文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Ur ...
- 笔记-python操作mysql
笔记-python操作mysql 1. 开始 1.1. 环境准备-mysql create database db_python; use db_python; create tabl ...
- 笔记-python异常信息输出
笔记-python异常信息输出 1. 异常信息输出 python异常捕获使用try-except-else-finally语句: 在except 语句中可以使用except as e,然后通 ...
- 笔记-python -asynio
笔记-python -asynio 1. 简介 asyncio是做什么的? asyncio is a library to write concurrent code using the a ...
- 笔记-python lib-pymongo
笔记-python lib-pymongo 1. 开始 pymongo是python版的连接库,最新版为3.7.2. 文档地址:https://pypi.org/project/pymong ...
随机推荐
- (转)nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录
nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录 原文:http://www.cnblogs.com/kevingrace/p/6165572.html Nginx的geo模块 ...
- 在 WPF 中的线程
线程处理使程序能够执行并发处理,以便它可以做多个操作一次.节省开发人员从线程处理困难的方式,设计了 WPF (窗口演示文稿基金会).这篇文章可以帮助理解线程在 WPF 中的正确用法. WPF 内部线程 ...
- Linux环境 Java内存快速查看
最近生产环境遇到内存老是占用很大的情况,16G的内存Free的内存只剩100多M,仿佛一颗定时炸弹一般,说不定就服务Down了.于是开始网上不断的找查看内存使用的方法.现学现卖,以下通过一个例子来演示 ...
- LR脚本示例之常用函数
1.变量和参数的设置 //将IP地址和端口放入到参数中lr_save_string("127.0.0.1:1080","ip"); //退出脚本建议使用lr_e ...
- String 对象详解
原文地址:http://zangweiren.javaeye.com/blog/209895 作者:臧圩人(zangweiren) 网址:http://zangweiren.javaeye.com & ...
- Python 时间戳和日期相互转换
转载地址:http://liyangliang.me/posts/2012/10/python-timestamp-to-timestr/ 在写Python的时候经常会遇到时间格式的问题,每次都是上 ...
- 洛谷 P1433 吃奶酪
题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...
- itextsharp-5.2.1-修正无法签名大文件问题
PDF文件格式几乎是所有开发平台或者业务系统都热爱的一种文档格式. 目前有很多优秀的开源PDF组件和类库.主要平时是使用.NET和Java开发,所以比较偏好使用iText,当然,它本身就很强大.iTe ...
- UVA 690 PipelineScheduling 位运算+dfs+剪枝
一开始最容易想到间隔最多为n,但是结点还是太多了,需要优化. 预处理:预判一下并保存下一个可以放的位置距离之前的距离.这样可以减少很多判断. 最优化剪枝:如果当前长度+剩下没放的程序*最短间隔如果大于 ...
- SpringMVC-请求参数的绑定
绑定的机制 表单提交的数据都是k=v格式的 username=haha&password=123 SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的 要求 ...