我在想,如果我使用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?
问题:
答案 0 :(得分:5)
现在大多数网站不使用HTTP身份验证。因此,如果您无法登录,则不会返回401;相反,返回正常的200成功响应,并且网页中的文本 表示您没有登录。
相反,网站使用cookies。这意味着您的浏览器实际上并不知道它登录的网站;当你最终为Yahoo!提供一个成功的密码时,它要么改变它存储在浏览器上的cookie,要么甚至可以保持cookie相同,只是改变与cookie相关的数据库记录。
因此,在登录过程中,HTTP状态代码通常是无用的。相反,您必须抓取“200 Success”页面的文本,以回顾它是否祝贺您登录或重复表单;或者,您可以只检查您获取的页面的URL,并查看它是否是再次登录表单,或者它是否是您想要访问的目的地。
答案 1 :(得分:0)
身份验证失败并不意味着您不允许查看身份验证背后的页面。这意味着您将看不到将您的凭据考虑在内的此页面的版本。如果您在主页上但未通过身份验证,则仍可以看到主页。
搜索引擎似乎没有索引401页面,因此可能有点难以找到...
答案 2 :(得分:0)
看起来雅虎只是在代码中处理密码验证。尝试在代码中添加以下两行:
f = open('a.html', 'w')
f.write(r.read())
当您阅读该页面时,您将再次看到同一页面。
看起来他们只是有一些javascript告诉你密码错误。