python requests 提交表单模块学习

310 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

经自己学习摸索,和许多大佬的博客以及官方文档中整理的来,如有问题,请各位大佬不吝赐教,仍有许多部分未完整,未写部分是本人没实验出结果,并且在网上找不到具体资料的,以下内容属本人学习资料,若能帮上您,那我表示非常荣幸

0x01 什么是requests

Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。

警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。

Requests 允许你发送纯天然,植物饲养的 HTTP/1.1 请求,无需手工劳动。你不需要手动为 URL 添加查询字串,也不需要对 POST 数据进行表单编码。Keep-alive 和 HTTP 连接池的功能是 100% 自动化的,一切动力都来自于根植在 Requests 内部的 urllib3

​ from Requests: 让 HTTP 服务人类 — Requests 2.18.1 文档 (python-requests.org)

来自生草的官方文档,总之,这个库就是可以更方便的帮助我们进行诸如发送表单一类的http测试

0x02 安装模块

pip install requests
#进行安装
import repuests
# 导入模块

0x03先通过get方法来熟悉一下requests吧

get模块是我们一般在爬虫中最常使用的请求模块我们通过这一块来从表层稍微熟悉一下requests模块

  • GET 请求: 访问某个网页前不需要在浏览器里输入链接之外的东西,因为我们只是想向服务器获取一些资源,可能就是一个网页。

现在我们来尝试一下,尝试访问一个网页

import requests

url=‘https://cn.bing.com’
#    输入想要访问的网页

res = requests.get(url)
# requests.get方法是向目标网址发送一个请求
# 并用res变量接收get的返回包

print(type(tes))
# 此处打印结果是 class 'requests.models.Response' 即一个对象类型

此处返回值是一个对象那么它有什么对应的方法和属性呢?

属性功能例子
Response.status_code检查请求是否成功200 代表正常,404 代表网页不存在。
Response.encoding定义编码如果编码不对,网页就会乱码的。
Response.content把数据转成二进制用于获取图片、音频类的数据。
Response.text把数据转为字符串用于获取文本、网页原代码类的数据。
Response.cookie查看cookie用来查看服务器的相应cookie,便于某些需要登录的网页
Response.headers获取服务器响应头获取响应头,某些网页有做反爬,需要模拟浏览器的头部来反~反爬

可以发现,当我们目的是为了请求下来并保存的时候就需要对应情况选择是使用.text还是.content,当然,注意在把获取的资料录入文件之前要先定义编码格式,比如说utf-8,gbk之类的

那么我们来进行使用get请求获取一个网页的完整流程

import requests
# 引入 requests,实现请求

URL = 'https://cn.bing.com'
# 输入在浏览器的网址

res = requests.get(URL)
# 发送 GET 方式的请求,并把返回的结果(响应)存储在 res 变量里头

res.encoding = 'utf-8'
# 设置可接收的编码为 utf-8

file = open('bing.txt', 'a+')
# 创建一个名为bing的txt文档,指针放在文件末尾,追加内容。(Python 基础语法)

file.write(res.text)
# 将把 Reponse 对象的内容以 [字符串] 的形式写入文件


file.close()
# 关闭文档

0x04 请求方法

好了,我们通过上面的例子已经对requests模块有了一个初步了解,从这一块开始我们正式开始逐步了解这个模块

requests模块一共包含六个请求模块

  • res = requests.get ()
  • res = requests.post ()
  • res = requests.put ()
  • res = requests.delete ()
  • res = requests.head ()
  • res = requests.options ()
  • res = requests.session()

其中我们最常用的就是get和post两个请求方式

其中get函数我们在上面的例子中已经有了一些初步的应用

具体关于post方法的实践模拟可以看一下我的这篇文章

python小脚本与数据库联动实现大量自动上报体温 - Hello G&L

除了上面的一些关于post方法的用法外,这里我们还要一起学习一些别的post有关的想法

post中data参数,不知可以提交字符串,还可以提交许多其他的文件格式

post提交json请求

import requests
2 import json
3  
4 r = requests.post('https:www.baidu.com', data=json.dumps({'some': 'data'}))
5 print(r.json())

POST提交参数

host = "http://httpbin.org/"
endpoint = "post"
 
url = ''.join([host,endpoint])
params = {'key1':'params1','key2':'params2'}
 
# r = requests.post(url)
r = requests.post(url,params=params)

普通文件上传

host = "http://httpbin.org/"
endpoint = "post"
 
url = ''.join([host,endpoint])
#普通上传
files = {
            'file':open('test.txt','rb')
        }
 
r = requests.post(url,files=files)

定制文件上传

host = "http://httpbin.org/"
endpoint = "post"
 
url = ''.join([host,endpoint])
#自定义文件名,文件类型、请求头
files = {
        'file':('test.png',open('test.png','rb'),'image/png')
}
 
r = requests.post(url,files=files)

多文件上传

host = "http://httpbin.org/"
endpoint = "post"
 
url = ''.join([host,endpoint])
#多文件上传
files = [
    ('file1': ('test.txt',open('test.txt', 'rb'))),
    ('file2': ('test.png', open('test.png', 'rb')))
    ]
 
r = requests.post(url,files=files)

流式上传

host = "http://httpbin.org/"
endpoint = "post"
 
url = ''.join([host,endpoint])
 
#流式上传
with open( 'test.txt' ) as f:
    r = requests.post(url,data = f)

这里session为会话对象

与目标服务器建立会话并保持

可以跨请求保持某些参数

s = requests.Session()
s.auth = ('auth','passwd')
s.headers = {'key':'value'}
r = s.get('url')
r1 = s.get('url1') 

0x05 方法期待参数

image-20211105194905106.png

我们来依次介绍这些参数的作用

代理(proxies):

该参数可以对任意请求添加

# 直接
proxies = {"http" : “http://123.123.123.123”}
request.post("www.baidu.com" , proxies = proxies)

重定向处理(allow_redirects):

这个函数就是可以选择是否同意网页的重定向,选择只会选false即不同意重定向,默认为同意,即不用在意那个true

超时(timeout):

设定超时时间,单位为秒,只对连接有效

r = requests.get('url',timeout=1)    

get请求参数(param):

这个参数尽管说是get的请求参数,但是可以在post或者put中使用,这个参数的本质是把请求的主体部分放在url中,故可以在某些使用url来提交的场景下使用

证书验证(verify):

这个东西,有些时候会报错,默认为需要验证,不需要的时候添加参数该false就行