Python通过HTTP发送数据
我有一个用Python的Flask框架搭建的API服务器。我需要一组客户端/电脑通过发送HTTP POST请求,把数据发送到这个API服务器上。
这里的数据实际上是HTML内容。 (注意:我并不是把合法的数据转换成HTML或XML格式,这些数据本身就是我从网上收集来的HTML)每个页面的大小通常大约是200KB。我想尽量减轻网络负担,所以我在考虑使用序列化/反序列化和压缩技术。
我在想,是否可以不直接发送原始的HTML,而是先把HTML对象(比如用BeautifulSoup处理过的内容)进行序列化,然后在服务器端进行反序列化。或者先用某种压缩方法把文件压缩,然后再把数据发送到API服务器。在服务器端收到压缩的数据后,可以进行解压。
我做过的尝试:
(1) 我试着把原始的HTML文本转换成一个soup对象,然后用Pickle进行序列化。但是它告诉我递归次数太多,出错了。我还尝试过直接对原始HTML进行Pickle处理,但压缩效果很差,几乎和原始HTML字符串的大小一样。
(2) 我尝试用zlib先压缩文件,结果压缩后只有原来的10%大小。但是,这样的方法算不算是解决这个问题的正确方式呢?
有什么想法吗?
1 个回答
我从你们的评论中得到了很多启发,想出了一个解决方案:用 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"
}
(注意:正如你们所看到的,mongodb 中的最终版本似乎把所有敏感字符前面加了个斜杠,比如双引号,我不太确定怎么把它改回来。)
关于在 Flask 中获取二进制数据,有一些讨论。比如 这里。所以如果你直接从 request.stream
读取,就不需要去处理头信息了。
谢谢!