requests模块总结

  1. 概述

  • Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。

  • 在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。

  • 现代,国际化,友好。

  • requests会自动实现持久连接keep-alive

 

  1. 基础入门

4.2.1 安装导入模块

安装 pip install requests

导入模块 import requests

4.2.2 发送基本的get请求

# 最基本的get请求

 

import requests

r = requests.get(url='http://www.baidu.org') # 最基本的GET请求

print(r.status_code) # 获取返回状态

#带参数的GET请求,URL上传递参数

r = requests.get(url='http://dict.baidu.com/s', params={'wd':'python'})

print(r.url)

print(r.text) #打印解码后的返回数据

 

#我们还可以使用以下各种方法

 

requests.get(‘https://github.com/timeline.json’) # GET请求 requests.post(“http://httpbin.org/post”) # POST请求 requests.put(“http://httpbin.org/put”) # PUT请求 requests.delete(“http://httpbin.org/delete”) # DELETE请求 requests.head(“http://httpbin.org/get”) # HEAD请求 requests.options(“http://httpbin.org/get” ) # OPTIONS请求

 

  1. requests发送基本的post请求

import requests

 

#POST参数实例

requests.post('http://www.itwhy.org/wp-comments-post.php', data={'comment': '测试POST'})

 

  • POST发送JSON数据:

import requests

import json

r = requests.post('https://api.github.com/some/endpoint', data=json.dumps({'some': 'data'}))

print(r.json())

4.4 requests 携带header和cookie

  • 定制头header:

import requests

import json

 

data = {'some': 'data'}

headers = {'content-type': 'application/json',

'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}

 

r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers)

print(r.text)

 

  • 定制cookie信息:

header = {'user-agent': 'my-app/0.0.1''}

cookie = {'key':'value'}

r = requests.get/post('your url',headers=header,cookies=cookie)

4.5 requests模块之Response对象

  • 使用requests方法后,会返回一个response对象,其存储了服务器响应的内容,如上实例中已经提到的 r.text、r.status_code等等

  • 获取文本方式的响应体实例:当你访问 r.text 之时,会使用其响应的文本编码进行解码,并且你可以修改其编码让 r.text 使用自定义的编码进行解码,如下所示

 

r = requests.get('http://www.itwhy.org')

print(r.text, '\n{}\n'.format('*'*79), r.encoding)

r.encoding = 'GBK'

print(r.text, '\n{}\n'.format('*'*79), r.encoding)

 

其他响应:

 

  • r.status_code #响应状态码

  • r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取

  • r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩

  • r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码

  • r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None

  • #*特殊方法*#

  • r.json() #Requests中内置的JSON解码器

  • r.raise_for_status() #失败请求(非200响应)抛出异常

  • r.headers #返回字典类型,头信息

  • r.requests.headers #返回发送到服务器的头信息

  • r.cookies #返回cookie

  • r.history#返回重定向信息,当然可以在请求是加上allow_redirects = false 阻止重定向

4.6 设置超时

  • r = requests.get('url',timeout=1) #设置秒数超时,仅对于连接有效

4.7 设置代理

proxies = {'http':'ip1','https':'ip2' }

requests.get('url',proxies=proxies)

4.8 http六种请求方法的区别

  • 标准Http协议支持六种请求方法,即:

  • 1、GET

  • 2、POST

  • 3、PUT

  • 4、Delete

  • 5、HEAD

  • 6、Options

  • 但其实我们大部分情况下只用到了GET和POST。如果想设计一个符合RESTful规范的web应用程序,则这六种方法都会用到。不过即使暂时不想涉及REST,了解这六种方法的本质仍然是很有作用的。大家将会发现,原来web也是很简洁明了的。下面依次说明这六种方法。

  • 1,GET:GET可以说是最常见的了,它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。

  • 2,HEAD:HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确。

  • 3,PUT:这个方法比较少见。HTML表单也不支持这个。本质上来讲, PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。

  • 举个例子:如一个用于提交博文的URL,/addBlog。如果用PUT,则提交的URL会是像这样的”/addBlog/abc123”,其中abc123就是这个博文的地址。而如果用POST,则这个地址会在提交后由服务器告知客户端。目前大部分博客都是这样的。显然,PUT和POST用途是不一样的。具体用哪个还取决于当前的业务场景。

  • 4,DELETE:删除某一个资源。基本上这个也很少见,不过还是有一些地方比如amazon的S3云服务里面就用的这个方法来删除资源。

  • 5,POST:向服务器提交数据。这个方法用途广泛,几乎目前所有的提交操作都是靠这个完成。

  • 6,OPTIONS:这个方法很有趣,但极少使用。它用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。

  • 其实还有一个 TRACE方法,不过这个基本上不会用到,这里就不介绍了。

  • 以上的六种方法,我们可以跟数据库的CRUD增删改查操作对应起来: CREATE :PUT READ:GET UPDATE:POST DELETE:DELETE 这样一来就实现了HTTP和数据库操作(其实不光是数据库,任何数据如文件图表都是这样)的完美统一,这也是REST的精髓之一

4.9 总结归纳

requests官网地址:https://docs.python-requests.org/en/latest/user/quickstart/

 

HTTP请求类型:

# get类型

r = requests.get('https://github.com/timeline.json')

# post类型

r = requests.post("http://m.ctrip.com/post")

# put类型

r = requests.put("http://m.ctrip.com/put")

# delete类型

r = requests.delete("http://m.ctrip.com/delete")

# head类型

r = requests.head("http://m.ctrip.com/head")

# options类型

r = requests.options("http://m.ctrip.com/get")

 

# 获取响应内容

print(r.content) #以字节的方式去显示,中文显示为字符

print(r.text) #以文本的方式去显示

 

#URL传递参数

payload = {'keyword': '香港', 'salecityid': '2'}

r = requests.get("http://m.ctrip.com/webapp/tourvisa/visa_list", params=payload)

print(r.url)

 

#获取/修改网页编码

r = requests.get('https://github.com/timeline.json')

print (r.encoding)

 

 

#json处理

r = requests.get('https://github.com/timeline.json')

print(r.json()) # 需要先import json

 

# 定制请求头

url = 'http://m.ctrip.com'

headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}

r = requests.post(url, headers=headers)

print (r.request.headers)

 

#复杂post请求

url = 'http://m.ctrip.com'

payload = {'some': 'data'}

#如果传递的payload是string而不是dict,需要先调用dumps方法格式化一下

r = requests.post(url, data=json.dumps(payload))

 

 

# post多部分编码文件

url = 'http://m.ctrip.com'

files = {'file': open('report.xls', 'rb')}

r = requests.post(url, files=files)

 

# 响应状态码

r = requests.get('http://m.ctrip.com')

print(r.status_code)

 

# 响应头

r = requests.get('http://m.ctrip.com')

print (r.headers)

print (r.headers['Content-Type'])

print (r.headers.get('content-type')) #访问响应头部分内容的两种方式

 

# Cookies

url = 'http://example.com/some/cookie/setting/url'

r = requests.get(url)

r.cookies['example_cookie_name'] #读取cookies

 

url = 'http://m.ctrip.com/cookies'

cookies = dict(cookies_are='working')

r = requests.get(url, cookies=cookies) #发送cookies

 

#设置超时时间

r = requests.get('http://m.ctrip.com', timeout=0.001)

 

#设置访问代理

proxies = {

"http": "http://10.10.1.10:3128",

"https": "http://10.10.1.100:4444",

}

r = requests.get('http://m.ctrip.com', proxies=proxies)

 

 

#如果代理需要用户名和密码,则需要这样:

proxies = {

"http": "http://user:pass@10.10.1.10:3128/",

}

posted on 2021-09-11 10:10  groby  阅读(66)  评论(0编辑  收藏  举报