通过python从HTTP检索图像

时间:2018-11-08 17:00:09

标签: python http

我是Python的新手,但我真的很想知道,这意味着什么。

在我的书中,我有一个代码:

for t in np.linspace(0,2*np.pi,100): plt.plot(np.cos(t), np.sin(t), 'k.')

响应为:

import socket
import time
HOST = 'data.pr4e.org'
PORT = 80
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((HOST, PORT))
mysock.sendall(b'GET http://data.pr4e.org/cover3.jpg HTTP/1.0\r\n\r\n')
count = 0
picture = b""
while True:
    data = mysock.recv(5120)
    if len(data) < 1: break
    #time.sleep(0.25)
    count = count + len(data)
    print(len(data), count)
    picture = picture + data
    mysock.close()
    # Look for the end of the header (2 CRLF)
    pos = picture.find(b"\r\n\r\n")
    print('Header length', pos)
    print(picture[:pos].decode())
    # Skip past the header and save the picture data
    picture = picture[pos+4:]
    fhand = open("stuff.jpg", "wb")
    fhand.write(picture)
    fhand.close()

我想知道:  -这些数字在回复开始时是什么意思?  -谁能推荐一个来源来阅读有关获取假人图像的信息?

2 个答案:

答案 0 :(得分:1)

它们是

的结果
print(len(data), count)

分别到目前为止的数据长度和已接收的数据总数。

答案 1 :(得分:1)

由于通过计算机网络进行的数据传输会将数据分成数据包,因此您不会一次收到全部数据。因此,该代码正在执行的操作是接收“块”数据,打印出的是“块”的大小和接收到的数据总量(通过print(len(data), count)行)。

一旦接收到所有数据,就可以提取图像数据。由于您正在使用HTTP,因此收到的数据将是HTTP响应。 HTTP响应由两部分组成:标头,标头是一系列键值对,它们提供有关响应本身的信息,并且是输出末尾要打印的内容。内容即数据,在您的情况下还包含图片。

在HTTP标头中,内容由两个行尾\r\n\r\n分隔。因此picture.find(b"\r\n\r\n")看起来是标题结束和内容(图像)开始的位置。

如果您需要做的只是使用HTTP检索图像,我建议您看看requests软件包。