關於瀏覽器
瀏覽器的主要功能就是向服務器發出請求,在瀏覽器窗口中展示想要訪問的網絡資源。這里資源一般是指 HTML 文檔,圖片等其他的類型。資源的位置由用戶使用 URL(統一資源標示符)指定。
而瀏覽器的核心——渲染引擎便是負責顯示請求的內容。如果請求的內容是 HTML,它就負責解析 HTML 和 CSS 內容,並將解析后的內容顯示在屏幕上。
工作流程:
1. 輸入URL地址或者點擊URL的一個鏈接
2. 瀏覽器根據URL地址,結合DNS,解析出URL對應的IP地址
1)瀏覽器通過發送一個TCP的包,要求服務器打開連接
2)服務器也通過發送一個包來應答客戶端的瀏覽器,告訴瀏覽器可以發送數據給服務器
3)發送HTTP請求
4. 服務器接到請求后,返回相應的響應內容
5. 瀏覽器解析從服務器端返回的響應內容,並且把頁面顯現出來
當輸入URL之后,瀏覽器就要知道這個URL對應的IP是什么,只有知道了IP地址,瀏覽器才能准備的把請求發送到指定的服務器的具體IP和端口號上面。然后服務器端把響應結果發送到客戶端。這個響應結果就是html的文檔,不包含什么圖片,腳本,CSS等的,也就是頁面的html結構。下一步就是瀏覽器解析頁面的過程,也就是一步步從上到下的解析html的骨架了。如果此時在html文檔中,遇到了img標簽,那么瀏覽器就會發送HTTP請求到這個img響應的URL地址去獲取圖片,然后呈現出來。
關於http協議
在Web應用中,服務器把網頁的HTML代碼發送給瀏覽器,讓瀏覽器顯示出來。這個由請求和響應構成的便是一個標准的客戶端服務器模型,其中的傳輸協議便是HTTP。
http協議特點:1)傳輸明文內容,安全性比較差
2 ) 無狀態協議(同一個客戶端的這次請求同上次請求沒有對應關系)
常見的請求頭如下:
1 Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 2 Accept-Encoding gzip, deflate 3 Accept-Language zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 4 Connection keep-alive 5 Cookie Hm_lvt_dd4738b5fb302cb062ef19107df5d2e4=1481881726,1482225141; Hm_lpvt_dd4738b5fb302cb062ef19107df5d2e4=1483061342 6 Host offlintab.firefoxchina.cn 7 Referer http://offlintab.firefoxchina.cn/?cachebust=20150714 #指明該請求是從哪個關聯連接而來 8 User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
常見的響應頭如下:
1 Age 865 2 Cache-Control max-age=900 3 Content-Encoding gzip 4 Content-Length 2163 5 Content-Type application/json 6 Date Fri, 30 Dec 2016 01:23:46 GMT 7 Etag "584f7c52-1609" #服務端返回的響應數據的標識字段,客戶端可根據此字段的值向服務器發送某URL是否更新的信息 8 Expires Fri, 30 Dec 2016 01:28:26 GMT 9 Last-Modified Tue, 13 Dec 2016 04:42:58 GMT 10 Server nginx 11 X-Cache HIT from SK-SQUIDWEB-18 #x-cache項指瀏覽器從何處、是在哪個代理緩存載入的網頁文件 12 X-Cache-Lookup HIT from SK-SQUIDWEB-18:8080 #x-cache-lookup項指專門查看代理服務器中是否有某個網頁緩存。有就返回HIT,沒有返回MISS 13 X-Via 1.1 yangdxin66:10 (Cdn Cache Server V2.0)
Cookie和Session機制
Cookie和Session都為了用來保存狀態信息,都是保存客戶端狀態的機制,它們都是為了解決HTTP無狀態的問題而所做的努力。
Session可以用Cookie來實現,也可以用URL回寫的機制來實現。用Cookie來實現的Session可以認為是對Cookie更高級的應用。
Cookie和Session有以下明顯的不同點:
1)Cookie將狀態保存在客戶端,Session將狀態保存在服務器端;
2)Cookies是服務器在本地機器上存儲的小段文本並隨每一個請求發送至同一個服務器。網絡服務器用HTTP頭向客戶端發送cookies,在客戶終端,瀏覽器解析這些cookies並將它們保存為一個本地文件,它會自動將同一服務器的任何請求縛上這些cookies。Session並沒有在HTTP的協議中定義;
3)Session是針對每一個用戶的,變量的值保存在服務器上,用一個sessionID來區分是哪個用戶session變量,這個值是通過用戶的瀏覽器在訪問的時候返回給服務器,當客戶禁用cookie時,這個值也可能設置為由get來返回給服務器;
4)就安全性來說:當你訪問一個使用session 的站點,同時在自己機子上建立一個cookie,建議在服務器端的SESSION機制更安全些.因為它不會任意讀取客戶存儲的信息。
1 import urllib 2 import urllib2 3 import cookielib 4 5 filename = 'cookie.txt' 6 #聲明一個MozillaCookieJar對象實例來保存cookie,之后寫入文件 7 cookie = cookielib.MozillaCookieJar(filename) 8 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) 9 postdata = urllib.urlencode({ 10 'email': 'example@webscraping.com', 11 'password': 'example', 12 }) 13 14 loginUrl = 'http://example.webscraping.com/user/login' 15 response = opener.open(loginUrl,postdata) 16 #保存cookie到cookie.txt中 17 cookie.save(ignore_discard=True, ignore_expires=True)
1 import re 2 import requests 3 4 def login(): 5 url = 'http://example.webscraping.com/user/login' # 登陸地址 6 s = requests.Session() # 創建一個session,帶着 session 去獲取 key(表單隱藏值) 7 #print s
8 try: 9 get_res = s.get(url).text 10 get_key = re.findall(r'<input name="_formkey" type="hidden" value="(.*?)" />',get_res,re.S) # 正則匹配 key 的值 11 #print get_key[0] # 打印key值 12 data = { 13 'email': 'example@webscraping.com', 14 'password': 'example', 15 '_next': '/view/Aland-Islands-2', 16 '_formkey': get_key[0], 17 '_formname': 'login' 18 } 19 # 構造表單需要提交的數據 20 res_login = s.post(url, data=data).text # 嘗試登陸 21 info = re.findall(r'<a class="dropdown-toggle" data-toggle="dropdown" href="#" rel="nofollow">(.*?)</a>', 22 res_login, re.S) 23 24 print u'登陸成功!','Hi', info[0] 25 ## End ## 26 except: 27 print u'登陸失敗' 28 exit(0) 29 30 if __name__ == '__main__': 31 login()
運行結果:
登陸成功! Hi Welcome Test Account