读书笔记,urlretrieve函数解析

Python urllib urlretrieve函数解析

urllib模块提供的urlretrieve()函数。urlretrieve()方法直接将远程数据下载到本地。

urllib 模块
urllib 提供了然3个高级的 Web 调换库,扶助 Web 协议, HTTP, FTP 和
Gopher 协议,同时也支撑对该麻芋果件的拜会。urllib
模块的出格成效是使用上述协议下载数据(从因特网、局域网、主机上下载)

API定义:

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

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

1.1、urllib.urlopen()

1.1.壹、urlopen() 张开二个给定 UOdysseyL 字符串与 Web
连接,并赶回了文件类的靶子。语法结构如下:
urlopen(urlstr, postQueryData=None)
备注:postQueryData用于post请求时传递参数

壹.1.二、urlopen再次来到 3个类公事对象,它提供了之类方法:
读书笔记,urlretrieve函数解析。read() , readline() , readlines() , fileno() , close()
:这么些办法的选拔方法与公事对象完全同样;
info():重临3个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是3个回调函数,当连接上服务器、以及对应的数据块传输截至时会触发该回调,大家得以使用这几个回调函数来体现当前的下载速度。
  • 参数data指post导服务器的数目,该情势重回多个暗含五个要素的(filename,
    headers) 元组,filename
    表示保留到地面包车型大巴门路,header代表服务器的响应头

1.2、urllib.urlretrieve()

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

url:外部或许本地url
filename:钦命了保留到本地的不2秘诀(假使未钦点该参数,urllib会生成1个权且文件来保存数据);
reporthook:是一个回调函数,当连接上服务器、以及对应的数据块传输停止的时候会触发该回调。大家得以选拔那些回调函数来呈现当前的下载速度。
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会生成2个权且文件保存数据。)
参数 reporthook
是1个回调函数,当连接上服务器、以及对应的数码块传输截至时会触发该回调,大家能够使用这几个回调函数来体现当前的下载速度。
参数 data 指 post 到服务器的数额,该措施重返3个分包多少个成分的(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-八’)那样就会缓解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地图