【问题标题】:POST with Python not working使用 Python POST 不起作用
【发布时间】:2016-06-03 09:01:01
【问题描述】:

我在 Internet 上阅读了很多帖子,但似乎没有一个适合我。 我有一个需要用户名和密码才能登录的网络表单。这是我迄今为止尝试过的代码中的一个 sn-p 代码

params = urllib.parse.urlencode({'login' : 'user', 'password' : 'pwd'})
f = urllib.request.urlopen("https://example.com/login.php?%s" % params)
print(f.read().decode('utf-8'))

但是,它会返回登录页面源,而不是登录后出现的“用户面板”。如果我在浏览器的 url 栏中写 https:/example.com/login.php?login=user&password=pwd,它会登录。目标是获取登录后出现的页面源(“用户面板”)。 谁能帮帮我?

使用 Python 3.5

【问题讨论】:

  • 也许登录只是在登录后将您重定向到用户面板,或者您在请求中缺少一些标头
  • 您发出的是GET 请求,而不是POST
  • 帮自己一个忙并使用请求,docs.python-requests.org/en/master/user/quickstart
  • @PadraicCunningham 我一直在努力让它在 Windows 上工作 20 分钟,让我在 Unix 上试试
  • @LucaMozzo,你能分享一下网址吗?

标签: python post http-post python-3.5


【解决方案1】:

正确的用法是

f = urllib.request.urlopen("https://example.com/login.php", data=params)

来自urllib.request documentation

data 可以是指定要发送到服务器的附加数据的字符串,如果不需要此类数据,则可以是 None

请注意,这将发送 POST 请求而不是 GET。如果您必须发送GET 请求,您只需执行以下操作:

f = urllib.request.urlopen("https://example.com/login.php?user={0}&password={1}".format('user', 'pwd'))

【讨论】:

  • 不幸的是,我仍然通过这种方式返回登录页面(它要求我一个字节数组,所以我不得不写data=params.encode("utf-8")
  • @LucaMozzo 该站点可能需要GET 请求。第二种方法你试过了吗?
  • HTML 显示“method=post”,但我刚刚尝试过,还是没有!
  • @LucaMozzo 如果您使用 Selcuk 答案的最后一行,则应该与将其放在浏览器 url 栏中相同。你运行过那行代码吗?
【解决方案2】:

根据the documentation for urllib,您需要将关键字参数data(或第二个位置参数)传递给urlopen,而不是将它们添加到url:

import urllib
params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query", params)
print f.read()

【讨论】:

    猜你喜欢
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多