如何使用Python访问密码保护的网站?

2 投票
3 回答
1857 浏览
提问于 2025-04-17 03:31

我在想,如果我用Python的方式去访问一个需要密码的网站,应该会遇到401未授权的错误,这说明需要提供认证信息。

所以在我的脚本里,我试着访问我的雅虎邮箱,显然是需要用户名和密码的,我以为会得到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. 为什么我没有提供认证信息却没有得到401错误?
  2. 如果我的邮箱不行,还有其他网站能给我401错误吗?

3 个回答

0

看起来Yahoo在他们的代码中处理了密码验证。你可以试着在你的代码里加上以下两行:

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

当你读取这个页面时,你会看到同样的页面再次出现。

他们似乎只是用了一点JavaScript来告诉你密码输入错误。

0
  1. “认证失败”并不意味着你不能看到需要认证的页面。它的意思是你无法看到这个页面的个性化版本,也就是没有用你的账号信息来显示的版本。如果你在一个主页上,认证失败了,你还是可以看到这个主页的。

  2. 搜索引擎似乎不会把401页面(认证失败的页面)收录进去,所以想找到这些页面可能会有点困难……

5

现在大多数网站都不使用HTTP认证。所以如果你登录失败,网站不会返回401错误,而是会返回一个正常的200成功响应,网页上会显示你没有登录的信息。

相反,网站使用的是cookies。这意味着你的浏览器其实并不知道你登录了哪些网站;当你最终在Yahoo!上输入正确的密码时,它要么会改变存储在你浏览器里的cookie,要么可能保持这个cookie不变,但在他们的数据库中更新与这个cookie相关的信息。

所以在登录的过程中,HTTP状态码通常没什么用。你需要查看返回的“200成功”页面的内容,看看上面是否祝贺你登录成功,或者是否又显示了登录表单;或者,你也可以检查一下返回的页面的URL,看看是不是又回到了登录表单,还是说你已经到了你想去的页面。

撰写回答