Python 标准库 —— urllib(下载进度)

本文介绍了Python中urllib模块的基本使用方法,包括如何利用urllib.request进行网页内容的抓取,如何使用urlencode进行参数编码,以及如何通过quote和unquote处理URL中的中文。此外,还介绍了urllib.urlopen和urlretrieve的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:python 3 环境下的 urllib 库,将 urlopen、urlretrieve、quote 等实用函数统一封装在 urllib.request 下。

在可使用的各种网络函数库中,功能最为强大的可能是 urllib 和 urllib2 了。通过它们在网络上访问文件,就好像访问本地文件一样。通过一个简单的函数调用(urlopen),几乎可以把任何 url 所指向的东西作为程序的输入。想象一下,如果将这两个模块和 re 模块结合使用的效果:可以下载 web 页面,提取信息,以及自动生成报告等。

  • urlencode:将字典型的请求参数配置,编码为url能够识别的形式;

    >> request_paras = {
            'reportTime': '2017-12-31',
            'pageNum': 1
        }
    >> urlencode(paras)
    'reportTime=2017-12-31&pageNum=1'
    >> url = 'http://s.askci.com/stock/a/?' + urlencode(request_paras)
    >> url
    'http://s.askci.com/stock/a/?reportTime=2017-12-31&pageNum=1'
    >> 
    

0. url 中的中文:quote、unquote

1. urllib.urlopen():打开远程文件

>>> from urllib import urlopen
>>> webpage = urlopen('http://www.python.org')

可以像打开本地文件一样打开远程文件,不同之处在于只能使用只读模式,使用来自 urllib 的 urlopen 而不是 file 或者 open。

urlopen 返回的类文件对象(instance)支持 close/read/readline/readlines方法。

2. urllib.urlretrieve():获取远程文件

>>> from urllib import urlretrieve
>>> urlretrieve('http://www.python.org', '/root/workspaces/python_webpage.html')

urlopen 返回一个能从中读取数据的类文件对象(instance)。如果希望 urllib 为你下载文件并在本地文件中存储一个文件的副本,则可以使用 urlretrive。

从 url 上加载数据到本地:

if (not os.path.isfile(dataset)) and dataset == 'mnist.pkl.gz':
	origin = 'http://www.iro.umontreal.ca/~lisa/deep/data/mnist/mnist.pkl.gz'
	print 'Downloading data from %s' % origin
	urllib.urlretrieve(origin, dataset)

3. 下载进度

  • 如下的函数作为 urlretrieve 的 reporthook 命名参数的回调函数,

    def download_report(count, block_size, total_size):
        downloaded = count * block_size
        percent = 100. * downloaded / total_size
        percent = min(100, percent)
        print('downloaded %d, %.2f%% completed' % (downloaded, percent))
    
  • 查看 urlretrieve 源码发现,total_size 根据 Content-length 获取,如果未获得该参数,则 total_size 默认传参为 -1:

    ![这里写图片描述](https://img-blog.youkuaiyun.com/20180624141228819?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xhbmNodW5odWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

4. quote/quote_plus

除了通过 URL 读取和下载文件,urllib 还提供了一些函数操作 URL 本身,

  • quote(string[, safe])。返回一个字符串,其中所有的特殊字符(这些字符在 URL 中有特殊含义)都已被对 URL 友好的字符所代替。safe 字符串包含了不应该采用这种方式编码的字符,默认的是/
    • parse.quote('~')%7E
    • parse.quote(':')%3A
  • quote_plus(string[, safe]),功能和 quote 差不多,但用+号代替空格
  • unquote(string),和 quote 相反
  • unquote_plus(string),和 quote_plus相反

##4. parse_qs/parse_qsl

>> from urllib.parse import parse_qs
>> my_values = parse_qs('red=5&blue=0&green=', keep_blank_values=True)
>> print(repr(my_values))
{‘red’: [‘5’], ‘green’: [”], ‘blue’: [‘0’]}

如果 url 的 query 中有同一个 key 对应多个 value,其中 parse_qs() 可以把该相同 key 的 value 放在一个 list 中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值