如何在Python mechanize中POST文件,但不使用表单?

0 投票
2 回答
1284 浏览
提问于 2025-04-17 07:45

我想知道怎么用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 来放在请求头里。

撰写回答