【爬虫】1.5 Web下载文件

下载文件就是 服务器向客户端发送文件名称与文件数据的过程。设计一个服务器程序,它被访问后向客户端发送一个文件的名称,客户端获取这个文件名称后,使用这个文件名称为参数再次访问服务器,服务器向客户端发送这个文件的数据,客户端获取数据后保存到本地,完整下载过程。

服务器程序server.py如下:


importflask
importos
​
app=flask.Flask(__name__)
​
​
@app.route("/")
defindex():
    if"fileName"notinflask.request.values:
        return"测试图像.jpg"
    else:
        data=b""
        try:
            fileName=flask.request.values.get("fileName")
            iffileName!=""and \
                    os.path.exists(fileName):  # 判断这个文件是否存在
                fobj=open(fileName, "rb")
                data=fobj.read()
                fobj.close()
        exceptExceptionaserr:
            data=str(err).encode()
        returndata
​
​
if__name__=="__main__":
    app.run()
​

程序运行后网址为http://127.0.0.1:5000 。访问这个网址。执行index函数,程序返回"测试图像.jpg" 的文件名称。如果再次访问服务器,并带上 fileName 的参数,那么服务器接收这个文件名称后就使用 os.path.exists(fileName) 判断这个文件是否存在。如果存在,则读取该文件的数据返回给客户端;如果不存在,则返回空值给客户端。

客户端程序client.py如下:


importurllib.request
importurllib.parse
​
url="http://127.0.0.1:5000"
try:
    html=urllib.request.urlopen(url)
    html=html.read()
    fileName=html.decode()
    print("准备下载:"+fileName)
    # ====================可使用urlretrieve函数简化====================
    data=urllib.request.urlopen(url+"?fileName="+urllib.parse.quote(fileName))
    data=data.read()
    fobj=open("download"+fileName, "wb")
    fobj.write(data)
    fobj.close()
    # ====================可使用urlretrieve函数简化====================
    print("下载完毕:", len(data), "字节")
exceptExceptionaserr:
    print(err)
​

这个程序先不带参数访问 http://127.0.0.1:5000,服务器会返回一个可以下载的文件名称给客户端,客户端获取这个文件名称 fileName ,之后再采用把这个文件名称放在地址栏后面的方式访问这个网站,即:

data=urllib.request.urlopen(url+"?fileName="+urllib.parse.quote(fileName))

服务器就把该文件的二进制数据发送给客户端。客户端接收后就保存到本地,名称是"download"+fileName

在服务器所在的文件夹中放一个名称为"测试图像.jpg"的文件,先执行服务器程序建立Web网站,然后运行客户端,可以看到下载文件的过程,例如:可以子client终端看到


实际上,在 urllib.request 中专门有一个 urlretrieve 函数 用于从服务器获取文件并保存到本地。其使用方法是:
urllib.request.urlretrieve(url,localFile)

它从 URL 的网站下载数据保存到本地的 localFile 文件中。使用这个函数后

客户端程序client.py简化如下:


importurllib.request
importurllib.parse
​
url="http://127.0.0.1:5000"
try:
    html=urllib.request.urlopen(url)
    html=html.read()
    fileName=html.decode()
    print("准备下载:"+fileName)
    urllib.request.urlretrieve(url+"?fileName="+urllib.parse.quote(fileName), "download"+fileName)
    print("下载完毕:")
exceptExceptionaserr:
    print(err)
​

下一篇文章:1.6 Web上传文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值