【问题标题】:Using python to fill out an online form; standard implementation does not work使用python填写在线表格;标准实施不起作用
【发布时间】:2013-06-19 23:31:02
【问题描述】:

我正在使用 Python 2.7.5 尝试登录网站。我需要登录该站点,然后导航到其他几个页面以从中提取表格。不过,就目前而言,我的问题在于简单地登录到该站点。登录页面如下所示:

<form action="/session" class="text" method="post"><div style="margin:0;padding:0;display:inline"><input name="authenticity_token" type="hidden" value="xeSbOkcWd444xhHyLj82wLS62qfH72De+7lwIhWFRd4=" /></div>    <p>
    <label for="login">Username</label><br />
    <input id="login" name="login" type="text" /><br />
    <label for="password">Password</label><br/>
    <input id="password" name="password" type="password" />
    <a href="/forgot_password">(Forgotten your password?)</a>
</p>

<p>
    <input id="remember_me" name="remember_me" type="checkbox" value="1" />
    <label class="shiftedlabel" for="remember_me">Remember me</label>
</p>

<p>
    <br /><input name="commit" type="submit" value="Log in" />
</p>
</form>

我一直在使用 cookiejar、urllib 和 urllib2,下面的代码是我从this previous question 得到的,我在下面稍作修改:

import urllib, urllib2, cookielib

username = 'namehere'
password = 'passwordhere'

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
login_data = urllib.urlencode({'Username' : username, 'password' : password, 'Remember_me' : "1", 'commit' : 'Log in'})
opener.open('http://example.org/login.php', login_data)
resp = opener.open('http://example.org/password_protected_page')
print resp.read()

我在原来的“登录数据”中添加了两个字段,记住我并提交。

当我运行这段代码时,我得到了密码页面的打印输出,但它有错误,我必须登录才能看到这个页面,并且看不到我需要的表格。请注意,网站上此页面不存在 .php 扩展名,但我不知道这有多大不同。

在相关说明中,我为这类事情找到的另一个最常见的解决方案是使用 mechanize 模块。然而,我无法安装它用来自行安装的“简易安装程序”工具,而且由于我对此很陌生,我无法诊断出问题。不过,这是一个单独的问题。

感谢您的帮助:)

【问题讨论】:

  • 你应该认真地考虑到mechanize来处理这类事情。
  • 抱歉,我意识到我忘了提到我看过 mechanize,但无法安装它,因为我一开始就无法让安装程序工作。
  • 你的 urlencode 中的“Remember me”不应该是“remember_me”吗?
  • 不幸的是,这并没有解决问题。将其编辑为原始版本。

标签: python forms http login


【解决方案1】:

我建议查看程序Charles。它非常适合查找发送到服务器的数据,之后使用 urllib 模拟相同的请求通常非常简单。

在您的情况下,您似乎没有将authentity_token 的值添加到您的POST,名称“Remember me”实际上是“remember_me”,名称“Username”实际上是“login”。

【讨论】:

  • 不幸的是,更改为“login”和“remember_me”不起作用。我会检查那个程序,看看它是否能解决这个问题。
  • 您仍然需要添加authentity_token。 :)
  • 啊,对不起,我错过了。我也不知道这个键实际上是什么,在我的浏览器中刷新源代码后,我发现它在每次刷新时都会发生变化。如何将其添加到代码中?
  • 你需要从网页上抓取它。考虑使用正则表达式。
猜你喜欢
  • 2011-09-15
  • 2018-11-11
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多