zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Halcon算子翻译——else
    Halcon算子翻译——default
    halcon算子翻译——continue
    Halcon算子翻译——catch
    Halcon算子翻译——case
    生命周期
    输入流输出流
    在搜索引擎中输入汉字就可以解析到对应的域名,请问如何用LoadRunner进行测试。
    给你一个网站,你如何测试?
    你在测试中发现了一个bug,但是开发经理认为这不是一个bug,你应该怎样解决?
  • 原文地址:https://www.cnblogs.com/houkai/p/3856289.html
Copyright © 2011-2022 走看看