http协议网络编程
一、http協議簡介???????
????? 在進入http協議網絡編程之前,我們先來對HTTP協議進行簡單的介紹。
????? 早期的軟件基本上都是運行在大型機上,軟件的使用者則通過啞終端來控制使用計算機資源,在PC技術不斷普及后,軟件使用者所操作的軟件通常運行在PC機上,這種類型的軟件架構,稱為C/S架構。在后續隨著互聯網技術的興起,這種類型的軟件架構并不適用互聯的應用,因此一種新的軟件架構產生了,這就是當前比較流行的B/S架構。
????? 在web應用中,服務器把網頁數據傳給客戶端,實際上就是把HTML代碼傳給客戶端,在這個傳輸的過程中http協議作為傳輸控制協議。這是一個基于“請求、響應”模型的協議,即服務端收到客戶端的請求后便會給出相應的響應,即使這個響應是拒絕為客戶端提供服務。這話比較拗口,我們通過抓包方式來實際展示瀏覽器和服務器之間的數據交付,以用戶打開瀏覽器并在瀏覽器中輸入:http://www.baidu.com為例(下文是wireshark跟蹤TCP流時顯示打印信息):
?
------這部分表示客戶端向服務端發起請求: 客戶端希望能從服務端獲取到www.baidu.com的數據; ? ? ?
????GET /su?wd=www.baidu.com&action=opensearch&ie=UTF-8&from=ie8 HTTP/1.1
????Accept: */*
????Accept-Language: zh-CN
????User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; MALNJS)
????Accept-Encoding: gzip, deflate
????Host: suggestion.baidu.com
????DNT: 1
????Connection: Keep-Alive
????Cookie: BAIDUID=0D9B36937CB6DC69ABD369FAEDBDFC9E:FG=1; ????????????? BIDUPSID=CF04BDC232B7E45C5DBB5076EDFCB4B3; ????BDUSS=RNMUFEaHl1TDF5a0w4d0dwb0NEY21kNGQwWlVYQWRrMnVCMjVDcEFhZVBqMUJWQVFBQUFBJCQAAAAAAAAAAAEAAAB4g69GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8CKVWPAilVRj; BDRCVFR[Z5ezkSKcPHm]=9xWipS8B-FspA7EnHc1QhPEUf; ????????????H_PS_PSSID=13457_1467_13719_13075_10812_12867_13322_12691_13692_10562_12723_13761_13781_11?599_13610_13086_8498
?
------這部分表示服務端收到客戶端的請求后,給出了一個 200 ok的響應,當然可能還有其他的類型的響應,比如3xx表示重定向,4xx表示客戶端發送的請求有錯誤,5xx表示服務器端處理時發生了錯誤等等。
????HTTP/1.1 200 OK
????Date: Mon, 04 May 2015 13:20:13 GMT
????Server: suggestion.baidu.zbb.df
????Content-Length: 122
????Content-Type: text/javascript; charset=UTF-8
????Cache-Control: private
????Expires: Mon, 04 May 2015 14:20:13 GMT
????Content-Encoding: gzip
????Connection: Keep-Alive
???? 關于HTTP協議,還有太多的東西,要詳細了解這部分,可參考《HTTP權威指南》。
?
二、HTTP協議網絡編程
1)、從http服務器上下載數據
????? python中通過httplib庫,我們很容易的實現http客戶端模擬,以下面代碼為例:
import?httplib????????host?='www.baidu.com'httpclient?=?httplib.HTTPConnection(host,?80,?timeout=30)httpclient.request('GET',?'/')response?=?httpclient.getresponse()????? 這段代碼運行結果如下:
<!DOCTYPE html><!--STATUS OK-->
<html>
<head>
?<meta http-equiv="content-type" content="text/html;charset=utf-8">
?<meta http-equiv="X-UA-Compatible" content="IE=Edge">
?<link rel="dns-prefetch" href="//s1.bdstatic.com"/>
?<link rel="dns-prefetch" href="//t1.baidu.com"/>
?<link rel="dns-prefetch" href="//t2.baidu.com"/>
?<link rel="dns-prefetch" href="//t3.baidu.com"/>
?<link rel="dns-prefetch" href="//t10.baidu.com"/>
?<link rel="dns-prefetch" href="//t11.baidu.com"/>
?<link rel="dns-prefetch" href="//t12.baidu.com"/>
?<link rel="dns-prefetch" href="//b1.bdstatic.com"/>
?<title>百度一下,你就知道</title>
????? 從代碼上看,httplib模擬出來的客戶端和使用urllib、urllib2的模擬客戶端的代碼很相似,于是會有人產生不解,httplib和urllib、urllib2有啥區別,實質上,區別僅在于urllib2是urllib的增強版,提供了比urllib更強大的功能,urllib與urllib2相比httolib提供了更高層次的封裝,很多http本身的細節在urllib和urllib2庫中已經被屏蔽掉了。
2)、模擬瀏覽器
????? 先來看不模擬瀏覽器的python代碼運行效果,代碼:
import?urllibimport?urllib2url?=?'http://www.qiushibaike.com/hot/page/1'?#?headers?=?{'User-Agent':'Mozilla/5.0?(compatible;?MSIE?10.0;?Windows?NT?6.2;?WOW64;?Trident/6.0;?MALNJS)'}try:#?request?=?urllib2.Request(url)request?=?urllib2.Request(url)response?=?urllib2.urlopen(request)print?response.read()except?urllib2.URLError,?e:if?hasattr(e,"code"):print?e.codeif?hasattr(e,"reason"):print?e.reason???? 程序運行結果出錯,如下:
Traceback (most recent call last):
? File "D:/工作學習/程序設計/python程序設計/python web開發學習實錄/python模擬瀏覽器.py", line 10, in <module>
??? response = urllib2.urlopen(request)
? File "D:\應用軟件\軟件安裝\python\lib\urllib2.py", line 127, in urlopen
??? return _opener.open(url, data, timeout)
?
???? 使用代碼模擬流浪器訪問http服務器,代碼如下:
import?urllibimport?urllib2url?=?'http://www.qiushibaike.com/hot/page/1'?headers?=?{'User-Agent':'Mozilla/5.0?(compatible;?MSIE?10.0;?Windows?NT?6.2;?WOW64;?Trident/6.0;?MALNJS)'}try:request?=?urllib2.Request(url,headers?=?headers)response?=?urllib2.urlopen(request)print?response.read()except?urllib2.URLError,?e:if?hasattr(e,"code"):print?e.codeif?hasattr(e,"reason"):???? 程序運行結果如下:
?<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="chrome=1,IE=edge">
<meta property="wb:webmaster" content="cb81e216cbe9a3b9" />
……
3)、 使用post方式提交數據:
??????以登錄http://weibo.kedacom.com為例,對應代碼如下:
import?urllibimport?urllib2values?=?{"email":" xxxxxxx@kedacom.com","password":"xxxxxxx "}data?=?urllib.urlencode(values)?url?=?" http://weibo.kedacom.com "#?request?=?urllib2.Request(url,data)headers?=?{'User-Agent':'Mozilla/5.0?(compatible;?MSIE?10.0;?Windows?NT?6.2;?WOW64;?Trident/6.0;?MALNJS)'}request?=?urllib2.Request(url,data,headers?=?headers)response?=?urllib2.urlopen(request)?
4)、?提取訪問網站后的cookie模擬網站登錄
?????? cookie是客戶端在訪問服務器時,服務器返回給客戶端一個標識,利用cookie服務器能有效地對客戶端的身邊進行識別,使用cookie訪問網站的過程中,cookie都是作為客戶端頭部信息的一部分,現用一個寫得比較菜的代碼來加以說明,當然這里僅僅是為了說明模擬登陸網站的原理:
import?urllib import?urllib2 import?cookielib headers={'Referer':?'http://weibo.kedacom.com/weibo/login','User-Agent':?'Mozilla/5.0?(compatible;?MSIE?10.0;?Windows?NT?6.2;?WOW64;?Trident/6.0;?MALNJS)',} values={'username':'xxxxxx@0kedacom.com','password':'xxxxxx','encode':'false','rememberMe':'true'}url='http://weibo.kedacom.com/weibo/login/weiboLogin'filename?=?'cookie.txt'#聲明一個MozillaCookieJar對象實例來保存cookie,之后寫入文件cookie?=?cookielib.MozillaCookieJar(filename)opener?=?urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))request?=?urllib2.Request(url,postdata,headers)result?=?opener.open(request)#保存cookie到cookie.txt中cookie.save(ignore_discard=True,?ignore_expires=True)url1='http://weibo.kedacom.com/weibo/j_spring_security_check?j_password_encoder=false&j_username=zhongside%40kedacom.com&j_password=888888&j_login_type=weibo&_spring_security_remember_me=true'result?=?opener.open(url1)cookie.save(ignore_discard=True,?ignore_expires=True)url2='http://weibo.kedacom.com/weibo/login/success'result?=?opener.open(url2)cookie.save(ignore_discard=True,?ignore_expires=True)url3='http://weibo.kedacom.com/weibo/home'result?=?opener.open(url3)print?result.read()轉載于:https://blog.51cto.com/857768/1641897
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的http协议网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。