首先仍是看那兩張圖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
好,能夠看到輸出的這個網址就應該是咱們驗證碼圖片的網址,爲了保險起見,咱們仍是打開這個網址確認一下