Python之渗透测试笔记(五) ——Requests模块

request中文手册:https://requests.readthedocs.io/zh_CN/latest/

Requests模块简介

  • request模块是python的第三方库,主要功能如下:
    Keep-Alive & 连接池
    国际化域名和 URL
    带持久 Cookie 的会话
    浏览器式的 SSL 认证
    自动内容解码
    基本/摘要式的身份认证
    优雅的 key/value Cookie
    自动解压
    Unicode 响应体
    HTTP(S) 代理支持
    文件分块上传
    流下载
    连接超时
    分块请求
    支持 .netrc

  • request库的安装方法: Win + R键,在窗口输入cmd,打开命令提示符,输入pip install requests,回车安装。

Request模块的7个主要参数

方法 说明
requests.request() 构造一个请求,支撑下面各种方法的基础方法
requests.get() 获取HTML页面的主要方法,对应于HTTP的GET方式
requests.head() 获取HTML页面头信息的方法,对应于HTTP的HEAD
requests.post() 向HTML页面提交POST请求方式,对应于HTTP的POST
requests.put() 向HTML页面提交PUT请求的方法,对应于HTTP的PUT
requests.patch() 向HTML页面提交局部修改请求,对应于HTTP的PATCH
requests.delete() 向HTML页面提交删除请求,对应于HTTP的DELETE
  • requests.get(url):
  • 返回一个包含服务器资源的response对象,构造一个向服务器请求资源的request对象
  • 完整使用方法:
def get(self, url, **kwargs):
        r"""Sends a GET request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        """

        kwargs.setdefault('allow_redirects', True)

url :获取页面的URL
param: url中的额外参数(如:查询字符串为键/值对的形式)。字典或字节流格式,可选
kwarges:12个控制访问的参数

  • 示例:
>>> r = requests.get('https://api.github.com/events')  
>>> r = requests.post('http://httpbin.org/post', data = {'key':'value'})
>>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})
>>> r = requests.delete('http://httpbin.org/delete')
>>> r = requests.head('http://httpbin.org/get')
>>> r = requests.options('http://httpbin.org/get')

Response响应内容

  • Response对象属性
属性 说明
r.ststus_code HTTP请求的响应状态码
r.text HTTP响应内容的字符串形式,即:URL对应的源码
r.encoding 从HTTPheader中猜测响应内容编码方式,也可以修改文本编码
r.apparent_coding 从内容分析响应的内容编码方式(备选编码方式)
r.content HTTP响应内容的二进制形式
r.json() Requests 中也有一个内置的 JSON 解码器,助你处理 JSON 数据
r.raw 获取来自服务器的原始套接字响应(确保在初始请求中设置了 stream=True)
r.headers 查看以一个 Python 字典形式展示的服务器响应头

定制请求头

  • 如果你想为请求添加 HTTP 头部,只要简单地传递一个 dict 给 headers 参数就可以了
    dict() 函数用于创建一个字典,语法如下:
class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)
参数说明:
    **kwargs -- 关键字
    mapping -- 元素的容器。
    iterable -- 可迭代对象。
 实例:
>>>dict(a='a', b='b', t='t')     # 传入关键字
{'a': 'a', 'b': 'b', 't': 't'}
  • 示例:
>>> url = 'https://api.github.com/some/endpoint'
>>> headers = {'user-agent': 'my-app/0.0.1'}

>>> r = requests.get(url, headers=headers)
  • 如果在 .netrc (.netrc是个用户配置脚本文件)中设置了用户认证信息,使用 headers= 设置的授权就不会生效。而如果设置了 auth= 参数,.netrc 的设置就无效了。
  • 如果被重定向到别的主机,授权 header 就会被删除。
    
  • 代理授权 header 会被 URL 中提供的代理身份覆盖掉。
    
  • 在我们能判断内容长度的情况下,header 的 Content-Length 会被改写。
    

POST请求

  • 源码:
**def post(url, data=None, json=None, **kwargs):
    r"""Sends a POST request.

    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
post(url: str, data: Union[None, str, bytes, MutableMapping[str, Any], MutableMapping[Unknown, Any], Iterable[Tuple[str, str]], Unknown], json: ..., **kwargs) -> Response
Sends a POST request.

:param url: URL for the new Request object.**
  • Content-Type(MIME)的格式有四种:分别是application/x-www-form-urlencoded(这也是默认格式)、application/jsontext/xml以及multipart/form-data格式。
  • application/x-www-form-urlencoded
import requests
datas = {'key1':"value1","key":"value2"}  #请求的参数构造成一个字典

r = requests.post("https://www.baidu.com",data = datas) #将字典传给requests.post()的data参数 
r.encoding = "utf-8" #防止编码出错
print(r.text)
  • 其他类型请参考:POST请求https://www.cnblogs.com/single-fire/p/10542202.html

cookie

  • 查看cookie,r.cookies即可查看cookie。
import requests
url = "https://www.baidu.com"
r = requests.get(url)
print(r.cookies)  #直接通过打印r.cookies来获取查看cookie内容
  • 发送cookie
import requests
url = "https://www.baidu.com"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0"                
}
 
cookies = {"cookie_name": "cookie_value", } #设置cookies参数
response = requests.get(url, headers=headers, cookies=cookies)
import requests
"""先实例化一个RequestCookieJar的类,然后set设置值,最后在get方法里面指定cookies参数"""
jar = requests.cookies.RequestsCookieJar() # Cookie 的返回对象为 RequestsCookieJar,它的行为和字典类似,但接口更为完整,适合跨域名跨路径用
jar.set("BDORZ", "4EDT7A5263775F7E0A4B&F330724:FG=1", domain="baidu.com")
url = "https://www.baidu.com"
response = requests.get(url, cookies=jar)

session会话

import requests
s = requests.Session()   #维持会话,可以让我们在跨请求时保存某些参数

url = "https://www.baidu.com"
r = s.get(url)   #get方式发送请求
r.encoding = "utf-8"  #防止乱码
print(r.text)

请求与响应

  • 任何时候进行了类似 requests.get() 的调用,你都在做两件主要的事情。其一,你在构建一个 Request 对象, 该对象将被发送到某个服务器请求或查询一些资源。其二,一旦 requests 得到一个从服务器返回的响应就会产生一个 Response 对象。该响应对象包含服务器返回的所有信息,也包含你原来创建的 Request 对象。

参考资料:

  1. https://requests.readthedocs.io/zh_CN/latest/
  2. https://www.bilibili.com/video/BV1tb411h7dx?t=209
  3. https://www.cnblogs.com/single-fire/p/10542202.html
  4. https://www.runoob.com/http/http-content-type.html
发布了7 篇原创文章 · 获赞 3 · 访问量 142

猜你喜欢

转载自blog.csdn.net/weixin_44889655/article/details/105624811
今日推荐