如何使用python访问受密码保护的站点?

时间:2011-10-02 10:35:43

标签: python authentication mechanize

我在想,如果我使用python的机制访问受密码保护的网站,我会收到401 Unauthorized错误,需要验证数据。

所以在我的脚本中,我试图访问我的雅虎邮箱,显然需要用户名和密码,我以为我会得到401,但我没有。

代码:

yahoo_mail = 'http://mail.cn.yahoo.com'
br = mechanize.Browser()
r = br.open(yahoo_mail)
print r.info()  #here, I got 200, it's ok apparently

br.select_form(nr=0)  #select the login form
r = br.submit()  #submit the form without providing username and password
print r.info()  #but I didn't get 401, why?

问题:

  1. 为什么我没有提供auth-info就得不到401?
  2. 如果不是我的邮箱,任何其他网站都可以给我一个401?

3 个答案:

答案 0 :(得分:5)

现在大多数网站使用HTTP身份验证。因此,如果您无法登录,则不会返回401;相反,返回正常的200成功响应,并且网页中的文本 表示您没有登录。

相反,网站使用cookies。这意味着您的浏览器实际上并不知道它登录的网站;当你最终为Yahoo!提供一个成功的密码时,它要么改变它存储在浏览器上的cookie,要么甚至可以保持cookie相同,只是改变与cookie相关的数据库记录。

因此,在登录过程中,HTTP状态代码通常是无用的。相反,您必须抓取“200 Success”页面的文本,以回顾它是否祝贺您登录或重复表单;或者,您可以只检查您获取的页面的URL,并查看它是否是再次登录表单,或者它是否是您想要访问的目的地。

答案 1 :(得分:0)

  1. 身份验证失败并不意味着您不允许查看身份验证背后的页面。这意味着您将看不到将您的凭据考虑在内的此页面的版本。如果您在主页上但未通过身份验证,则仍可以看到主页。

  2. 搜索引擎似乎没有索引401页面,因此可能有点难以找到...

答案 2 :(得分:0)

看起来雅虎只是在代码中处理密码验证。尝试在代码中添加以下两行:

f = open('a.html', 'w')
f.write(r.read())

当您阅读该页面时,您将再次看到同一页面。

看起来他们只是有一些javascript告诉你密码错误。