Python笔记 之 urllib模块简介

本文介绍了Python中的urllib模块,包括其拆分后的组成部分如urllib.request、urllib.parse和urllib.error。通过示例展示了如何使用urlopen方法来读取网页内容,以及如何使用urlretrieve方法下载文件。同时,还介绍了如何处理代理、SSL上下文和错误处理。
摘要由CSDN通过智能技术生成

标准模块urllib已被拆分为多个部分,在python3中将其重命名为urllib.request, urllib.parse,和urllib.error.
官方说明文档

简单介绍

urllib.urlopen(url [,data [,代理[,context ] ] ] )
打开URL对以进行读取。
如果URL没有方案标识符,则将打开本地文件;否则,它将打开网络上某个服务器的套接字。
如果无法建立连接,则会引发IOError异常。
如果成功,则返回类似文件的对象,该支持了以下方法:
read(),readline(),readlines(),fileno(), close(),info(),getcode()和geturl()。

import urllib.parse,urllib.request
params = urllib.parse.urlencode({'keyword':'晚熟的人'})
f = urllib.request.urlopen("https://search.jd.com/Search?%s" % params)
n = '\n'
print(f.getcode(),n,
      f.fileno(),n,
      f.info(),n,
      f.geturl(),n,
      f.readline(),n,
      f.readlines(),n,
      f.close())

输出结果

200 
 788 
 Date: Fri, 04 Dec 2020 07:38:29 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
Expires: Fri, 04 Dec 2020 07:38:28 GMT
Cache-Control: max-age=0
Server: jfe
Strict-Transport-Security: max-age=7776000

 
 https://search.jd.com/Search?keyword=%E6%99%9A%E7%86%9F%E7%9A%84%E4%BA%BA 
 b"<script>window.location.href='https://passport.jd.com/uc/login'</script>" 
 [] 
 None

urllib.urlretrieve(url [,filename [,reporthook [,data [,context ] ] ] ] )
将URL表示的网络对象复制到本地文件,返回值为元组。
url 参数,如果URL指向本地文件,或者存在对象的有效缓存副本,则不会复制该对象。
filename参数(如果存在)指定要复制到的文件位置(如果不存在,则该位置将是具有生成名称的临时文件)。
reporthook 参数(如果存在)是可调用的,它将在建立网络连接时被调用一次,此后每个块读取一次。
可调用对象将传递三个参数:到目前为止已传输的块数,块大小(以字节为单位)以及文件的总大小。
如果url使用http:方案标识符,则可以提供可选的data 参数以指定POST请求(通常,请求类型为GET)。
可以将context参数设置为一个ssl.SSLContext实例,以配置在urlretrieve()建立HTTPS连接时使用的SSL设置。

import urllib.request

def sayHello(blockNum,blockSize,totalSize):
    print('BlockSize=%d,'
          'BlockNumber=%d,'
          'TotalSize=%d,'
          'LeftSize=%d'%(blockNum,blockSize,totalSize,totalSize-blockSize*blockNum if totalSize-blockSize*blockNum>0 else 0))
file = urllib.request.urlretrieve(url='https://docs.python.org/2/library/urllib.html',filename='temp.html',reporthook=sayHello,data=None)

输出结果

BlockSize=0,BlockNumber=8192,TotalSize=69794,LeftSize=69794
BlockSize=1,BlockNumber=8192,TotalSize=69794,LeftSize=61602
BlockSize=2,BlockNumber=8192,TotalSize=69794,LeftSize=53410
BlockSize=3,BlockNumber=8192,TotalSize=69794,LeftSize=45218
BlockSize=4,BlockNumber=8192,TotalSize=69794,LeftSize=37026
BlockSize=5,BlockNumber=8192,TotalSize=69794,LeftSize=28834
BlockSize=6,BlockNumber=8192,TotalSize=69794,LeftSize=20642
BlockSize=7,BlockNumber=8192,TotalSize=69794,LeftSize=12450
BlockSize=8,BlockNumber=8192,TotalSize=69794,LeftSize=4258
BlockSize=9,BlockNumber=8192,TotalSize=69794,LeftSize=0

urllib.urlcleanup()
清除调用可能建立的缓存 urlretrieve()。

urllib.request.urlcleanup()

urllib.ContentTooShortError(msg[, content])
如果URL内容过少抛错

urllib.request.ContentTooShortError('Warning','Content is to less')

urllib.quote(string[, safe])
引用特殊字符

quote = urllib.request.quote('/n~connolly/',safe='/',encoding='utf8')

输出结果

/n~connolly/

urllib.unquote(string)
将%xx转义符替换为它们的等效单字符

quote = urllib.request.unquote('/%7Econnolly/',encoding='utf-8')

输出结果

/~connolly/

urllib.url2pathname(path)
将URL转换为本地路径

url = urllib.request.url2pathname('https://search.jd.com/Search?keyword=%E6%99%9A%E7%86%9F%E7%9A%84%E4%BA%BA')

输出结果

S:\search.jd.com\Search?keyword=晚熟的人

urllib.pathname2url(path)
将本地路径转URL

url = urllib.request.pathname2url('F:\Pythonfiles\DataAnalysis')

输出结果

///F:/Pythonfiles/DataAnalysis

urllib.getproxies()
获取本机的http代理

proxies = urllib.request.getproxies()
print(proxies)

输出结果

{}

urllib.URLopener([proxies[, context[, **x509]]])
打开,读写URL的基类,有如下方法(属性):
open(fullurl[, data])
使用适当的协议打开URL
retrieve(url[, filename[, reporthook[, data]]])
打开并缓存URL
version:显示Python版本

import urllib.request
def sayHello(blockNum,blockSize,totalSize):
    print('BlockSize=%d,'
          'BlockNumber=%d,'
          'TotalSize=%d,'
          'LeftSize=%d'%(blockNum,blockSize,totalSize,totalSize-blockSize*blockNum if totalSize-blockSize*blockNum>0 else 0))
opener = urllib.request.URLopener()
filehandle = opener.open('https://docs.python.org/2/library/urllib.html')
opener.retrieve(url='https://docs.python.org/2/library/urllib.html',filename='temp.html',reporthook=sayHello,data=None)
print(opener.version,'\n',filehandle)

输出结果

BlockSize=0,BlockNumber=8192,TotalSize=69794,LeftSize=69794
BlockSize=1,BlockNumber=8192,TotalSize=69794,LeftSize=61602
BlockSize=2,BlockNumber=8192,TotalSize=69794,LeftSize=53410
BlockSize=3,BlockNumber=8192,TotalSize=69794,LeftSize=45218
BlockSize=4,BlockNumber=8192,TotalSize=69794,LeftSize=37026
BlockSize=5,BlockNumber=8192,TotalSize=69794,LeftSize=28834
BlockSize=6,BlockNumber=8192,TotalSize=69794,LeftSize=20642
BlockSize=7,BlockNumber=8192,TotalSize=69794,LeftSize=12450
BlockSize=8,BlockNumber=8192,TotalSize=69794,LeftSize=4258
BlockSize=9,BlockNumber=8192,TotalSize=69794,LeftSize=0
Python-urllib/3.7 
 <addinfourl at 1656479719776 whose fp = <http.client.HTTPResponse object at 0x000001819BD67828>>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值