Python下載網頁的幾種方法


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.1
Accept: */*
Accept-Language: zh-cn
host: localhost

Content-Type: application/x-www-form-urlencoded
Content-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.1
Accept: */*
Accept-Language: zh-cn
host: localhost

Content-Type: application/x-www-form-urlencoded
Content-Length: 12
Connection:closes
n=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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM