我有一个由Python烧瓶构建的API服务器。我需要一组客户端/计算机通过发出http post请求将数据发送到API服务器。
这里的数据实际上是html内容。 (注意:我没有将合法数据转换成HTML / XML格式,数据本身就是我从网上收集的HTML),每页通常大约200KB。我试图通过使用串行/反序列和压缩来尽可能地减轻网络负载。
我正在考虑而不是通过网络发送原始HTML。是否有任何类型的方法,如序列化html对象(BeautifulSoup汤?)和反序列化在服务器端。或者使用一些压缩方法首先压缩文件,然后将数据发布到API服务器。在服务器端,它可以在收到压缩数据后对数据进行解压缩。
我做了什么:
(1)我试图将原始HTML文本转换为汤对象,然后使用Pickle对其进行序列化。但是,它告诉我太多的递归和错误。我也试过pickle原始的html,压缩性能很糟糕......几乎与原始的html字符串相同。
(2)我尝试使用zlib预先压缩文件,然后它的大小是原始文件的10%。但是,这是解决这个问题的合法方式吗?
有什么想法吗?
答案 0 :(得分:0)
好吧,我们受到了各位评论的启发,我想出了一个解决方案,使用zlib
压缩HTML内容并将数据发布到API服务器,在Flask API服务器端,我提取数据并推送到mongodb进行存储。
这部分可能会节省一些未来的头痛。
客户端:
myinput = "http://www.exmaple.com/001"
myoutput = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ... /html>"
result = {'myinput':myinput, 'myoutput': myoutput}
data = zlib.compress(str(result))
opener.open("www.host.com/senddata", data)
服务器端:
@app.route('/contribute', methods=['POST'])
def contribute():
try:
data = request.stream.read()
result = eval(zlib.decompress(data))
db.result.insert(result)
except:
print sys.exc_info()
pass
return 'OK'
mongodb的结果:
{
"_id" : ObjectId("534e0d346a1b7a0e48ff9076"),
"myoutput" : "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" ... /html>",
"myinput" : "http://www.exmaple.com/001"
}
(注意:正如你所注意到的,mongo的最终版本以某种方式通过在他们面前放一个斜线来逃脱所有明智的角色,就像双引号一样,不知道如何更改它。)
有一些关于在烧瓶中检索二进制数据的讨论。像here一样。
因此,如果您从request.stream directly
读取,则不必弄乱标题。
谢谢!