如何使用Python访问密码保护的网站?
我在想,如果我用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?
问题:
- 为什么我没有提供认证信息却没有得到401错误?
- 如果我的邮箱不行,还有其他网站能给我401错误吗?
3 个回答
0
看起来Yahoo在他们的代码中处理了密码验证。你可以试着在你的代码里加上以下两行:
f = open('a.html', 'w')
f.write(r.read())
当你读取这个页面时,你会看到同样的页面再次出现。
他们似乎只是用了一点JavaScript来告诉你密码输入错误。
0
“认证失败”并不意味着你不能看到需要认证的页面。它的意思是你无法看到这个页面的个性化版本,也就是没有用你的账号信息来显示的版本。如果你在一个主页上,认证失败了,你还是可以看到这个主页的。
搜索引擎似乎不会把401页面(认证失败的页面)收录进去,所以想找到这些页面可能会有点困难……
5
现在大多数网站都不使用HTTP认证。所以如果你登录失败,网站不会返回401错误,而是会返回一个正常的200成功响应,网页上会显示你没有登录的信息。
相反,网站使用的是cookies。这意味着你的浏览器其实并不知道你登录了哪些网站;当你最终在Yahoo!上输入正确的密码时,它要么会改变存储在你浏览器里的cookie,要么可能保持这个cookie不变,但在他们的数据库中更新与这个cookie相关的信息。
所以在登录的过程中,HTTP状态码通常没什么用。你需要查看返回的“200成功”页面的内容,看看上面是否祝贺你登录成功,或者是否又显示了登录表单;或者,你也可以检查一下返回的页面的URL,看看是不是又回到了登录表单,还是说你已经到了你想去的页面。