requests
是Python中一个非常流行的用于发送HTTP请求的库。它允许你发送HTTP/1.1请求,极其简单,功能强大。
基本用法
以下是一个简单的使用requests
的例子:
import requests
# 发送GET请求
response = requests.get('http://www.example.com')
# 输出响应的文本
print(response.text)
# 输出响应的状态码
print(response.status_code)
在上面的例子中,我们首先导入了requests
模块,然后使用get
函数发送了一个GET请求到www.example.com
。然后我们打印了服务器返回的响应文本和状态码。
requests
库还可以发送POST请求,并且可以携带数据:
import requests
# 发送POST请求
response = requests.post('http://www.example.com', data = {'key':'value'})
# 输出响应的文本
print(response.text)
在这个例子中,我们使用post
函数发送了一个POST请求,并且携带了一个字典作为数据。
requests
库还支持会话,可以保持某些参数,例如cookies,对于需要登录的网站非常有用:
import requests
# 创建一个session对象
s = requests.Session()
# 发送GET请求
s.get('http://www.example.com')
# 发送POST请求
s.post('http://www.example.com', data = {'key':'value'})
在这个例子中,我们首先创建了一个Session
对象,然后使用这个对象发送GET和POST请求。这样,requests
会自动处理cookies和其他会话相关的参数。
进阶用法
requests
库更高级的用法:
-
处理JSON:如果你的API返回的是JSON格式的数据,你可以直接通过
.json()
方法解析它:import requests response = requests.get('http://www.example.com') data = response.json() print(data)
-
上传文件:你可以使用
requests
库来上传文件:import requests url = 'http://www.example.com' files = {'file': open('path_to_file', 'rb')} response = requests.post(url, files=files)
-
处理重定向:默认情况下,
requests
会自动处理重定向。但是,你也可以选择关闭这个功能:import requests response = requests.get('http://www.example.com', allow_redirects=False)
-
处理认证:你可以使用
requests
库来处理HTTP认证:import requests response = requests.get('http://www.example.com', auth=('username', 'password'))
-
设置超时:你可以设置请求的超时时间,如果服务器在指定的时间内没有响应,
requests
会抛出一个Timeout
异常:import requests response = requests.get('http://www.example.com', timeout=5)
-
设置代理:你可以使用
requests
库来设置代理:import requests proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', } response = requests.get('http://www.example.com', proxies=proxies)
-
使用Cookies:你可以使用
requests
库来处理Cookies:import requests cookies = dict(cookies_are='working') response = requests.get('http://www.example.com', cookies=cookies)
-
自定义Headers:你可以添加或修改请求头信息。
headers = {'User-Agent': 'Mozilla/5.0'} response = requests.get('http://www.example.com', headers=headers)
-
流式下载:对于大文件,如视频、音频等,你可以使用流式下载,避免一次性加载整个文件到内存中。
response = requests.get('http://www.example.com/file.mp4', stream=True) with open('file.mp4', 'wb') as f: for chunk in response.iter_content(chunk_size=1024): if chunk: # filter out keep-alive new chunks f.write(chunk) f.flush()
-
SSL验证:你可以选择是否对HTTPS请求进行SSL证书验证,或者指定自己的证书。
response = requests.get('https://www.example.com', verify=False) # 或者使用自己的证书 response = requests.get('https://www.example.com', cert=('/path/server.crt', '/path/key'))
-
连接池与适配器:
requests
库允许你使用连接池和适配器,这可以提高性能。from requests.adapters import HTTPAdapter s = requests.Session() s.mount('http://', HTTPAdapter(max_retries=3))
-
异步请求:虽然
requests
库本身不支持异步请求,但你可以使用requests-async
库来实现异步请求。 -
错误处理:
requests
库提供了一些异常类,你可以使用它们来处理网络错误、超时、重定向等问题。 -
处理HTTP错误状态:当服务器返回一个非200的HTTP状态码时,
requests
会抛出一个HTTPError
异常。你可以捕获这个异常并处理它。try: response = requests.get('http://www.example.com') response.raise_for_status() # 如果响应状态码不是200,将抛出HTTPError异常 except requests.exceptions.HTTPError as err: print(err)
-
使用环境变量:
requests
可以使用环境变量中的代理和证书。os.environ['http_proxy'] = 'http://10.10.1.10:3128' os.environ['https_proxy'] = 'http://10.10.1.11:1080' response = requests.get('http://www.example.com')
-
使用CookieJar:
requests
使用CookieJar
对象来处理cookie,你可以创建自己的CookieJar
对象并将其传递给requests
。from requests.cookies import RequestsCookieJar jar = RequestsCookieJar() jar.set('tasty_cookie', 'yum', domain='www.example.com', path='/') jar.set('gross_cookie', 'blech', domain='www.example.com', path='/') response = requests.get('http://www.example.com', cookies=jar)
-
使用Event Hooks:
requests
提供了事件钩子,你可以在请求的不同阶段执行自定义的函数。def print_response(resp, *args, **kwargs): print("Response was received!") return resp response = requests.get('http://www.example.com', hooks=dict(response=print_response))
-
使用Session对象:
Session
对象可以保存某些参数,如cookies,对于需要登录的网站非常有用。而且,Session
对象可以复用底层的TCP连接,这对于同一域名下的多个请求来说,可以提高效率。
生在此侧,死在彼侧。我在此侧,不在彼侧。