首先仍是看那两张图html
访问的网址python
点击访问后出现的网址
api
咱们看到,先后两个网址已经发生了变化,并且第二个还显示出了一些错误的信息,这是为何呢?浏览器
首先是网页的跳转,或者说,重定向,在咱们访问浏览器的过程当中,网页重定向是很常见的,咱们来看看百度百科上的解释服务器
网域名称转址(英语:URL redirection,或称网址重定向或URL重定向),是指当用户浏览某个网址时,将他导向到另外一个网址的技术。经常使用在把一串很长的网站网址,转成较短的网址。由于当要传播某网站的网址时,经常由于网址太长,很差记忆;又有可能由于换了网络的免费网页空间,网址又必需要变动,不知情的用户可能会认为网站关闭了。这时就能够用网络上的转址服务了。这个技术使一个网页是可借由不一样的统一资源定位符(URL)连接。
网络
这是维基百科的解释,其实咱们只须要知道重定向就是把你想要访问的某一个网址转接到另一个网址上的一种技术,因此很显然,咱们这里是遇到了重定向,这就意味着,咱们前面写入的网址是不对的,那是post数据的网址,并非登录界面的网址,因此咱们不能从源码中得到咱们想要的数据,咱们仍是须要找到登录界面的网址,这又怎么找呢?post
因而我又跑去凤凰网的首页登录看看能不能找的到登录界面的网址,可是我发现它是弹出式的窗口,咱们是看不到它的网址的,这该怎么办呢?网站
"loginsuccess?&c=0&m=验证码错误" 这是上面的第二张图片网址的一部分,它引发了个人注意,这个"?" 和 "&" 不就是前面咱们说的url查询字符串吗?反正如今也没事可作,咱们把它删除试试看url
好了,这就是咱们的登录界面,那这个凤凰网的登录流程是怎样的呢?为了便与分析咱们来看看登录界面的源码code
我框出了两个框,第一个框的内容是
<form id="login_form" name="login_form" action="https://id.ifeng.com/api/sitelogin" method="POST" target="LoginFrame">
这里有个网址,还有一个 method="POST",结合咱们前面经过httpfox抓包的结果咱们不难发现这个网址是post数据的网址,那么理所固然,第二个框框里面的<img src......就是验证码图片的网址
那么,整个流程就很简单了,首先说明两个网址
http://id.ifeng.com/allsite/login 这是登录界面的网址,用来显示输入界面和接受登录结果的信息
https://id.ifeng.com/api/sitelogin 这是post数据的网址,js脚本,用来向服务器发送数据
登录界面的网址用来显示一个窗口,并接受用户的输入,当用户点击"登录"按钮以后,网页跳转到post数据的网址,并向服务器提交数据,服务器将数据比对以后,并将结果返回到给登录界面,由登录界面显示登录成功或者不成功
好了,整个流程大概明白了,登录界面的网址也找到了,咱们把前面的源码修改看看输出结果是什么吧
#!/usr/bin/env python # -*- coding:UTF-8 -*- __author__ = "217小月月坑" ''' 获取源码并获取验证码的数据 ''' import urllib2 import re # 新的登录界面网址 login_url = 'http://id.ifeng.com/allsite/login' headers = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0',} pattern = re.compile(r'<img src="(.*?)".*?',re.S) request = urllib2.Request(login_url,headers=headers) response = urllib2.urlopen(request) contents = response.read() items = re.findall(pattern,contents) for item in items: print item
好,能够看到输出的这个网址就应该是咱们验证码图片的网址,为了保险起见,咱们仍是打开这个网址确认一下