Python Http 请求

Python029

Python Http 请求,第1张

如果要进行客户端和服务器端之间的消息传递,我们可以使用HTTP协议请求

通过URL网址传递信息,可以直接在URL中写上要传递的信息,也可以由表单进行传递(表单中的信息会自动转化为URL地址中的数据,通过URL地址传递)

备注:已经取得资源,并将资源添加到响应中的消息体

可以向服务器提交数据,是一种比较安全的数据传递方式,比如在登录时,经常使用 POST 请求发送数据

请求服务器存储一个资源,通常需要制定存储的位置

请求服务器删除一个资源

请求获取对应的 HTTP 报头信息

可以获得当前URL所支持的请求类型

状态码:200 OK

表明请求已经成功. 默认情况下成功的请求将会被缓存

不同请求方式对于请求成功的意义如下:

GET:已经取得资源,并将资源添加到响应中的消息体.

HEAD:作为消息体的头部信息

POST:在消息体中描述此次请求的结果

请求成功对于PUT 和 DELETE 来说并不是200 ok 而是 204 所代表的没有资源 (或者 201 所代表的当一个资源首次被创建成功

以下是常见状态码及含义

本文实例讲述了python通过get,post方式发送http请求和接收http响应的方法。分享给大家供大家参考。具体如下:

测试用CGI,名字为test.py,放在apache的cgi-bin目录下:

#!/usr/bin/python

import cgi

def main():

print "Content-type: text/html\n"

form = cgi.FieldStorage()

if form.has_key("ServiceCode") and form["ServiceCode"].value != "":

print "<h1>Hello",form["ServiceCode"].value,"</h1>"

else:

print "<h1>Error! Please enter first name.</h1>"

main()

python发送post和get请求

get请求:

使用get方式时,请求数据直接放在url中。

方法一、

import urllib

import urllib2

url = "test.py?ServiceCode=aaaa"

req = urllib2.Request(url)

print req

res_data = urllib2.urlopen(req)

res = res_data.read()

print res

方法二、

import httplib

url = "hest/test.py?ServiceCode=aaaa"

conn = httplib.HTTPConnection("192.168.81.16")

conn.request(method="GET",url=url)

response = conn.getresponse()

res= response.read()

print res

post请求:

使用post方式时,数据放在data或者body中,不能放在url中,放在url中将被忽略。

方法一、

import urllib

import urllib2

test_data = {'ServiceCode':'aaaa','b':'bbbbb'}

test_data_urlencode = urllib.urlencode(test_data)

requrl = "/python_test/test.py"

req = urllib2.Request(url = requrl,data =test_data_urlencode)

print req

res_data = urllib2.urlopen(req)

res = res_data.read()

print res

方法二、

import urllib

import httplib

test_data = {'ServiceCode':'aaaa','b':'bbbbb'}

test_data_urlencode = urllib.urlencode(test_data)

requrl = "python_test/test.py"

headerdata = {"Host":"116"}

conn = httplib.HTTPConnection("192.168.81.16")

conn.request(method="POST",url=requrl,body=test_data_urlencode,headers = headerdata)

response = conn.getresponse()

res= response.read()

print res

对python中json的使用不清楚,所以临时使用了urllib.urlencode(test_data)方法

模块urllib,urllib2,httplib的区别

httplib实现了http和https的客户端协议,但是在python中,模块urllib和urllib2对httplib进行了更上层的封装。

介绍下例子中用到的函数:

1、HTTPConnection函数

httplib.HTTPConnection(host[,port[,stict[,timeout]]])

这个是构造函数,表示一次与服务器之间的交互,即请求/响应

host 标识服务器主机(服务器IP或域名)

port 默认值是80

strict 模式是False,表示无法解析服务器返回的状态行时,是否抛出BadStatusLine异常

例如:

conn = httplib.HTTPConnection("1.16",80) 与服务器建立链接。

2、HTTPConnection.request(method,url[,body[,header]])函数

这个是向服务器发送请求

method 请求的方式,一般是post或者get,

例如:

method="POST"或method="Get"

url 请求的资源,请求的资源(页面或者CGI,我们这里是CGI)

例如:

url="htti-bin/python_test/test.py" 请求CGI

或者

url="ht_test/test.html" 请求页面

body 需要提交到服务器的数据,可以用json,也可以用上面的格式,json需要调用json模块

headers 请求的http头headerdata = {"Host":"192.168.81.16"}

例如:

test_data = {'ServiceCode':'aaaa','b':'bbbbb'}

test_data_urlencode = urllib.urlencode(test_data)

requrl = "hgi-bin/python_test/test.py"

headerdata = {"Host":"192.116"}

conn = httplib.HTTPConnection("196",80)

conn.request(method="POST",url=requrl,body=test_data_urlencode,headers = headerdata)

conn在使用完毕后,应该关闭,conn.close()

3、HTTPConnection.getresponse()函数

这个是获取http响应,返回的对象是HTTPResponse的实例。

4、HTTPResponse介绍:

HTTPResponse的属性如下:

read([amt]) 获取响应消息体,amt表示从响应流中读取指定字节的数据,没有指定时,将全部数据读出;

getheader(name[,default]) 获得响应的header,name是表示头域名,在没有头域名的时候,default用来指定返回值

getheaders() 以列表的形式获得header

例如:

date=response.getheader('date')

print date

resheader=''

resheader=response.getheaders()

print resheader

列形式的响应头部信息:

[('content-length', '295'), ('accept-ranges', 'bytes'), ('server', 'Apache'), ('last-modified', 'Sat, 31 Mar 2012 10:07:02 GMT'), ('connection', 'close'), ('etag', '"e8744-127-4bc871e4fdd80"'), ('date', 'Mon, 03 Sep 2012 10:01:47 GMT'), ('content-type', 'text/html')]

date=response.getheader('date')

print date

取出响应头部的date的值。

HTTP “请求头信息” Request Header 是向服务端提供客户端的信息,“响应头信息” Response Header 是服务端向客户端提供请求文档信息或服务器的状态信息,服务端判断服务端的身份,就是通过 Header 来判断的,所以爬虫通过设置 Header 来隐藏自己相当重要。

一个完整的HTTP请求包含以下部分:

请求方法 URL HTTP版本

请求头信息

请求数据

<一个空行,请求的结束行>

常见的请求头:

Accept :客户端接收的数据类型,如:Accept:text/html

User Agent :客户端软件类型

Authorization :认证消息,包括用户名和口令

Referer :用户获取的Web页面

真实的请求头信息会更多,下面是豆瓣某短评的真实请求头:

一个完整的HTTP响应包含以下部分:

状态行

响应头

响应数据

常见的状态行:

更多状态码查看: HTTP状态码

常见的响应头:

Server :Web服务器程序的信息

Date :当前服务器的日期和时间

Last Modified :请求文档最近一次修改的时间

Expires :请求文档过期时间

Content-length :数据长度(字节)

Content-type :数据MIME类型

WWW-authenticate :用于通知客户方需要的认证信息,如用户名,口令等

下面是豆瓣某短评的真实响应头:

Python使用Requests来请求的时候,如果没有设置Header,Header是空的,设置Header的方法如下: