【问题标题】:How to make a Python HTTP Request with POST data and Cookie?如何使用 POST 数据和 Cookie 发出 Python HTTP 请求?
【发布时间】:2012-02-25 15:48:09
【问题描述】:

我正在尝试在 Python 中使用 cookie 进行 HTTP POST。

我有 URL、POST 数据和 cookie 的值。

import urllib2
url="http://localhost/testing/posting.php"
data="subject=Alice-subject&addbbcode18=%23444444&addbbcode20=0&helpbox=Close+all+open+bbCode+tags&message=alice-body&poll_title=&add_poll_option_text=&poll_length=&mode=newtopic&sid=5b2e663a3d724cc873053e7ca0f59bd0&f=1&post=Submit"
cookie = "phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%223%22%3B%7D; phpbb2mysql_t=a%3A9%3A%7Bi%3A3%3Bi%3A1330156986%3Bi%3A1%3Bi%3A1330160737%3Bi%3A5%3Bi%3A1330161702%3Bi%3A6%3Bi%3A1330179284%3Bi%3A2%3Bi%3A1330160743%3Bi%3A7%3Bi%3A1330163187%3Bi%3A8%3Bi%3A1330164442%3Bi%3A9%3Bi%3A1330164739%3Bi%3A10%3Bi%3A1330176335%3B%7D; phpbb2mysql_sid=5b2e663a3d724cc873053e7ca0f59bd0"
#creating HTTP Req
req = urllib2.Request(url,data,cookie)

f = urllib2.urlopen(req)
print f.read()

但是,如果我尝试运行该程序,则会引发错误:

Traceback (most recent call last):
  File "task-4.py", line 7, in <module>
    req = urllib2.Request(url,data,cookie)
  File "/usr/lib/python2.6/urllib2.py", line 197, in __init__
    for key, value in headers.items():
AttributeError: 'str' object has no attribute 'items'

我有两个问题: 1. 我的 HTTP POST 请求是否正确? (我已经能够在 Java 中正确地执行相同的事情,并获得了 HTTP 200 并成功发布到 phpBB,但是,我是 Python 新手) 2. 谁能给我看一个使用 POST 数据和 cookie 处理 HTTP POST 的玩具示例吗?

提前致谢,

罗伊

【问题讨论】:

    标签: python cookies http-post urllib2


    【解决方案1】:

    您可以尝试 requests,这让处理 HTTP 查询的工作更轻松。

    import requests
    url="http://localhost/testing/posting.php"
    data= {
        'subject': 'Alice-subject',
        'addbbcode18': '%23444444',
        'addbbcode20': '0',
        'helpbox': 'Close all open bbCode tags',
        'message': 'alice-body',
        'poll_title': '',
        'add_poll_option_text': '',
        'poll_length': '',
        'mode': 'newtopic',
        'sid': '5b2e663a3d724cc873053e7ca0f59bd0',
        'f': '1',
        'post': 'Submit',
        }
     cookies = {'phpbb2mysql_data': 'a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%223%22%3B%7D',
        'phpbb2mysql_t': 'a%3A9%3A%7Bi%3A3%3Bi%3A1330156986%3Bi%3A1%3Bi%3A1330160737%3Bi%3A5%3Bi%3A1330161702%3Bi%3A6%3Bi%3A1330179284%3Bi%3A2%3Bi%3A1330160743%3Bi%3A7%3Bi%3A1330163187%3Bi%3A8%3Bi%3A1330164442%3Bi%3A9%3Bi%3A1330164739%3Bi%3A10%3Bi%3A1330176335%3B%7D', 
        'phpbb2mysql_sid': '5b2e663a3d724cc873053e7ca0f59bd0',
        }
    print requests.get(url, data=data, cookies=cookies).text
    

    http://python-requests.org/

    【讨论】:

    • hm,这里的东西似乎有点不对劲...问题是关于 POST 的,答案是 .get :) ....
    【解决方案2】:

    您传递的第三个参数是一个标题,应该是一个字典。应该这样做

    cookie = {"Cookie" : "phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%223%22%3B%7D; phpbb2mysql_t=a%3A9%3A%7Bi%3A3%3Bi%3A1330156986%3Bi%3A1%3Bi%3A1330160737%3Bi%3A5%3Bi%3A1330161702%3Bi%3A6%3Bi%3A1330179284%3Bi%3A2%3Bi%3A1330160743%3Bi%3A7%3Bi%3A1330163187%3Bi%3A8%3Bi%3A1330164442%3Bi%3A9%3Bi%3A1330164739%3Bi%3A10%3Bi%3A1330176335%3B%7D; phpbb2mysql_sid=5b2e663a3d724cc873053e7ca0f59bd0"}
    

    【讨论】:

      【解决方案3】:

      我喜欢 httplib:

      from urlparse import urlparse
      from httplib import HTTPConnection
      url = "http://localhost/testing/posting.php"
      data = "subject=Alice-subject&addbbcode18=%23444444&addbbcode20=0&helpbox=Close+all+open+bbCode+tags&message=alice-body&poll_title=&add_poll_option_text=&poll_length=&mode=newtopic&sid=5b2e663a3d724cc873053e7ca0f59bd0&f=1&post=Submit"
      cookie = "phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%223%22%3B%7D; phpbb2mysql_t=a%3A9%3A%7Bi%3A3%3Bi%3A1330156986%3Bi%3A1%3Bi%3A1330160737%3Bi%3A5%3Bi%3A1330161702%3Bi%3A6%3Bi%3A1330179284%3Bi%3A2%3Bi%3A1330160743%3Bi%3A7%3Bi%3A1330163187%3Bi%3A8%3Bi%3A1330164442%3Bi%3A9%3Bi%3A1330164739%3Bi%3A10%3Bi%3A1330176335%3B%7D; phpbb2mysql_sid=5b2e663a3d724cc873053e7ca0f59bd0"
      urlparts = urlparse(url)
      conn = HTTPConnection(urlparts.netloc, urlparts.port or 80)
      conn.request("POST", urlparts.path, data, {'Cookie': cookie})
      resp = conn.getresponse()
      body = resp.read()
      

      【讨论】:

        【解决方案4】:
        1. 并非如此。该错误是因为 urllib2 库正在尝试迭代您给它的 cookie 字符串的项目。尝试使用:
        cookies = urllib.urlencode({'phpbb2mysql_data':'foo', 'autologinid':'blahblah'})
        # Can do the same for data, allowing you to store it as a map.
        headers = {'Cookie': cookies}
        req = urllib2.Request(url, data, headers)
        
        1. 请参阅 python: urllib2 how to send cookie with urlopen request,但您最好的参考仍然是 urllib2 Request docs,但是与一些较新的库相比,它是一个棘手(但功能强大)的库。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-07
          • 2014-08-06
          • 2020-09-13
          • 2014-05-26
          相关资源
          最近更新 更多