python - 套接字下载图像

时间:2013-04-11 10:08:13

标签: python image sockets download binary

早上好,社区。

谷歌过了几个小时后我才开始这个帖子。 我正在尝试使用python套接字模块从www下载图片。 我用“recv()”获取图片的来源,并以二进制模式将其写入文件。 使用“answer.split(”image / jpeg“)将标题中的内容拆分”并不能解决问题。

继承我的代码:

import socket

socket.setdefaulttimeout(30)

HOST = 'ict.de'   
PORT = 80         

def makestr(s):#create paket-string from list
    rs = ""
    for x in range(0,len(s)-1):
            rs+=s[x]+"\r\n"
    rs+="\r\n"
    return rs

def sendcap(sdata):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    s.send(sdata)

    recvd=""
    while True:
        data = s.recv(1024)
        if not data: print " Done "; break
        recvd += data
    data = recvd.split("image/jpeg")[1]
    s.close()

    return data

xy = []  
xy.append("GET /fileadmin/ict/images/Presse/Download-Button_1700x1000.jpg HTTP/1.1")
xy.append("Host: www.ict.de")
xy.append("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101      Firefox/19.0")
xy.append("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
xy.append("Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3")
xy.append("Accept-Encoding: gzip, deflate")
xy.append("DNT: 1")
xy.append("Connection: keep-alive")
data = sendcap(makestr(xy))
f = open("logo.jpg","wb")
f.write(data)
f.close()

纯文本中的数据是这样的(没有标题,在图像/ jpeg中分割)“rØÿá5ExifMM* bj(1r2Ž‡i¤Ðü€''Adobe Photoshop CS5 Windows2012:03:05 13:37:44 ¤è&(。ÿHHÿØÿíAdobe_CMÿîAdobed€ÿÛ“ÿÀ^”ÿÝÿÝ?3!1AQa“q2'¡B#$RÁb34r,ÑC%'Sðáñcs5¢²& D”TdE£t6ÒUâeò³“”

看起来像二进制数据。

当我尝试使用windows picture show打开文件时,会收到错误,该文件已损坏。

希望有人能帮助我。

1 个答案:

答案 0 :(得分:0)

'image/jpeg'分割不起作用,因为在此之后有两个'\r\n' s终止HTTP标头。

不保证标题有任何特定顺序,因此处理这样的响应可能会突然停止工作。

如果您需要查找标题结尾标记:

data = recvd.split("\r\n\r\n", 1)[1]

但当然只有在没有发送chunked时才会有效。

有些库设计用于执行此类操作(requestsurllib2),为什么不使用它们?