requests模块

1、介绍

requests是python用于处理http/https的一个第三方库,需要pip安装。

  • 注意避免安装request模块,这是一个恶意黑客仿照requests定制的模块

Python requests 模块 | 菜鸟教程 (runoob.com)

Requests: HTTP for Humans™ — Requests 2.31.0 documentation

2、request函数

def request(method, url, **kwargs):
"""
def request(self, method, url, params=None, data=None, headers=None, cookies=None, files=None,
        auth=None, timeout=None, allow_redirects=True, proxies=None, hooks=None, stream=None,
        verify=None, cert=None, json=None):
"""

 

import requests
req = requests.request(method='get', url='https://www.baidu.com')
print(req)
  • requests.request是一个函数,method和url是必要参数
  • res的类型为<class ‘requests.models.Response’>

3、requests.request函数各参数

3.1 method

  • 必选参数,表示请求方法。
  • 可选值:GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH、TRACE、CONNECT。
  • 设置时一般是大写,但也可以是小写,或者混杂。发送请求时,自动转为大写
  • 设置如果超出可选值,会自动转为大写,然后发送报文,由服务端决定接收处理。

3.2 url参数

  • 必选参数,表示请求路径,而且需要包括协议部分
  • 如果域名不存在http或者https服务,会报错
  • 可以直接处理https,也可以是http
  • 设置时,url可以直接包含#hash部分,但请求报文中不会携带

3.3 params参数

# q = {'name':'zz','age':12}
# q_2 = [('name','zz'),('age',22)]
# q_3 = 'name=xx&age=12'
  • 可选,作用是设置url中的请求参数,类型可以为字典或者元组的列表,或者字符串
  • 字典中的值会拼接到url中的params部分,如果未有参数,则先会添加?。如果已有参数,则直接追加,注意不会检查已有参数是否已经重名

3.4 data参数

data_1 = 'abcd'	# abcd
data_2 = {'name':'zz','age':12}	# name=zz&age=12
data_3 = [('name','zz'),('age',12)] # name=zz&age=12
  • 可选,作用是设置body中的请求参数,类型可以为字符串、元组的列表和字典

3.5 json参数

json_1 = 'abcd'	# b'"abcd"'
json_2 = {'name':'zz','age':12}	# b'{"name": "zz", "age": 12}'
json_3 = [('name','zz'),('age',12)]	# b'[["name", "zz"], ["age", 12]]'
  • 可选,作用是设置body部分携带的数据,以json格式发送,类型可以为字符串、元组的列表和字典

3.6 headers参数

headers = {'User-Agent':'zz','age':'12', 'Cookie':'name=zz; age=123'}

(1)headers是非必要参数,用于设置请求的头部字段。

  • 类型为字典,并且字典元素的键和值都必须是str类型,否则报错

(2) request函数在请求时,无论是否直接设置headers参数,都会默认设置一些头部字段

  • 从wireshark来看,默认设置Host、User-Agent、Accept-Encoding、Accept、Connection字段。
  • 但默认的,从res.request.headers读取头部字段,并不包含Host字段

(3) headers设置时

  • 后者会覆盖前者重名的头部字段,未重名则是追加字段
  • 比较是否重名时,忽略头部字段名称的大小写
  • 且允许覆盖初始的默认头部字段
  • 设置的头部名称并不会转换大小写,设置为host,则显示即为host
  • 允许设置http协议规定的之外自定义的键

(4) headers设置Host

  • 此时res.request.headers读取头部字段,才会包括Host字段
  • Host设置,如果要设置,一般是与url中的域名一致。此时正常请求
  • 如果设置Host与url中的域名不同,则实际请求是以url决定。但头部字段中Host是手动设置的值。此时,服务端接收后很可能会报5xx或4xx等

3.7 cookies参数

cookies = {'name':'zz','age':'12'}
  • 作用:设置请求携带的cookie,类型为字典,并且字典元素的键和值都必须是str类型,否则报错

3.8 files参数

upload_files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=upload_files)
  • 作用:上传文件
  • 在读取文件时,注意务必使用'rb'即二进制模式读取,这样获取的bytes长度才是文件的长度。

3.9 timeout参数

  • 作用是设置延时,单位为秒。如果超过时间,还未请求响应,则判定报错
  • 结合wireshark分析,如果设置为0或者负数,那么requests模块不会发送请求,而是直接报错,警告需要设置大于0的值
  • 如果设置为None,则会一直等待响应接收
  • 该参数的设置可以有效避免GUI等待的卡顿,但是需要考量设置的时间长短,区分一般的网络延时,服务端处理速度慢和完全的连接不上
  • 一般情况下,设置为5秒是一个不错的尺度

3.10 allow_redirects参数

  • 作用是当请求之后接到一个3xx重定向的响应,是否进行自动重定向。默认为True,表示会自动重定向,这会重置接收到的响应对象的请求对象数据,即res.request对象不是前面手动设置的对象。尤其是cookie和url
  • 一般,爬虫时会考虑进行重定向,而渗透测试需要非重定向。当然,一切并不绝对

 

posted @ 2023-10-22 00:21  挖洞404  阅读(51)  评论(0编辑  收藏  举报