安装
pip install requests
get请求
import requests
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s-%(filename)s-%(funcName)s-%(levelname)s\n%(message)s')
base_url = "https://www.baidu.com/s"
headers = {
"accept": r"application/json, text/javascript, */*; q=0.01",
"accept-language": r"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"user-agent": r"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 Edg/146.0.0.0",
# 这里可以配置cookie(不推荐)
# "cookie":r"_EDGE_V=1; MUID=2889D574C107.......15B1AE0B0AEA"
}
# 单独配置cookie
cookies = {
"token": "jdshfsdjgvjsdfkl"
}
params = {
"wd": "迷你世界"
}
response = requests.get(base_url, params=params, cookies=cookies, headers=headers, timeout=10)
post请求
import requests
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s-%(filename)s-%(funcName)s-%(levelname)s\n%(message)s')
def requests_post1():
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post("http://httpbin.org/post", data=payload, timeout=20)
logging.info(response.text)
def requests_post2():
# 编码为JSON的POST/PATCH请求数据
import json
response = requests.post('https://api.github.com/some/endpoint', data=json.dumps({'some': 'data'}))
logging.info(response.text)
def requests_post3():
"""
上传文件
"""
files = {'file': open('report.xls', 'rb')}
response = requests.post('http://httpbin.org/post', files=files)
logging.info(response.text)
如果你发送一个非常大的文件作为
multipart/form-data请求,你可能希望将请求做成数据流。默认下requests不支持, 但有个第三方包requests-toolbelt是支持的。你可以阅读 toolbelt 文档 来了解使用方法。
响应内容
| 内容 | 代码 | 备注 |
|---|---|---|
| 传递 URL 参数 | response.url | |
| 响应内容 | response.text | |
| 二进制响应内容 | response.content | |
| JSON 响应内容 | response.jso() | |
| 判断是否响应成功 | response.raise_for_status() | 成功返回None。失败就报错 |
| 响应状态码 | status_code | |
| 响应头 | headers | 字典类型 |
session会话
会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持(如 cookies、headers、auth)复用共享。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用。
import requests
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s-%(filename)s-%(funcName)s-%(levelname)s\n%(message)s')
def requests_session():
add_cookies_url = r"http://httpbin.org/cookies/set/sessioncookie/123456789"
base_url = r"http://httpbin.org/cookies"
session = requests.Session()
session.get(add_cookies_url)
response = session.get(base_url)
logging.info(response.text)
会话也可用来为请求方法提供缺省数据。这是通过为会话对象的属性提供数据来实现的:
session = requests.Session()
# 为该会话设置基本认证(Basic Auth)此后通过这个对象发出的所有请求,都会自动在 HTTP 头部包含经过 Base64 编码的用户名和密码,除非在单个请求中显式覆盖它。
session.auth = ('user', 'pass')
# 更新会话的默认头部信息。
session.headers.update({'x-test': 'true'})
# both 'x-test' and 'x-test2' are sent
session.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
合并机制:requests 库在发送请求时,会将会话级头部与请求级头部合并。这意味着最终发出的请求将同时包含 x-test: true(来自会话)和 x-test2: true(来自本次 get 请求)。
单例模式获得session
import requests
class SessionClient():
_instance = None
session = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__new__(cls)
cls.session = requests.Session()
return cls._instance
@classmethod
def get_session(cls):
return cls.session