在Python中通过HTTP检索图像

时间:2015-08-03 16:31:07

标签: python sockets http

我正在阅读一本名为" Python for Informatics"。

的免费电子书

我有以下代码:

import socket
import time

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send('GET http://www.py4inf.com/cover.jpg HTTP/1.0\n\n')

count = 0
picture = ""

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("\r\n\r\n")
print 'Header length',pos
print picture[:pos]

# Skip past the header and save the picture data
picture = picture[pos+4:]
fhand = open("stuff.jpg","w")
fhand.write(picture)
fhand.close()

我对http不了解,并且很难理解上面的代码!

我想我确实理解了mysock.connect()和mysock.send()的作用但是我需要解释第1行: 1) mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)。它做了什么?

现在,关于这一行: 2) data = mysock.recv(5120)。它创建了一个名为data的var,其中while循环运行时节省了5120个字节。但是这些数据是什么类型的数据以及我运行时会发生什么:picture = picture + data?它的图片=&#34;&#34; +数据,

  • 所以它添加了一个字符串?如果是对的,数据都有两个字符串数据 (标题)+ jpeg文件

???

最后: 3)

pos = picture.find("\r\n\r\n")
print 'Header length',pos
print picture[:pos]

pos = picture.find("/r/n/r/n"),这会在图片变量中搜索以查找2个新行&#34; / n / n&#34;因为我们使用了行mysock.send('GET http://www.py4inf.com/cover.jpg HTTP/1.0\n\n') ?? 有没有办法立即将jpeg文件保存在我们的硬盘驱动器上而不检索http标头并从jpeg文件中分离标题?

对不起我的英语...随意问一些你可能不理解的事情! 感谢

2 个答案:

答案 0 :(得分:1)

  1. 您的第一个问题已在SO上多次询问和回答。简短的回答是,“这只是一个技术性问题;你真的不需要知道。”

  2. 你是对的。

  3. 标题以两个CRLF结尾。如果您保存文件而不丢弃标题,它将不是JPEG格式,您将无法使用它。标题是允许文件通过互联网传输的。您必须丢弃它并仅保存有效负载。

答案 1 :(得分:1)

  1. mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)调用socket库中的socket类来创建新的网络端点。 socket.AF_INET告诉调用创建基于IP的套接字,socket.SOCK_STREAM请求一个面向流的(TCP)套接字,它会自动发送任何必要的确认和重试。

  2. 语句data = mysock.recv(5120)读取的块,最多 5120个字节。当没有更多数据时,recv()调用返回空字符串。测试似乎相当不正常,使用if len(data) == 0甚至if not len(data)会更好,但这是风格而非实质的细节。因此,语句picture = picture + data一次累积响应数据5120个字节(虽然命名很差,因为累积的数据实际上包括HTTP头和图片数据)。

  3. 语句pos = picture.find("\r\n\r\n")在返回的字符串中寻找HTTP标头的末尾。由于它找到字符串的开头而不是结尾,因此必须将4添加到偏移量以给出图片数据的起始位置。

  4. 给出的示例是尝试演示对HTTP数据的低级访问,显然,没有为您提供有关正在发生的事情的充分背景知识。访问数据的更常规方法是使用更高级别的库,例如urllib。这里有一些代码可以更简单地检索图像:

    >>> import urllib
    >>> response = urllib.urlopen("http://www.py4inf.com/cover.jpg")
    >>> content = response.read()
    >>> outf = open("cover.jpg", 'wb')
    >>> outf.write(content)
    >>> outf.close()
    

    我可以毫无问题地打开生成的JPEG文件。