【问题标题】:Submit multipart/form-data using mechanize python?使用 mechanize python 提交多部分/表单数据?
【发布时间】:2012-06-16 05:58:47
【问题描述】:

我正在尝试使用 mechanize 发出 multipart/form-data 的 POST 请求,这是我实际发帖时从 firefox live http 标头中看到的样子:

http://example.com/new/example

POST /new/example HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://example.com/new/example
Cookie: tmgioct=c32MbAGn1sTuZrH8etPqVNU5; __qca=P0-495598852-1339139301054; __utma=189990958.911848588.1339139302.1339556345.1339561805.32; __utmz=189990958.1339139302.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); logged_in=1; tog_appearance_fieldset=fieldset_open; __utmc=189990958; pfu=42375294; pfp=h2YrFoaTr5LtrVys8PMmKNdyuoeA9FNLakxGzrJK; pfe=1371048319; __utmb=189990958.5.10.1339561805
Content-Type: multipart/form-data; boundary=---------------------------41184676334
Content-Length: 2947
-----------------------------41184676334
Content-Disposition: form-data; name="UPLOAD_IDENTIFIER"

0ad3af1c502c7cb59577b01720ee58ff014810c4
-----------------------------41184676334
Content-Disposition: form-data; name="post[state]"

2
-----------------------------41184676334
blahblahblahblah....

-----------------------------41184676334--

这是我的代码:

browser = mechanize.Browser()

url = "http://example.com/new/example"
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0', 
    'Referer': 'http://example.com/new/example',
    'Content-Type': 'multipart/form-data; boundary=---------------------------41184676334'
}

data = "-----------------------------41184676334\rContent-Disposition: form-data; name="UPLOAD_IDENTIFIER"\r\r0ad3af1c502c7cb59577b01720ee58ff014810c4\r-----------------------------41184676334\rContent-Disposition: form-data; name="post[state]"\r\r2\r-----------------------------41184676334\rblahblahblahblah....\r\r-----------------------------41184676334--\r"

req = urllib2.Request(url, data, header)

response = browser.open(req, timeout = 30)
response.close()

我不知道为什么它不起作用。有人知道吗?请帮帮我。

对了,和边界有关系吗?我在上面的代码中使用随机数。

【问题讨论】:

    标签: python post http-headers http-post mechanize


    【解决方案1】:

    来自MIME media types RFC 2046

    任何 MIME“文本”子类型的规范形式必须始终表示 换行符作为 CRLF 序列。

    您的代码仅使用回车符 ('\r');您还需要添加换行符 (\n)。

    【讨论】:

    • 我已将所有\r 替换为\r\n 仍然无法正常工作,还有其他可能的原因吗?
    • 定义“不工作”。你试图欺骗的网站不买它?可能该站点不仅在寻找 User-Agent 和 Referer 标头来确定您是否使用“真实浏览器”。
    • 是的,我想是的。它与边界数有关吗?我只是使用随机生成的数字。
    • 我对此表示怀疑。也许 Cookie 标头中的一些 cookie 也很重要?
    • 用标题部分尝试了几乎所有东西,但仍然无法找出它为什么不起作用。必须使用真正的浏览器才能完成这项工作。
    【解决方案2】:
    browser.form.enctype = "application/x-www-form-urlencoded"
    

    【讨论】:

      【解决方案3】:

      最终使用requests 模块完成任务。结果证明它更方便可靠。

      您可以查看此页面了解详情:POST a Multipart-Encoded File

      【讨论】:

        猜你喜欢
        • 2012-01-24
        • 1970-01-01
        • 2017-04-06
        • 1970-01-01
        • 2016-12-04
        • 2011-10-31
        • 1970-01-01
        • 2013-03-06
        • 1970-01-01
        相关资源
        最近更新 更多