Python通过HTTP发送数据

2 投票
1 回答
2774 浏览
提问于 2025-04-18 02:53

我有一个用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 个回答

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" 
}

(注意:正如你们所看到的,mongodb 中的最终版本似乎把所有敏感字符前面加了个斜杠,比如双引号,我不太确定怎么把它改回来。)

关于在 Flask 中获取二进制数据,有一些讨论。比如 这里。所以如果你直接从 request.stream 读取,就不需要去处理头信息了。

谢谢!

撰写回答