Python模拟浏览器登陆网站

网站登陆的步骤:

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为例:


[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',  
  2.         'Accept-Encoding':'gzip,deflate,sdch',  
  3.         'Accept-Language':'en,zh-CN;q=0.8,zh;q=0.6',  
  4.         'Cache-Control':'max-age=0',  
  5.         'Connection':'keep-alive',  
  6.         'Content-Type':'application/x-www-form-urlencoded',  
  7.         'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'  
  8.     } #构建请求文件头,这里模仿了Chrome 34.0.1847.131 浏览器  
  9.   
  10. def login(username, password):  
  11.     #登陆界面RUL  
  12.       
  13.     url = 'yourURL'  
  14.       
  15.     #构造登陆post表单  
  16.     postData = 'yourPostData'  
  17.     #记录cookies并下载到本地  
  18.     cj = cookielib.CookieJar()  
  19.     opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))  
  20.     urllib2.install_opener(opener)  
  21.       
  22.     #下载登陆界面cookies  
  23.     testReq = Request(url, headers = headers)  
  24.     urlopen(testReq)  
  25.   
  26.     #提交表单,登陆  
  27.     req = Request(url, postData, headers)  
  28.     res = urlopen(req)  
  29.   
  30.     return opener  

我们登录后,之后只要向服务器传送包含有url,postData和Headers的请求即可


[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. mainPageURL = 'url'  
  2.     req = Request(mainPageURL, headers = headers)  
  3.     res = urlopen(req)  
  4.     print res.read()  

注: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,导致登陆错误。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值