Python 中的 requests 模块是一个简洁而强大的 HTTP 库,用于向 Web 服务器发送 HTTP 请求和处理响应。它让开发者能够更轻松地与网络资源进行交互,包括发送 GET、POST、PUT、DELETE 等类型的请求,并处理返回的数据。
以下是 Python requests 模块的一些特点:
- 简洁易用:requests 提供了简单且直观的 API,使得发送 HTTP 请求变得非常容易。
- 功能丰富:支持各种类型的 HTTP 请求,包括身份验证、会话管理、重定向、文件上传等功能。
- 自动化处理:requests 自动处理连接池、内容解码、cookies 管理等,简化了开发过程。
- 优秀的文档:requests 拥有清晰详尽的文档和示例,便于开发者学习和使用。
下面将详细讲解Requests
模块的一些主要功能。
1.介绍Requests模块
Requests
是一个优雅、简洁而又功能强大的Python HTTP库。要使用该模块,首先我们需要安装它:
pip install requests
2.发送GET请求
通过get()
方法可以发送GET请求并获取服务器响应:
import requests response = requests.get('https://api.example.com') print(response.text)
3.发送POST请求
post()
方法可用于发送POST请求:
import requests data = {'key': 'value'} response = requests.post('https://api.example.com/post', data=data) print(response.json())
4.处理响应
处理响应可以通过访问响应头、获取JSON响应、文本响应甚至二进制响应:
import requests response = requests.get('https://api.example.com') print(response.headers) print(response.json()) print(response.text) print(response.content)
5.处理Headers
可以添加自定义Headers或设置Cookies:
import requests headers = {'User-Agent': 'Mozilla/5.0'} cookies = {'session_id': '123456789'} response = requests.get('https://api.example.com', headers=headers, cookies=cookies)
6.处理状态码和错误
检查状态码并进行错误处理:
import requests response = requests.get('https://api.example.com') if response.status_code == 200: print("Request was successful") else: print("An error occurred")
7.会话对象
使用Session对象可以在多个请求之间保持会话信息:
import requests session = requests.Session() session.get('http://example.com/login', params={'username': 'user', 'password': 'pass'}) response = session.get('http://example.com/dashboard')
8.高级用法
可以设置SSL证书验证、代理以及超时:
import requests response = requests.get('https://api.example.com', verify='path/to/cert.pem', proxies={'http': 'http://proxy.example.com'}, timeout=5)
9.扩展功能
Requests
可以与第三方库结合来实现更多功能,比如使用grequests
进行异步请求:
import grequests urls = ['http://example.com', 'http://example.org'] requests = (grequests.get(url) for url in urls) responses = grequests.map(requests)
10.文件上传
import requests url = 'http://example.com/upload' files = {'file': open('example.txt', 'rb')} response = requests.post(url, files=files) print(response.text)
在这个示例中,我们使用 requests.post
方法发送POST请求,并通过 files
参数将文件上传到指定的URL。这里的 'file'
是表单字段的名称,'example.txt'
是要上传的文件名。
11.文件下载
import requests url = 'http://example.com/download/example.pdf' response = requests.get(url) with open('example.pdf', 'wb') as file: file.write(response.content) print("File downloaded successfully!")
在这个示例中,我们使用 requests.get
方法向指定URL发送 GET 请求以下载文件。通过 response.content
我们可以获取服务器响应内容,并在本地创建一个新文件将其写入。
12.高频面试题
面试题:使用 Python 的 requests 模块实现并发请求
要求:使用 requests 模块以非阻塞方式实现并发的 GET 请求,并在请求完成后打印响应状态码。
答案:
import requests import concurrent.futures # 要请求的 URL 列表 urls = ['http://example.com', 'http://example.org', 'http://example.net'] def fetch_url(url): response = requests.get(url) return url, response.status_code # 使用线程池实现并发请求 with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor: # 提交每个 URL 的请求任务 future_to_url = {executor.submit(fetch_url, url): url for url in urls} for future in concurrent.futures.as_completed(future_to_url): url = future_to_url[future] try: url, status_code = future.result() print(f"{url} - Status Code: {status_code}") except Exception as e: print(f"{url} - Error: {e}")
在这个面试题中,我们首先定义了要请求的多个 URL,然后使用 concurrent.futures.ThreadPoolExecutor
创建了一个线程池,最大工作线程数为 3。接着,我们提交了每个 URL 的请求任务,并通过 concurrent.futures.as_completed
方法获取每个请求的结果,最后打印出每个 URL 对应的响应状态码。
这个问题考察了对并发编程和异步请求的理解,以及如何使用 requests 模块进行非阻塞的并发请求操作。