仅从发送它们的服务器下载一个映像

时间:2015-01-24 22:14:57

标签: python libcurl pycurl

有一台服务器从CCTV发送图像。数据如下所示:

--BoundaryString
Content-type: image/jpeg
Content-Length:       15839
... first image in binary...
--BoundaryString
Content-type: image/jpeg
Content-Length:       15895
... second image in binary...

等等(它无限期地继续)。我正在尝试使用pyCurl来获取一个这样的图像:

curl = pycurl.Curl()
curl.setopt(curl.URL, 'http://localhost:8080')
with open('image.jpg', 'w') as fd:
    curl.setopt(curl.WRITEFUNCTION, fd.write)
    curl.perform()

但它不会在一个图像后停止并继续从服务器读取。有没有办法告诉curl在一部分之后停止?

或者,我可以使用套接字并实现一个简单的GET /我自己。这不是问题。但是我想知道在这种情况下是否可以使用pyCurl,我也想知道这是什么,因为它看起来不像是一个合适的多部分消息给我。 / p>

服务器被称为"运动" (Linux的视频运动检测守护进程)。

谢谢。

1 个答案:

答案 0 :(得分:0)

这是一些适合我的代码。 (python 2) 这将获取服务器发送的所有图像。如果您在保存图像后只需要一个sys.exit(0)

from functools import partial
import socket


def readline(s):
    fx = partial(s.recv, 1)
    ret = [x for x in iter(fx, '\n')]
    return ''.join(ret)


def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("127.0.0.1", 8080))

    while True:
        line = readline(s)
        if line.rstrip('\r') == '--BoundaryString':
            content_type = readline(s)
            length = int(readline(s).rstrip('\r').split()[-1])
            _ = readline(s)  # we skip an empty line
            image = ''
            while length:
                data = s.recv(length)  # here is receiving only 1375 bytes even if you tell it more
                length -= len(data)  # so we decrement and retry
                image += data
            # print repr(image[:20])  # was for debug
            # TODO --> open a file and save the image

if __name__ == "__main__":
    main()