urllib.urlretrieve 方法下载文件不完整,源文件40mb,下载后之后100kb。

# coding=utf-8
import subprocess
import urllib
import os
import time
from socket import *


def pid_tomcat():
    child = subprocess.Popen(['pgrep', '-f', "tomcat"], stdout=subprocess.PIPE, shell=False)
    response = child.communicate()[0]
    tomcat = [int(pid) for pid in response.split()]
    return tomcat

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

if __name__ == "__main__":
    tcpserver = socket(AF_INET, SOCK_STREAM)
    # 本地信息绑定
    tcpserver.bind(("192.168.128.57", 7788))
    # 进行监听
    tcpserver.listen(1)
    # 客户端接受
    while True:
        print ("持续监听中...")
        newsocket, clientaddr = tcpserver.accept()
        recdata = newsocket.recv(1024)
        recdata = eval(recdata)
        print "接收到的数据为:" + str(recdata)
        while True:
            pid = pid_tomcat()
            try:
                tomcat_pid = pid[0]
                os.system("kill -9 " + str(tomcat_pid))
            except:
                break
            print("获取到的tomcat的pid为" + str(tomcat_pid))

        # 下载新的war包
        war_path = '/opt/Tomcat7_nlu/webapps/'
        for key in recdata:
            url = recdata[key]
            war_name = (url.split("/")[-1]).split("-")[0]
            print("在url地址中切出来的war包名字为:" + str(war_name))
            if ".war" in war_name:
                pass
            else:
                war_name += ".war"
            will_del = war_name.split(".")[0]
            print("在文件中切出来的关键字为:" + str(will_del))
            # 删除掉旧的war包和文件夹
            os.system("rm -rf /opt/Tomcat7_nlu/webapps/" + will_del + "*")
            # 下载新的war包
            download_path = war_path + war_name
            urllib.urlretrieve(url, download_path, Schedule)
        # 启动tomcat
        os.system("/opt/Tomcat7_nlu/bin/startup.sh")
        time.sleep(250)
        # 操作完成后,给客户端返回信息,让客户端继续执行
        newsocket.send("server has been restart!!!")
        newsocket.close()
阅读 4.8k
2 个回答

问题解决了,下载的地址需要登录,抓包后得到了post需要的数据。模拟登陆后,再跳转到下载链接就OK了!!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题