urlretrieve函数解析,读书笔记

Python urllib urlretrieve函数解析

urllib模块提供的urlretrieve()函数。urlretrieve()方法间接将长途数据下载到本地。

urllib 模块
urlretrieve函数解析,读书笔记。urllib 提供了然三个高端的 Web 沟通库,援救 Web 协议, HTTP, FTP 和
Gopher 协议,同时也支撑对地面文件的拜访。urllib
模块的独辟蹊径效用是选择上述协议下载数据(从因特网、局域网、主机上下载)

API定义:

使用urllib.request.urlretrieve函数下载文件

urlretrieve(url, filename=None, reporthook=None, data=None)

1.1、urllib.urlopen()

一.一.一、urlopen() 张开2个给定 U中华VL 字符串与 Web
连接,并回到了文件类的对象。语法结构如下:
urlopen(urlstr, postQueryData=None)
备注:postQueryData用于post请求时传递参数

壹.1.二、urlopen再次来到 3个类公事对象,它提供了之类方法:
read() , readline() , readlines() , fileno() , close()
:那个办法的使用格局与公事对象完全壹致;
info():重返一个httplib.HTTPMessage 对象,表示远程服务器重临的头音讯
getcode():重返Http状态码。如若是http请求,200意味着请求成功完毕;40四意味网站未找到;
geturl():重回请求的url;

urllib.request.urlretrieve(url,filename=None,reporthook=None, data=None)

认为可行的话,接待一齐批评相互学习~Follow Me

参考文献
Urlretrieve函数解析

  • 参数filename钦点了保留本地路线(若是参数未钦赐,urllib会生成1个权且文件保存数据。)
  • 参数reporthook是二个回调函数,当连接上服务器、以及对应的多寡块传输甘休时会触发该回调,大家能够利用那几个回调函数来体现当前的下载速度。
  • 参数data指post导服务器的多少,该格局重临二个带有四个要素的(filename,
    headers) 元组,filename
    表示保留到地头的路线,header表示服务器的响应头

1.2、urllib.urlretrieve()

urlretrieve(url, filename=None, reporthook=None,data)

url:外部可能地面url
filename:钦点了保留到本地的不二等秘书技(倘若未钦定该参数,urllib会生成贰个临时文件来保存数据);
reporthook:是3个回调函数,当连接上服务器、以及对应的多少块传输甘休的时候会触发该回调。大家能够动用这么些回调函数来彰显当前的下载速度。
data:指post到服务器的数额。该方法重回三个包罗五个因素的元组(filename,
headers),filename表示保留到地头的路径,header表示服务器的响应头。

举例:

import urllib
def callbackfunc(blocknum, blocksize, totalsize):
    '''回调函数
    @blocknum: 已经下载的数据块
    @blocksize: 数据块的大小
    @totalsize: 远程文件的大小
    '''
    percent = 100.0 * blocknum * blocksize / totalsize
    if percent > 100:
        percent = 100
    print "%.2f%%"% percent
url = 'http://www.sina.com.cn'
local = 'D:\\python_web\\thread\\sina.html'
urllib.urlretrieve(url, local, callbackfunc)

美高梅开户网址,应用urlretrieve() 将数据下载到本地。

urllib.request.urlretrieve函数解析

urlretrieve(url, filename=None, reporthook=None, data=None)
参数 finename
钦命了封存本地路线(若是参数未钦点,urllib会生成一个权且文件保存数据。)
参数 reporthook
是一个回调函数,当连接上服务器、以及对应的多寡块传输甘休时会触发该回调,我们能够行使那么些回调函数来体现当前的下载速度。
参数 data 指 post 到服务器的多寡,该措施再次来到一个暗含七个要素的(filename,
headers)元组,filename 表示保留到本地的门道,header 表示服务器的响应头。

  • 上边通过例子来演示一下那一个法子的应用,那一个例子将一张图纸抓取到地面,保存在此文件夹中,同时体现下载的快慢。

from six.moves import urllib


def Schedule(a, b, c):
    """
    a:已经下载的数据块
    b:数据块的大小
    c:远程文件的大小
    """
    per = 100.0*float(a*b)/float(c)
    if per > 100:
        per = 100
    print("a", a)
    print("b", b)
    print("c", c)
    print('{:.2f}%'.format(per))


url = 'https://avatars1.githubusercontent.com/u/14261323?s=400&u=150449ce27748c3b23b5175f8c8342c918ae6aa8&v=4'
local = 'mylogo.png'
filename, _ = urllib.request.urlretrieve(url, local, Schedule)
# ('mylogo.png', <http.client.HTTPMessage object at 0x000001FD6491D6D8>)
print(filename)
# mylogo.png

# a 0
# b 8192
# c 38225
# 0.00%
# a 1
# b 8192
# c 38225
# 21.43%
# a 2
# b 8192
# c 38225
# 42.86%
# a 3
# b 8192
# c 38225
# 64.29%
# a 4
# b 8192
# c 38225
# 85.72%
# a 5
# b 8192
# c 38225
# 100.00%

将baidu的html抓取到当地,保存在”./baidu.html”文件中,同时出示下载的进度。

– 参数 finename
钦定了封存本地路线(假诺参数未钦点,urllib会生成叁个权且文件保存数据。)

    #!/usr/bin/env python  
    # coding=utf-8  
    import os  
    import urllib  

    def cbk(a,b,c):  
        '''''回调函数 
        @a:已经下载的数据块 
        @b:数据块的大小 
        @c:远程文件的大小 
        '''  
        per=100.0*a*b/c  
        if per>100:  
            per=100  
        print '%.2f%%' % per  

    url='http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2'  
    dir=os.path.abspath('.')  
    work_path=os.path.join(dir,'Python-2.7.5.tar.bz2')  
    urllib.urlretrieve(url,work_path,cbk)  

 

 

– 参数 reporthook
是一个回调函数,当连接上服务器、以及相应的数据块传输截至时会触发该回调,大家得以应用那个回调函数来显示当前的下载速度。

urlopen()可以轻松到手远端html页面新闻,然后经过Python正则对所须要的数量实行分析,匹配出想要用的数目,再选取urlretrieve()将数据下载到本地。对于访问受限大概对连接数有限量的远程url地址能够选用proxies(代理的办法)连接.

 

– 参数 data 指 post
到服务器的数目,该方法再次回到一个带有多少个要素的(filename,
headers)元组,filename 表示保留到本地的门径,header 代表服务器的响应头。

用法:

>>> import urllib.request
>>>local_filename,headers=urllib.request.urlretrieve('http://python.org/')
>>> html = open(local_filename)
>>> html.close()

 

注意:当html=open(local_filename),然后lines=html.readlines()时恐怕会出现unicode错误

拍卖方法:html=open(local_filename,’utf-8’)那样就会减轻unicode难点。

例子:抓取web页面

#coding:utf-8
from urllib.request import urlretrieve

def firstNonBlank(lines):
    for  eachLine in lines:
        if not eachLine.strip():
            continue
        else:
            return eachLine

def firstLast(webpage):
    f=open(webpage,encoding='utf-8')
    lines=f.readlines()
    f.close()
    print(firstNonBlank(lines))
    lines.reverse()
    print(firstNonBlank(lines))

def download(url='http://www.baidu.com',process=firstLast):
    try:
        retval=urlretrieve(url)[0]
    except IOError:
        retval=None
    if retval:
        process(retval)

if __name__=="__main__":
    download()

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图