用Python中的请求库发送POST数据

用Python中的请求库发送POST数据,python,html,post,beautifulsoup,python-requests,Python,Html,Post,Beautifulsoup,Python Requests,我无法使用Python中的请求库发送POST数据以访问我的帐户。由此产生的soup与未发送帖子的情况相同。这是我在其他网站上使用和使用的代码: def get_data(final_url): payload = {'session[email]':'myemail@myemail.com','session[password]':'mypwd','session[remember_me]':'0','commit':'Sign in'} with requests.sessio

我无法使用Python中的请求库发送POST数据以访问我的帐户。由此产生的
soup
与未发送帖子的情况相同。这是我在其他网站上使用和使用的代码:

def get_data(final_url):
    payload = {'session[email]':'myemail@myemail.com','session[password]':'mypwd','session[remember_me]':'0','commit':'Sign in'}
    with requests.session() as ses:
        log_soup = BeautifulSoup(ses.get('https://www.login-page.com/login').text)
        payload['utf8'] = log_soup.findAll('input',attrs={'name':'utf8'})[0].get('value')
        payload['authenticity_token'] = log_soup.findAll('input',attrs={'name':'authenticity_token'})[0].get('value')
        ses.post('https://www.login-page.com/login',data=payload)
        req = ses.get(final_url)

        soup = BeautifulSoup(req.text)

    return soup


<form accept-charset="UTF-8" action="/sign_in" class="main_form" id="new_session" method="post" novalidate="novalidate"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;"/><input name="authenticity_token" type="hidden" value="l5+2s90FtEUsS3GHlr2tAktcxSW8jqgXx3mXEwIlAzE="/></div><div class="error_message">
</div>
<dl>
<dt><label for="session_email">Email</label></dt>
<dd>
<div class="input_border"><input autofocus="autofocus" class="text required email" id="session_email" name="session[email]" placeholder="Email" size="30" type="email"/></div>
</dd>
</dl>
<dl>
<dt><label for="session_password">Password</label></dt>
<dd>
<div class="input_border"><input class="text required" id="session_password" name="session[password]" placeholder="Password" size="30" type="password"/></div>
</dd>
</dl>
<div class="checkbox_field"><input name="session[remember_me]" type="hidden" value="0"/><input id="session_remember_me" name="session[remember_me]" type="checkbox" value="1"/><label for="session_remember_me">Remember me</label></div>
<table class="buttons">
<tr>
<td><input class="button public" data-disable-with="Please wait..." name="commit" type="submit" value="Sign in"/></td>
<td class="forgot_password"><a href="/passwords/new">Forgot your password?</a></td>
</tr>
</table>
</form>

非常感谢你的帮助

您使用的是什么版本的请求?如果介于0.14.x和1.2.0之间,则必须升级到1.2.0。会话上的Cookie无法在重定向上正确设置,1.2.0修复了此问题

另一个问题是,您可能应该检查来自
ses.post(url,data=payload)
的响应。您应该明确地检查您是否收到了正确的状态代码(在本例中,因为您希望重定向)以及301或302的代码

假设上述所有检查均已完成,则您的网站可能正在进行一些时髦的
用户代理分析,您可能还希望使用浏览器用户代理字符串来检查,例如

ses.headers['User-Agent'] = '...'
response = ses.post(url, data=payload)
final_response = ses.get(final_url)

您的登录页面需要JSON编码的数据还是表单编码的数据?这可能是因为它无法解析您发布的数据吗?是的,我想是的,但是,我添加了
json.dumps(payload)
作为我的数据发送,但表单仍然没有提交。手动日志中的发布数据——您从哪里获得的?你有没有可能用wireshark运行相同的请求?看起来您正在正确地调用
请求
,因此最好确定它是否在客户端或服务器端。我通过使用Chrome developer工具记录POST请求后的响应来获得它。结果输出与未发送POST时相同。您希望wireshark提供什么样的输出?我只是好奇地想知道,来自
requests
的HTTP请求确实是一个带有数据的
POST
。如果我们确信这一点,那么我们就知道是服务器。我会尝试用curl+1复制一个成功的登录,让我意识到我的版本已经过时,并为我的未来省去了很多悲伤。而且我按照你的建议传递了标题,没有明显的效果。我收到的状态码是200,而不是301或302,因此我假设我没有像应该的那样传递POST数据。@Matt然后检查响应的历史记录以获得重定向。此外,您还可以执行以下操作:
ses.post(url,data=payload,allow_redirects=False)
这将为您提供重定向响应,并告诉您应该重定向到哪里。如果服务器确定您正在抓取站点,它还可以防止您的cookie过期。感谢您为我设置了正确的路径!你帮了大忙!
ses.headers['User-Agent'] = '...'
response = ses.post(url, data=payload)
final_response = ses.get(final_url)