python的接口请求可以用requests库,这个介绍就不多说了,网上说得很详细。
接下来直接记录下如何使用(当然也不限于自动化的使用)
1.安装requests
requests也需要安装一下
pip install requests
2.requests请求
1.常用的请求方法
接口请求通常有get/post/put/delete等类型,我们可以直接根据这种类型请求调用方法,例如:
requests.get(url='')
requests.post(url='', data='')
这里我自己写了个简单的服务,用于测试接口请求,如下图能正常请求到接口数据。
当然还有其他方法:
上面是用到哪个类型的请求调用哪个类型,当然也有统一的方法
requests.request(method='',url='') # :param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``.
在这个方法中传入method参数即可,要调用get接口,就传入‘GET’,要调用post接口,就传入‘POST’。
如上图所示,也能调用成功。
这里我们也可以看一下get方法的具体调用
其实就是get方法里调用了request方法,所有请求方法都是基于request方法的。
2.请求参数
这里附上request方法中注释,里面解释了各个参数的含义:
"""Constructs and sends a :class:`Request <Request>`.
:param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send
in the query string for the :class:`Request`.
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
object to send in the body of the :class:`Request`.
:param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
:param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
:param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
:param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload.
``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')``
or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content_type'`` is a string
defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers
to add for the file.
:param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
:param timeout: (optional) How many seconds to wait for the server to send data
before giving up, as a float, or a :ref:`(connect timeout, read
timeout) <timeouts>` tuple.
:type timeout: float or tuple
:param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``.
:type allow_redirects: bool
:param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
:param verify: (optional) Either a boolean, in which case it controls whether we verify
the server's TLS certificate, or a string, in which case it must be a path
to a CA bundle to use. Defaults to ``True``.
:param stream: (optional) if ``False``, the response content will be immediately downloaded.
:param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
:return: :class:`Response <Response>` object
:rtype: requests.Response
Usage::
>>> import requests
>>> req = requests.request('GET', 'https://httpbin.org/get')
>>> req
<Response [200]>
"""
这里简单介绍下:
参数 | 含义 |
---|---|
method | 方法,即是‘GET’、‘POST’或者其它 |
url | 请求URL |
params | 可选,查询参数,常见于接口url的?后跟的请求参数 |
data | 可选,接口请求的body |
json | 可选,接口请求中json化的body体 |
headers | 可选,接口请求的header |
cookies | 可选,接口请求的cookie |
files | 可选,文件参数,常用于上传文件的接口 |
auth | 可选,认证参数 |
timeout | 可选,请求最大等待时间,超时报错 |
allow_redirects | 可选,是否允许重定向,一般登录时重定向发生得比较多 |
proxies | 可选,可设置代理 |
verify | 可选,用于设置SSL证书验证。如果设置为False,将忽略SSL证书验证。 |
stream | 可选,设置下载的方式,如果设置为False,则整个文件将一次性下载下来 |
cert | 可选, 证书路径 |
具体类型的请求方法除了method 入参,其他参数基本都是一致的。
我们用得比较多的就是url、params、data、json、headers、cookies参数。这里简单介绍下,照样举一个get和post的例子。
我们实现一个get接口,根据params不同,返回不同的结果
params1 = {
'param1': 'test1',
'param2': 'test2'
}
get_res1 = requests.request(method='GET',url='http://ip:port/get/test1', params=params1)
我们直接在url中传也可以,但是这样有时候会不方便修改入参,看情况选取
get_res1 = requests.request(method='GET',url='http://ip:port/get/test1?param1=test1¶m2=test2')
接下来介绍下json和data的用法,它们都是用来传body体的。
我们主要介绍下需要传入json的body的情况,很多请求是需要请求body是json的格式,我们有如下方法:
1.使用data传入
header = {
'Content-Type': 'application/json'
}
data = {
'body_data1': 'test3',
'body_data2': 'test4'
}
post_res1 = requests.request(method='POST',url='http://ip:port/post/test1', headers=header, data=json.dumps(data))
注意header和json.dumps(data))缺一不可
2.使用json传入
data = {
'body_data1': 'test3',
'body_data2': 'test4'
}
post_res1 = requests.request(method='POST',url='http://ip:port/post/test1', json=data)
可以看到使用json时,我们无需在headers里注明Content-Type,它自动传入的就是json格式的。
总结如下:
1.当使用json时,如果不指定headers中的content-type,默认为application/json。
2.data为dict时,如果不指定content-type,默认为application/x-www-form-urlencoded,相当于普通form表单提交的形式;如果需要传json格式,需要在headers里指明对应的Content-Type。
如果我们是要传json格式的body体,直接用json比较方便,如果是其他格式,则我们选用data传参;实际使用时按个人实际需要选取。
还有比较常用的header和cookie,这些主要涉及到安全方面,后面爬虫的时候再细说。
3.requests响应
每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息,如状态码、响应头、响应内容等,下方列举了一些常见的响应信息:
参数 | 含义 |
---|---|
ok | 检查 “status_code” 的值,如果小于400,则返回 True,如果不小于 400,则返回 False |
is_redirect | 如果响应被重定向,则返回 True,否则返回 False |
is_permanent_redirect | 如果响应是永久重定向的 url,则返回 True,否则返回 False |
next | 返回重定向链中下一个请求的 PreparedRequest 对象 |
apparent_encoding | 编码方式 |
iter_content | 迭代响应 |
iter_lines | 迭代响应的行 |
content | 返回响应的内容,以字节为单位 |
text | 返回响应的内容,unicode 类型数据 |
json | 返回结果的 JSON 对象 (结果需要以 JSON 格式编写的,否则会报错) |
links | 返回响应的解析头链接 |
raise_for_status | 如果发生错误,方法返回一个 HTTPError 对象 |
close | 释放与连接池的连接 |
cookies | 返回一个 CookieJar 对象,包含了从服务器发回的 cookie |
headers | 返回响应头,字典格式 |
status_code | 返回 http 的状态码,比如 200 |
调用时直接.一下对应的方法即可,我们比较常用的就是status_code,headers,cookies,text,content等
到这里就是requests的简单运用了,当然实际情况一般比举的例子要复杂,使用时也需要进行进一步的封装。这个后面接着来…