如何在Python mechanize中POST文件,但不使用表单?
我想知道怎么用Python的mechanize库发送一个包含文件的POST请求,但不想依赖任何现有的表单。我只是想随便发送一个文件。虽然在StackOverflow上有一些关于文件上传的例子,但它们都是关于在表单中附加文件的。
我只需要生成一个POST请求,里面的头信息像这样:
Content-Length: 218853
Content-Type: application/octet-stream
Cookie: some-cookie-data
然后在POST的数据部分只包含磁盘上某个文件的内容。
浏览器会话中的Cookies需要保留,我还需要读取和处理响应,响应内容会是一些Content-Type text/plain;
格式的JSON数据。
2 个回答
0
正好我有一些用 mechanize 写的代码可以用来做这个。
# Mechanize
from mechanize import Browser, urlopen, Request
# Submit it!
image_file = open(image_filename)
image_data = image_file.read()
request = Request(url, image_data, {'Content-Type': 'application/octet-stream'})
response = urlopen(request)
顺便说一下,哈哈,我意识到我很久之前就写过关于这个的博客:
http://theremichaelwilson.wordpress.com/2011/03/26/posting-a-file-with-mechanize-and-python/
2
编辑:
你说你在找一个 mechanize 的例子。我不是 mechanize 的用户,但它支持整个 urllib2 的 API。所以这个 StackOverflow 的回答可能会对你有帮助:通过 Python 脚本使用 POST 发送文件
当你创建一个 POST 请求时,其实就是在进行一次 HTTP 交易,具体是这样的:
POST /path/to/script HTTP/1.0
User-Agent: UserAgent/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
hello=world
所以你总是以“表单”的形式发送数据,因为 POST 请求就是通过这种方式接收数据的。
所以,你需要弄清楚你要发送的脚本是如何期望接收数据的(表单的 name
属性通常是进行键值对配对时需要的关键),然后就可以创建你的 POST 请求了。
确保你使用了正确的编码(多部分 MIME),并且计算了正确的 Content-Length 来放在请求头里。