在Python中,处理HTTP请求的一个非常流行且易于使用的库是requests。这个库使得发送HTTP请求变得非常简单,不需要手动添加查询字符串到URL中。本文将带了解requests库的各种特性,以及如何发送GET和POST请求。
首先,需要在系统中安装pipenv,然后执行以下命令来安装requests库:
$ pip install requests
HTTPGET请求通常用于从服务器检索数据。从请求中接收到的内容可以用来渲染从API检索的数据列表,或者根据查询字符串过滤产品列表。
语法如下:
import requestsr = requests.get(url)
要创建一个GET请求,首先导入requests库,然后创建一个响应对象‘r’。将‘URL’传递给get函数。响应对象‘r’将包含从URL接收到的所有信息。例如:
import requestsr = requests.get('https://en.wikipedia.org/wiki/Wikipedia')print(r)
在URL中传递参数:
URL参数用于动态地向页面发送额外信息。首先创建一个包含键值对的字典,然后将字典传递给params关键字参数,如下例所示:
payload = {"Name": "Harry", "location": "USA"}r = requests.get("https://httpbin.org/get", params=payload)
POST请求通常用于发送表单数据或上传文件。POST请求旨在创建或更新资源,并允许在一次请求中发送更多的内容。
语法如下:
import requestspayload = {key1: value1, key2: value2}response = requests.post(url, data=payload)
首先,导入requests库,然后使用Post()请求方法传递数据。最后,将数据和URL一起传递。通过POST请求传递的字典将被发送到服务器。例如:
payload = {'title': "john", 'body': "John is an engineer", 'id': 101}res2 = requests.post('https://httpbin.org/post', data=payload)print(res2.text)
可以使用requests库轻松上传文件。
import requestsfiles = {'file': open('/content/data1.txt', 'rb')}r = requests.post('https://httpbin.org/post', files=files)
状态码:
状态码让了解请求的状态。服务器对客户端的请求发出响应时会附带状态码。要访问状态码,使用status_code关键字,如下所示:
r.status_code
HTTP状态码:
1xx范围内的状态码表示响应是信息性的。如果是2xx范围内的,表示请求成功。在这个范围内,如果是200,表示OK,201表示Created,202表示Accepted,等等。同样,301表示永久移动,400是Bad Requests,401是未授权,500是内部服务器错误等。
要访问字节(非文本)形式的响应内容,使用:
print(r.content)
要查看字符串或文本形式的响应,使用:
print(r.text)
requests库有一个内置的JSON解码器,用于处理从服务器响应中发送的JSON内容。JSON解码器允许将JSON响应解析为Python对象。JSON格式的数据以名称和值对的形式存储,用逗号分隔。花括号表示对象,方括号定义数组。
import requestsr = requests.get('https://api.coinbase.com/v2/currencies')data = r.json()print(data)
要打印第一个元素,使用:
print(data['data'][0])
当向服务器发出请求时,响应对象包含传递请求中额外信息的头。一个常见的头是content-type头,它指示资源的媒体类型。让看看之前例子中创建的响应对象的头(JSON)。
print(r.headers['Content-Type'])
观察到content-type的媒体类型是“application/JSON”。其他一些常见的媒体类型包括“text/plain”,“text/javascript”和“multipart/form-data”。当调用headers函数时,它会返回响应对象中的所有头的字典。
也可以为POST请求创建自定义头,如下所示:
headers = {'content-type': 'text/javascript'}r = requests.post('https://httpbin.org/post', headers=headers)print(r.request.headers)
requests库允许创建和读取服务器的HTTP cookies。Cookie是服务器发送到用户Web浏览器的一小块数据。
cookies = {'Status': 'Active'}r = requests.get('https://httpbin.org/cookies', cookies=cookies)print(r.text)
RequestsCookieJar是一种特殊形式的字典,允许自定义发送cookies的位置。Cookies在RequestsCookiesJar中返回。让看一个例子:
jar = requests.cookies.RequestsCookieJar()jar.set('location', 'India', domain='httpbin.org', path='/cookies')jar.set('Name', 'Harry', domain='httpbin.org', path='/profile')r = requests.get('https://httpbin.org/cookies', cookies=jar)print(r.text)
有时请求可能不成功。可以通过查看status_code来确定响应是否成功。另一个常见的异常是Timeout异常,这就是为什么为每个请求定义超时值是一个好习惯,因为它可以防止程序因为服务器无响应而挂起。
response.raise_for_status()
会话用于存储个别用户的数据。创建一个会话对象,可以用来在服务器上设置cookies。只要这个会话对象存在,cookies就会在多个请求之间持久保存数据。
import requests# 创建一个会话对象s = requests.Session()cookies = {'location': 'India'}r = s.get('https://httpbin.org/cookies/set', params=cookies)# 获取所有cookiesr = s.get('https://httpbin.org/cookies')print(r.text)
本文是一个关于Python中requests库的完整指南。学习了如何使用不同的HTTP方法(如GET和POST)向服务器发送基本请求。还学习了如何自定义头和传递不同的cookies。最后,学习了如何使用会话进行请求。简而言之,requests库使得人类非常容易地处理HTTP请求。