requests模块

1、介绍

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

2、request函数

import requests
def request(method, url, **kwargs):


res = requests.request(method='GET', url='https://www.baidu.com/');
  • request是一个函数,method和url参数必须给定
  • res的类型为<class ‘requests.models.Response’>

(1)method参数

  • 必选,请求方法。可选:GET、OPTIONS、HEAD、POST、PUT、PATCH或者DELETE。设置时可以是小写,或者混杂
  • method设置错误,比如为GE,不影响请求的发送。http的请求方法就为设置的错误值的大写,由服务器决定如何处理。如果对方法有限定可能会响应302,没有限定则可能会响应200。
  • res.request.method的值即这里设置的字符串。如果是小写的get,会自动转为大写。

(2)url参数

  • 必选,表示请求路径,而且需要包括协议部分
  • 如果域名不存在http或者https服务,会报错
  • 可以直接处理https,也可以是http

(3)params参数

# q = {'name':'zz','age':12}
# q_2 = [('name','zz'),('age',22)]
# q_3 = 'name=xx&age=12'

  • 可选,作用是设置url中的请求参数,类型可以为字典或者元组的列表,或者字符串
  • 字典中的值会拼接到url中的params部分,如果未有参数,则先会添加?。如果已有参数,则直接追加,注意不会检查已有参数是否已经重名

(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中的请求参数,类型可以为字符串、元组的列表和字典

(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格式发送,类型可以为字符串、元组的列表和字典

(6)headers参数

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

  • 作用:设置请求的头部字段,类型为字典,并且字典元素的键和值都必须是str类型,否则报错
  • request方法自身默认会设置一些http请求头部字段,在指定headers参数时,会进行判断是否已设置字段,判断不区分大小写,如果重复则覆盖,如果不重复则追加字段
  • 如果覆盖,并且新设置的键和值替代之前的键和值。主要注意其键的大小写以新设置的为准
  • headers的键可以任意设置,而非一定要是http协议规定的,同时可以直接在其中设置cookie

(7)cookies参数

cookies = {'name':'zz','age':'12'}

  • 作用:设置请求携带的cookie,类型为字典,并且字典元素的键和值都必须是str类型,否则报错

(8)files参数

upload_files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=upload_files)

  • 作用:上传文件
  • 在读取文件时,注意务必使用'rb'即二进制模式读取,这样获取的bytes长度才是文件的长度。

(9)timeout参数

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

(10)allow_redirects参数

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

3、特定请求方法

requests.request函数提供了任何请求方法的设置。而同在api.py文件下,还有一些其他函数,可以分别支持不同的请求方法,即不需要设置method参数。

def get(url, params=None, **kwargs):
    return request("options", url, **kwargs)
def head(url, **kwargs):
    kwargs.setdefault("allow_redirects", False)
    return request("head", url, **kwargs)
def post(url, data=None, json=None, **kwargs):
    return request("post", url, data=data, json=json, **kwargs)
def put(url, data=None, **kwargs):
    return request("put", url, data=data, **kwargs)
def patch(url, data=None, **kwargs):
    return request("patch", url, data=data, **kwargs)
def delete(url, **kwargs):
    return request("delete", url, **kwargs)

4、默认请求头部

req = HttpClass.request(url="https://www.baidu.com/")
req.send()
  • 默认的,requests模块会设置几个http请求头部字段
  • 直接通过request函数的headers参数设置User-Agent字段无效

5、自动编码

res = requests.get(url="http://120.48.75.111/wordpress/?p=2207%22\"'=<", allow_redirects=False)
print(res.request.url)

http://120.48.75.111/wordpress/?p=2207%22%22'=%3C
  • requests会对url中的参数中的敏感字符进行自动编码

6、wordpress

个人网站采用nginx+wordpress,测试过程中发现如果是单双引号以及空格间的一个或多个结尾,会被要求重定向,取消结尾部分的单双引号及空格。这三个字符直接字符或者url编码都是同样的效果。

如果结尾是+字符或者其他字符则不会。

 

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