国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Python下載網頁的幾種方法

2019-11-14 17:41:54
字體:
來源:轉載
供稿:網友

get和post方式總結

get方式:以URL字串本身傳遞數據參數,在服務器端可以從'QUERY_STRING'這個變量中直接讀取,效率較高,但缺乏安全性,也無法來處理復雜的數據(只能是字符串,比如在servlet/jsp中就無法處理發揮java的比如vector之類的功能)。

post方式:就傳輸方式講參數會被打包在數據報中傳輸,從CONTENT_LENGTH這個環境變量中讀取,便于傳送較大一些的數據,同時因為不暴露數據在瀏覽器的地址欄中,安全性相對較高,但這樣的處理效率會受到影響。

get 請求表示客戶端請求一個uri,服務器返回客戶端請求的uri,post請求表示客戶端請求的時候還要提交數據,比喻提交form表單,要提交的數據會放到請求報文的body部分。服務器收到后這樣的請求后通常需要來處理這些數據。

在Form里面,可以使用post也可以使用get。它們都是method的合法取值。但是,post和get方法在使用上至少有兩點不同:
1、Get方法通過URL請求來傳遞用戶的輸入。Post方法通過另外的形式。
2、Get方式的提交你需要用Request.QueryString來取得變量的值,而Post方式提交時,你必須通過Request.Form來訪問提交的內容。

仔細研究下面的代碼。你可以運行來感受一下:

<!--兩個Form只有Method屬性不同--><FORM ACTION="getpost.asp" METHOD="get"><INPUT TYPE="text" NAME="Text" VALUE="Hello World"></INPUT><INPUT TYPE="submit" VALUE="" Method="Get"></INPUT></FORM><BR><FORM ACTION="getpost.asp" METHOD="post"><INPUT TYPE="text" NAME="Text" VALUE="Hello World"></INPUT><INPUT TYPE="submit" VALUE="" Method="Post"></INPUT></FORM><BR><BR><% If Request.QueryString("Text") <> "" Then %>通過get方法傳遞來的字符串是: "<B><%= Request.QueryString("Text") %></B>"<BR><% End If %><% If Request.Form("Text") <> "" Then %>通過Post方法傳遞來的字符串是: "<B><%= Request.Form("Text") %></B>"<BR><% End If %>

把上面的代碼保存為getpost.asp,然后運行,首先測試post方法,這時候,瀏覽器的url并沒有什么變化,返回的結果是:
通過Post方法傳遞來的字符串是: "Hello World"
然后測試用get方法提交,請注意,瀏覽器的url變成了:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的結果是:
通過get方法傳遞來的字符串是: "Hello World"
最后再通過post方法提交,瀏覽器的url還是:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的結果變成:
通過get方法傳遞來的字符串是: "Hello World"
通過Post方法傳遞來的字符串是: "Hello World"

提示:通過get方法提交數據,可能會帶來安全性的問題。比如一個登陸頁面。當通過get方法提交數據時,用戶名和密碼將出現在URL上。如果:
1、登陸頁面可以被瀏覽器緩存;2、其他人可以訪問客戶的這臺機器。
那么,別人即可以從瀏覽器的歷史記錄中,讀取到此客戶的賬號和密碼。所以,在某些情況下,get方法會帶來嚴重的安全性問題。建議在Form中,建議使用post方法。

Python下載網頁的幾種方法

通過get的方法:

fd = urllib2.urlopen(url_link)data = fd.read()

使用get方式時,url類似如下格式:

index.jsp?id=100&op=bind

GET報問頭如下:

GET /sn/index.php?sn=123&n=asa HTTP/1.1Accept: */*Accept-Language: zh-cnhost: localhostContent-Type: application/x-www-form-urlencodedContent-Length: 12 Connection:close

get方法還可以通過如下方式實現:

def GetHtmlSource_Get(htmurl):    htmSource = ""    try:        urlx = httplib.urlsplit(htmurl)        conn = httplib.HTTPConnection(urlx.netloc)        conn.connect()    #建立連接        conn.putrequest("GET", htmurl, None)    #請求類型        conn.putheader("Content-Length", 0)        conn.putheader("Connection", "close")        conn.endheaders()                res = conn.getresponse()        htmSource = res.read()    except Exception(), err:        trackback.PRint_exec()        conn.close()      return htmSource

使用post方式時,POST方法將請求參數封裝在HTTP請求數據中,以名稱/值的形式出現,可以傳輸大量數據,可用來傳送文件。POST報文頭如下:

POST /sn/index.php HTTP/1.1Accept: */*Accept-Language: zh-cnhost: localhostContent-Type: application/x-www-form-urlencodedContent-Length: 12Connection:closesn=123&n=asa

無論是post還是get方式,他們所傳遞的數據都要進行url編碼。每對name/value由&符分開;每對來自表單的name/value由=符分開;如果用戶沒有輸入值給這個name,那么這個name還是出現,只是無值。;任何特殊的字符(就是那些不是簡單的七位ASCII,如漢字)將以百分符%用十六進制編碼。urllib庫提供了一個函數來實現url的編碼:

search=urllib.urlencode({'q''python'})#'q=python'

通過post發送請求:

import httplib,urllib; #定義需要進行發送的數據    params = urllib.urlencode({'cat_id':'6',                                'news_title':'標題-Test39875',                                'news_author':'Mobedu',                                'news_ahome':'來源',                                'tjuser':'carchanging',                                'news_keyWord':'|',                                'news_content':'測試-Content',                                'action':'newnew',                                'MM_insert':'true'});     #定義一些文件頭    headers = {"Content-Type":"application/x-www-form-urlencoded",                "Connection":"Keep-Alive",
"Referer":"http://192.168.1.212/newsadd.asp?action=newnew"}; #與網站構建一個連接 conn = httplib.HTTPConnection("192.168.1.212"); #開始進行數據提交 同時也可以使用get進行 conn.request(method="POST",url="/newsadd.asp?action=newnew",body=params,headers=headers); #返回處理后的數據response = conn.getresponse(); #判斷是否提交成功 if response.status == 302: print "發布成功!"; else: print "發布失敗"; #關閉連接 conn.close();

也可以類似于get方法來實現:

def GetHtmlSource_Post(getString):    htmSource = ""    try:        url = httplib.urlsplit("http://app.sipo.gov.cn:8080")        conn = httplib.HTTPConnection(url.netloc)        conn.connect()        conn.putrequest("POST", "/sipo/zljs/hyjs-jieguo.jsp")    #post方法        conn.putheader("Content-Length", len(getString))        conn.putheader("Content-Type", "application/x-www-form-urlencoded")        conn.putheader("Connection", " Keep-Alive")        conn.endheaders()        conn.send(getString)    #Http包的body                f = conn.getresponse()        if not f:            raise socket.error, "timed out"        htmSource = f.read()        f.close()        conn.close()    except Exception(), err:        trackback.print_exec()        conn.close()    return htmSource

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 澳门| 澄城县| 广西| 伽师县| 漯河市| 区。| 绥化市| 厦门市| 武宁县| 福海县| 泸州市| 岢岚县| 临朐县| 阿图什市| 修文县| 陇南市| 政和县| 横峰县| 益阳市| 仪陇县| 天水市| 闻喜县| 庆城县| 卓尼县| 潮州市| 齐河县| 台州市| 丹凤县| 余姚市| 措美县| 武宣县| 鄂托克前旗| 共和县| 专栏| 黎川县| 东台市| 关岭| 土默特左旗| 田阳县| 西充县| 阳东县|