笔记-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的更多相关文章

  1. Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html

    Python3学习笔记(urllib模块的使用)   1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None,  ...

  2. python urllib模块的urlopen()的使用方法及实例

    Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据. 一.urllib模块urlopen()函数: urlopen(url, data=N ...

  3. Python:urllib和urllib2的区别(转)

    原文链接:http://www.cnblogs.com/yuxc/ 作为一个Python菜鸟,之前一直懵懂于urllib和urllib2,以为2是1的升级版.今天看到老外写的一篇<Python: ...

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

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

  5. python urllib和urllib2 区别

    python有一个基础的库叫httplib.httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现 ...

  6. Python urllib urlretrieve函数解析

    Python urllib urlretrieve函数解析 利用urllib.request.urlretrieve函数下载文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Ur ...

  7. 笔记-python操作mysql

    笔记-python操作mysql 1.      开始 1.1.    环境准备-mysql create database db_python; use db_python; create tabl ...

  8. 笔记-python异常信息输出

    笔记-python异常信息输出 1.      异常信息输出 python异常捕获使用try-except-else-finally语句: 在except 语句中可以使用except as e,然后通 ...

  9. 笔记-python -asynio

    笔记-python -asynio 1.      简介 asyncio是做什么的? asyncio is a library to write concurrent code using the a ...

  10. 笔记-python lib-pymongo

    笔记-python lib-pymongo 1.      开始 pymongo是python版的连接库,最新版为3.7.2. 文档地址:https://pypi.org/project/pymong ...

随机推荐

  1. C# 实现Tree,包含parentId和children

    1.先定义一个类型 public class Node { [JsonProperty(PropertyName = "id", NullValueHandling = NullV ...

  2. php文件缓存数据

    最近在做微信的摇一摇跑马活动,实现原理是用户摇动手机,通过ajax往数据库写入数据(小马跑的步数),然后PC端用过ajax每一秒钟从数据库中调取一次数据(小马跑的步数),然后显示在PC屏幕上,这样就会 ...

  3. node-amqp 使用fanout发布订阅rabbitmq消息

    publisher代码 const amqp = require('amqp'); let option = { host: 'server-ip', port: 5672, login: 'gues ...

  4. 用于<挣值管理>的各种指标计算

    PV(Planning Value) 含义:计划价值,截至到某个时间计划工作经批准的成本预算. 公式:PV=计划工作数X计划单价. BAC 含义:完工预算,截至到完工时间计划工作经批准的成本预算,即完 ...

  5. html5响应式

    (function (doc, win) { var docEl = doc.documentElement, resizeEvt = ‘orientationchange’ in window ? ...

  6. JVM垃圾回收机制四

    GCRoots与可达性分析 Java中的四种引用 强引用.软引用.弱引用.虚引用.这四种引用的强度是逐渐减弱的,JVM垃圾回收的力度是逐渐增强的. 四种引用的作用 1.可以让程序员通过代码来控制对象的 ...

  7. Kendo UI Validator 概述

    Kendo UI Validator 概述 Kendo UI Validator 支持了客戶端校驗的便捷方法,它基於 HTML 5 的表單校驗功能,支持很多內置的校驗規則,同時也提供了自定義規則的便捷 ...

  8. jquery笔记1--选择器

    一.概述:jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是“write ...

  9. iOS-浅谈runtime运行时机制02-runtime简单使用

    http://blog.csdn.net/jiajiayouba/article/details/44201079 由于OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方 ...

  10. linux下杀毒工具clamav

    ClamAV 杀毒是Linux平台最受欢迎的杀毒软件,ClamAV属于免费开源产品,支持多种平台,如:Linux/Unix.MAC OS X.Windows.OpenVMS.ClamAV是基于病毒扫描 ...