【Python requests】

版权声明:本文为博主原创文章,各路大佬可放心转载。 https://blog.csdn.net/qq_41964425/article/details/86090232

GET


get(url, params=None, **kwargs):

常用参数如下


url
请求的url


params
请求的参数,它会自动将传入的字典转码


headers
请求头
注意字典里值为 None 的参数不会被添加到 URL 的查询字符串中
如果在 .netrc 中设置了用户认证信息,使用 headers= 设置的授权就不会生效
而如果设置了 auth=参数.netrc 的设置就无效了
如果被重定向到别的主机,授权 header 就会被删除
代理授权 header 会被 URL 中提供的代理身份覆盖掉
在我们能判断内容长度的情况下,header 和 Content-Length 会被改写
更进一步讲,Requests 不会基于定制 header 的具体情况改变自己的行为。只不过在最后的请求中,所有的 header 信息都会被传递进去
注意: 所有的 header 值必须是 string、bytestring 或者 unicode。尽管传递 unicode header 也是允许的,但不建议这样做



timeout
请求超时时间
基本上所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应:

response = requests.get('http://github.com', timeout=0.001)

注意:timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)


verify
是否验证服务器的SSL证书, True/False


其它参数见POST

POST


post(url, data=None, json=None, **kwargs):

常用参数如下


url
请求的url


data
请求的数据,会自动转码为表单形式
它还可以接收一个元组,在表单中多个元素使用同一 key 时,这种方式尤其有效:

payload = (('key1', 'value1'), ('key1', 'value2'))
response = requests.post(url, data=payload)

"""payload
{
  ...
  "form": {
    "key1": [
      "value1",
      "value2"
    ]
  },
  ...
}
"""

headers
请求头,详见上面的GET常用参数讲解


timeout
请求超时时间,详见上面的GET常用参数讲解


files
可实现上传文件:

files = {'file': open(filepath, 'rb')}

# 你也可以显式地设置文件名,文件类型和请求头:
# files = {'file': (filepath, open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}

# 如果你想,你也可以发送作为文件来接收的字符串:
# files = {'file': (filepath, 'some,data,to,send\nanother,row,to,send\n')}

response = requests.post(url, files=files)
print(response.text)

json
也是请求的参数(可代替data参数),直接将指定的对象转换为json数据并提交


proxies
设置代理IP

requests.POST(url, proxies={'https': '200.200.200.200:200'})
# 如果是HTTP协议,请将key更改为 http

其它参数见GET

Response


常见的操作如下


response.encoding
指定编码格式


response.url
返回请求的完整URL


response.text
返回解码后的文件(使用encoding指定的编码格式进行解码)
HTTP和XML自身可以指定编码,你应该使用 response.content 来找到编码,然后设置 response.encoding 为相应的编码,这样你就能使用正确的编码解析 response.text



response.content
直接返回bytes类型的数据
对于非文本请求,你也能以字节的方式访问请求的相应体
Requests会自动为你解码 gzip 和 deflate 传输编码的相应数据
例如,以请求返回的二进制数据创建一张图片,你可以使用如下代码:

from PIL import Image
from io import BytesIO
i = Image.open(BytesIO(response.content))

response.json()
返回JSON格式的数据
JSON解析失败,一定会抛出一个异常,但成功调用 response.json() 并不意味着相应的成功,有的服务器会在失败的相应中包含一个JSON对象(比如 HTTP 500 的错误细节),这种JSON会被解码返回。
如果要检查请求是否成功,请使用response.status_coderesponse.raise_for_status()



response.iter_content(chunk_size)
可将响应数据写入磁盘
在一般情况下,你应该以下面的模式将文本流保存到文件:

with open('filename.html', 'wb') as fd:
    [fd.write(chunk) for chunk in response.iter_content(chunk_size=1024)]
    # chunk_size=1024  指定每次接收的大小

response.status_code
返回响应的状态码
requests模块内置了一个状态码查询对象:

print(response.status_code == requests.codes.ok)
# True

response.headers
返回响应头消息
根据 RFC 2616,HTTP 头部是大小写不敏感的
因此,我们可以使用任意大写形式来访问这些响应头字段
它还有一个特殊点,那就是服务器可以多次接受同一 header,每次都使用不同的值。但 Requests 会将它们合并,这样它们就可以用一个映射来表示出来,参见 RFC 7230



response.cookies['key']
如果响应中存在一些cookie,则返回cookies信息
若果想发送你的cookies到服务器,可以使用 cookies 参数:

response = requests.get(url, cookies=cookies)

response.history
返回重定向与请求历史
如下,以 HTTP 传输协议访问CSDN时,将被重定向至 HTTPS 传输协议访问:

response = requests.get('http://blog.csdn.net/')

print(response.url)  # https://blog.csdn.net/
print(response.history)  # [<Response [301]>]

Session 对象


session对象和requests的作用几乎一样,都可以进行请求的发送,并且请求的方式也是一致的。

session对象进行请求的发送,如果会产生cookie的话,则产生的cookie会被存储到该session对象中,再次调用该session对象发送请求时,会携带上这些cookie


注意:Session是一个单例类


具体请看下面的操作:

# 下面将使用session对象来模拟登录用户后,获取个人详情页面

import requests


# 这是 人人网 发送登录数据(验证)的url
login_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=201903162423'

# 这是 人人网 个人详情页面
detail_url = 'http://www.renren.com/xxxx/profile'



# 我们先获取一个session对象
session = requests.Session()


# 使用session对象模拟登录
response = session.post(url=login_url, headers=headers, data=data)
# 模拟登录成功后,session对象中将存储服务器发来的cookie数据
# print(response.cookies)


# 获取个人详情页面
page_text = session.get(url=detail_url, headers=headers).text
# 此时,我们还是使用这个session对象发送请求
# 该请求将携带session对象中存储的cookie数据



# 为何要这么用呢?
# 因为,在有些情况下(比如上述情况),在你获取个人详情页面时,服务器要判断你是否已登录
# 而服务器正是通过请求中的cookie数据来判断你是否已登录
# 如果你的请求中没有cookie,那么服务器肯定不会把个人详情页面给你

猜你喜欢

转载自blog.csdn.net/qq_41964425/article/details/86090232