网站登陆的步骤:
1. 用户在网站登陆界面输入用户名密码;
2. 浏览器将含有用户名、密码等登陆信息的表单以Post的方式传给服务器;
3. 服务器进行用户名密码验证,若登陆成功,则返回登陆成功的跳转界面,并包含有用户登陆信息的,已经加密过的Cookies;
3a. 若用户名密码验证失败,则跳转重新登陆界面;
4. 浏览器将这段服务器返回的Cookies储存在本地,之后每当访问这个网站的新的页面,浏览器递交浏览请求时(HTTPRequest)都会将这段Cookies一并包含在请求文件头中(Headers)传给服务器,以表明自己的身份。
综上,网站登陆的关键是:获取服务器返回的用于身份验证的Cookies。
题外话:有时,我们不登陆某个网站,企图以直接在浏览器输入网站内部页面地址的方式绕过登陆,但这样的方式往往并不能成功。因为若直接在浏览器中输入地址,浏览器递交访问请求时并没有附上一段用于服务器验证的Cookies。
例如,如果读者直接访问我现在写本文时所用的地址:http://write.blog.csdn.net/postedit ,会有两种情况:
1. 跳转到CSDN的登陆界面---你并未登陆,浏览器中并未储存你访问本站的用于身份验证的Cookies;
2. 跳转到你个人的文章发表界面(而不是我这篇文章的发表界面)---你已登陆,浏览器中储存的是你自己的Cookies,所以服务器返回的是你自己的文章编辑界面。
以上描述可能过于艰涩,我们举个例子:
这是我访问http://write.blog.csdn.net/postedit 也就是发表新文章时浏览器所递交的请求。(由Chrome-审查元素截图)
从中可以看出,该网站的IP地址(117.79.157.201:80) ,请求的网址,请求方法,返回的状态码;
请求头中可看出Cookie,包含了我账号的各种信息,UserName,UserInfo等等。
好了回归正题,上文说到,我们模拟浏览器访问网站并登陆的关键是模拟浏览器向服务器提交表单,并将服务器返回的Cookies保存下来,之后每次访问页面时都把这段Cookies附在请求中。(注:Cookies是包含在Headers中的)
原理理解了,用什么语言实现就并不重要。我们以Python为例:
我们登录后,之后只要向服务器传送包含有url,postData和Headers的请求即可
注:1. write.blog.csdn.net 的IP地址:117.79.157.201:80 可能并不能直接访问,甚至是CSDN主站的IP地址 117.79.157.225:80 也拒绝浏览器直接用IP地址访问。原应可能是多样的,例如同一个IP下有多个网站,直接输入IP的话服务器不知道你要访问哪个网站;域名解析的网页在服务器上的地址可能并没有位于网站IP地址的根目录下;网站为了防止恶意解析而禁止IP地址直接访问(参考 http://blog.csdn.net/dongdongzzcs/article/details/6328148)等等。
2. 登陆的URL及构造的Headers可以用Chrome--审查元素--Network中找到,注意:审查元素中Headers中时包含有Cookies这条信息的,写代码时务必把这条信息删去,否则这条Cookies会覆盖Python访问网站时下载到的Cookies,导致登陆错误。