笔记-python-urllib
阅读原文时间:2023年07月14日阅读:2

笔记-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执行请求;

具体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)

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

构造请求,上面部分定义了使用什么来执行请求,下面将定义请求的内容:

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)

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函数了;

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文档提及该函数以后可能作废;

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

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章