简介

requests 是一个 python 的第三方库,可以模拟浏览器发送请求,来获取我们想要的数据,基本上 Burp 能做到的,我们也都可用 requests 模块来实现。


概念

一个完整的 http 数据包,应该分成两个部分请求和响应,请求是我们来发送的,响应是服务器返回的响应。请求又分为请求头和请求体,响应也是如此。

img

那我们如何用 requests 来获得请求头、请求体、响应头、响应体呢,如下

import requests

# 发送请求
r = requests.post('https://www.zhr.red/test/login.php', data='user=user&pwd=pwd')

# 响应头
r.headers

# 格式化输出响应头
for k, v in r.headers.items():
    print(k, ':', v)

# 响应体
r.text 

# 请求头
r.request.headers 

# 请求体
r.request.body
print(r.request.body.decode())

img


方法和参数

requests 给我们提供了7种请求方法,虽然没有提供全部9种,但是已经足够用了。下面提供了这些方法里面提供了那些参数

# http 请求方法 requests支持7种
requests.get(url, params=None)
requests.post(url, data=None)
requests.put()
requests.head()
requests.patch()
requests.delete()
requests.options()

#  参数
#  1. params :              字典或字节序列,作为参数增加到url中
#  2. data :                字典、字节序列、文件对象、(元组、列表)、字符串,作为Request的内容
#  3. json :                JSON格式的数据,作为Request的内容
#  4. headers :             字典,HTTP定制头
#  5. cookies :             字典或CookieJar,Request中的auth : 元组支持HTTP认证功能
#  6. files :               字典类型,传输文件
#  7. timeout :             设定超时时间,秒为单位
#  8. proxies :             字典类型,设定访问代理服务器,可以增加登录认证
#  9. stream :              True/False,默认为Flase,获取内容立即下载开关
# 10. verify :              True/False,默认为True,认证SSL证书开关
# 11. cert :                本地SSL证书
# 12. auth :                元组,支持HTTP认证功能
# 13. **kwargs:             控制访问参数,为可选项
# 14. allow_redirects :     True/False,默认为True,重定向开关

requests.request(方法, url)


定义请求参数

# 请求的url
url = "https://www.baidu.com/"

# 自定义请求头 会自动处理
headers = {
    "一个": "不区分",
    "大小写": "的字典",
}

# url的参数
params = {"可以是": "字典"}
params = "也可以是=字符串&aaa=aaa"  # 注意url编码

# 表单
# 使用字符串默认不指定Content-Type,需要自己手动设置
# 不用字符串虽然会指定Content-Type,但是他会自动url编码处理,可能会得不到你想要的的结果
data = "表单上传"
data = {"可以是": "字典"}
data = (("可以是", "元组"), ("k", "v"))
data = [["也可以时", "列表"], ["k", "v"]]  # 也可以是 列表元组的组合, 正常用字典
data = json.dumps("json数据")  # 记得导入json模块,  也可以直接用 json参数传入

# cookies
cookies = {"k": "v"}

# 代理
proxies = {
    "协议": "协议头://域名:端口", 
    "http": "http://ip:端口号", 
    "https": "https://ip:端口号",
}


发送请求

r = requests.post(
    url,
    params=params,
    data=data,
    headers=headers,
    cookies=cookies,
    files=files,
    proxies=proxies,
    timeout=3,
)


response属性

r.url                           '请求url'
r.text                          '响应实体文本  自动识别编码 可以指定'
r.links                         '响应头链接字段'
r.headers                       '响应头信息'
r.history                       '重定向历史'
r.cookies                       'cookie信息'
r.content                       '响应实体的二进制流'
r.encoding                      '编码'
r.status_code                   '状态码'
r.apparent_encoding             '通过调用chardet.detect()来识别文本编码'

r.request.url                   '请求url'
r.request.body                  '请求体'
r.request.method                '请求方法'
r.request.headers               '查看请求头'
r.request.path_url              'url的路径'

# 解决乱码
response.encoding = response.apparent_encoding


自定义请求头 headers

# 修改 User-Agent
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'}

# 修改 xxf
headers = {'X-Forwarded-For':'127.0.0.1'}

# 修改语言
headers = {'Accept-Language':'zh-CN'}

# 设置Content-Type,上传表单时用application/x-www-form-urlencoded
headers = {"Content-Type":"application/x-www-form-urlencoded"}

# xml 设置Content-Type 字段为  text/xml
`headers = {'Content-type':'text/xml'}`

# 发送请求时,加上 headers
r = requests.post(url, headers=headers)


Content-type 字段

常见的媒体格式类型如下:
    text/html : HTML格式
    text/plain :纯文本格式      
    text/xml :  XML格式
    image/gif :gif图片格式    
    image/jpeg :jpg图片格式 
    image/png:png图片格式

以application开头的媒体格式类型:
    application/xhtml+xml :XHTML格式
    application/xml     : XML数据格式
    application/atom+xml  :Atom XML聚合格式    
    application/json    : JSON数据格式
    application/pdf       :pdf格式  
    application/msword  : Word文档格式
    application/octet-stream : 二进制流数据(如常见的文件下载)
    application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:
    multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式


自定义请求头 Cookice

requests 设置 cookice 有三种办法如下

# 第一种直接加到 headers 里
headers = {'Cookie':'wordpress_test_cookie=WP+Cookie+check'}
r = requests.post(url, headers=headers)

# 第二种使用 cookice 字典传入
cookies={'wordpress_test_cookie':'WP+Cookie+check'}
r = requests.post(url, cookies=cookies)

# 第三种会话,后面讲


设置重定向开关

默认 requests 是自动帮你处理重定向的,如果你不想让他这么做就需要关闭它

>>> r = requests.get('http://github.com')

>>> r.url
'https://github.com/'

>>> r.status_code
200

# 我们可以通过 history 来查看重定向历史,虽然 status_code 显示200但是它是经过重定向的
>>> r.history
[<Response [301]>]
# 设置重定向关闭
>>> r = requests.get('http://github.com', allow_redirects=False)

# 这次就显示301了
>>> r.status_code
301
>>> r.history
[]


二进制流

对于图片压缩包这种二进制问题,requests 也给我们提供了相应的属性

# 二进制响应体
r = requests.get("http://47.93.27.54/images/2020/03/16/1.jpg")
r.content[-20:]

# 显示图片
from io import StringIO,BytesIO
from PIL import Image
im = Image.open(BytesIO(r.content))
im.show()

# raw 属性也可以实现,但是需要把stream设置成True


上传文件

上传文件需要一个字典,key是name,value的第一个值是filename、第二个值是文件内容、第三个值是Content-Type。

# 上传文件
files = {'file': ('info.php', open('info.jpg', 'rb'), 'image/jpg')}

# 多文件上传
files = [
    ('file', ('1.jpg', open('1.jpg', 'rb'), 'image/jpg')),
    ('file', ('2.jpg', open('2.jpg', 'rb'), 'image/jpg')),
]

# 需要submit的
files = [
    ('upload_file', ('info.php', open('info.jpg', 'rb'), 'image/jpeg')),
    ('submit',(None, '上传'))
]

r = requests.post("http://127.0.0.1/upload-labs-master/Pass-02/index.php", files=files)


Basic认证

requests 给出了很多基于web的身份认证,这里只说一下最简单的 Basic 基本认证

r = requests.get("http://58.87.104.234:7499/", auth=('admin', 'admin'))

# 把响应部分保存成文件
with open(r'f:/1.html', 'w') as f:
     f.write(r.text)
     f.close()

# 打开保存的网页
import webbrowser
webbrowser.open("file:///F:/1.html")

proxy代理

# http代理
proxies = {
  "http": "http://127.0.0.1:10800",
  "https": "http://127.0.0.1:10800",
}

# 需要Basic认证的
proxies = {
    "http": "http://user:pass@127.0.0.1:10800",
}

# sock代理需要安装模块
pip install requests[socks]

# sock5代理
proxies = {
    'http': 'socks5://127.0.0.1:1080',
    'https': 'socks5://127.0.0.1:1080',
}

r = requests.get("https://www.google.com.hk/", proxies=proxies)


会话

我们可以创建一个会话对象,来保持连接让cookice在多个请求中保持cookice,requests 也会自动更新cookice的。

# 创建一个 session 对象
s = requests.Session()

# 用这个会话去请求百度
r1 = s.get('https://www.baidu.com')
r2 = s.get('https://www.baidu.com')

# 可以看到cookice自动更新了
>>> r1.request.headers
{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
>>> r2.request.headers
{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'BDORZ=27315'}


# 不用会话的话他是不会保持会话的,每次请求都是新的一次会话
>>> r = requests.get('https://www.baidu.com')
>>> r.request.headers
{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}

>>> r = requests.get('https://www.baidu.com')
>>> r.request.headers
{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}


官方文档

https://2.python-requests.org/zh_CN/latest/



0
最后修改日期:2020年9月6日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。