简单例子
# 发送 get 请求
url = 'https://www.baidu.com'
res = requests.get(url)
print(res.text)
安装
pipe install requests
请求方法
get
get(url, params=None, **kwargs)
# 不带参数
get('https://huaban.com/search')
# 带参数
params = { 'q': '赛博朋克' }
get(url, params)
post
post(url, data=None, json=None, **kwargs)
# 无参数
url= '...'
# data 可以为字典 or 元组
# data 为dict字典
dict_data = {'name': 'coco', 'age': 12}
post(url, data=dict_data)
# data 为元组列表
tulp_data = (('name', 'coco'), ('age', 12))
post(url, data=tulp_data)
# 接收json数据
post(url, data=json.dumps(dict_data))
# 直接使用json字段
post(url, json=dict_data)
# 文件上传
def_files = {'file': open('test.text', 'rb')}
post(url, files = def_files)
# 设置文件信息
name_files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
post(url, files = name_files)
options
options(url, **kwargs)
options('http://httpbin.org/get')
head
head(url, **kwargs)
head('http://httpbin.org/get')
put
put(url, data=None, **kwargs)
put('http://httpbin.org/put', data = {'key':'value'})
patch
patch(url, data=None, **kwargs)
put('http://httpbin.org/patch', data = {'key':'value'})
delete
delete(url, **kwargs)
delete('http://httpbin.org/delete')
request
基础请求函数, 其他请求方法都是该方法的包装函数
request (self, method, url, params=None, data=None, headers=None, cookies=None, files=None, auth=None, timeout=None, allow_redirects=True, proxies=None, hooks=None, stream=None, verify=None, cert=None, json=None)
# get 请求函数
res = request('get', 'https://www.baidu.com', params={'id': 'xxx'})
获取响应内容
res = get('https://www.baidu.com')
# 文本格式内容
text_content = res.text
# json内容
json_content = res.json
# 二进制内容
byte_content = res.content
# buff流
res = get('https://www.baidu.com', stream=True)
# 读取指定长度内容
r.raw.read(100)
# 读取全部内容
r.raw.read()
响应状态码
r = requests.get('http://httpbin.org/get')
# 获取状态码
print(r.status_code)
# 捕获请求错误, 例如: 404,500 等
r = post('https://www.baidu.com/api')
try:
# 如果请求错误,将抛出异常
r.raise_for_status()
except Exception as e:
print('ERROR: ', e)
内置预设状态码
from requests import get, codes
r = requests.get('http://httpbin.org/get')
print(r.status_code === codes.ok)
codes 列表
codes = {
# Informational.
100: ('continue',),
101: ('switching_protocols',),
102: ('processing',),
103: ('checkpoint',),
122: ('uri_too_long', 'request_uri_too_long'),
200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'),
201: ('created',),
202: ('accepted',),
203: ('non_authoritative_info', 'non_authoritative_information'),
204: ('no_content',),
205: ('reset_content', 'reset'),
206: ('partial_content', 'partial'),
207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'),
208: ('already_reported',),
226: ('im_used',),
# Redirection.
300: ('multiple_choices',),
301: ('moved_permanently', 'moved', '\\o-'),
302: ('found',),
303: ('see_other', 'other'),
304: ('not_modified',),
305: ('use_proxy',),
306: ('switch_proxy',),
307: ('temporary_redirect', 'temporary_moved', 'temporary'),
308: ('permanent_redirect',
'resume_incomplete', 'resume',), # These 2 to be removed in 3.0
# Client Error.
400: ('bad_request', 'bad'),
401: ('unauthorized',),
402: ('payment_required', 'payment'),
403: ('forbidden',),
404: ('not_found', '-o-'),
405: ('method_not_allowed', 'not_allowed'),
406: ('not_acceptable',),
407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),
408: ('request_timeout', 'timeout'),
409: ('conflict',),
410: ('gone',),
411: ('length_required',),
412: ('precondition_failed', 'precondition'),
413: ('request_entity_too_large',),
414: ('request_uri_too_large',),
415: ('unsupported_media_type', 'unsupported_media', 'media_type'),
416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'),
417: ('expectation_failed',),
418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),
421: ('misdirected_request',),
422: ('unprocessable_entity', 'unprocessable'),
423: ('locked',),
424: ('failed_dependency', 'dependency'),
425: ('unordered_collection', 'unordered'),
426: ('upgrade_required', 'upgrade'),
428: ('precondition_required', 'precondition'),
429: ('too_many_requests', 'too_many'),
431: ('header_fields_too_large', 'fields_too_large'),
444: ('no_response', 'none'),
449: ('retry_with', 'retry'),
450: ('blocked_by_windows_parental_controls', 'parental_controls'),
451: ('unavailable_for_legal_reasons', 'legal_reasons'),
499: ('client_closed_request',),
# Server Error.
500: ('internal_server_error', 'server_error', '/o\\', '✗'),
501: ('not_implemented',),
502: ('bad_gateway',),
503: ('service_unavailable', 'unavailable'),
504: ('gateway_timeout',),
505: ('http_version_not_supported', 'http_version'),
506: ('variant_also_negotiates',),
507: ('insufficient_storage',),
509: ('bandwidth_limit_exceeded', 'bandwidth'),
510: ('not_extended',),
511: ('network_authentication_required', 'network_auth', 'network_authentication'),
}
响应头
响应头为字典类型, 不区分大小写
设置request响应头
url = '...'
headers = {'user-agent': 'my-app/0.0.1'}
r = get(url, headers=headers)
查看response响应头
url= 'https://www.baidu.com'
r = get(url)
# 显示全部字段
print(r.headers)
# 查询指定字段
print(r.headers.get('Content-Type'))
cookie
设置request cookie
url= 'https://www.baidu.com'
cookies = dict(
id='xxx',
name='yyy'
)
r = get(url,cookies=cookies)
获取response cookie
url= 'https://www.baidu.com'
r = get(url,cookies=cookies)
print(r.cookies, type(r.cookies))
# <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]> <class 'requests.cookies.RequestsCookieJar'>
print(dict(r.cookies))
# {'BDORZ': '27315'}
print(r.cookies.get('BDORZ'))
# 27315
history 历史记录
Requests 将自动处理重定向, history 收集了重定向的请求体
r = get(url,cookies=cookies)
print(r.history)
# []
# 无重定向时,列表为空
timeout 请求超时
# 设置请求超时时长
get('http://github.com', timeout=0.001)
网友评论