在Python中,通过GET请求从服务器获取数据是常见的网络操作,广泛应用于API调用、网页爬虫、数据采集等场景,GET请求的特点是将参数附加在URL后面,适用于查询数据等不改变服务器资源的操作,Python提供了多种库来实现GET请求,其中最常用的是requests库,它简洁易用且功能强大,本文将详细介绍如何使用Python通过GET请求与服务器交互,包括基本用法、参数传递、响应处理及错误处理等内容。

确保已安装requests库,如果未安装,可通过pip命令安装:pip install requests,安装完成后,即可在代码中导入该库,发送GET请求的基本语法非常简单,例如获取一个网页的HTML内容,只需调用requests.get()方法并传入目标URL。response = requests.get('https://example.com'),这里response对象包含了服务器返回的所有信息,如状态码、响应头、响应内容等,状态码response.status_code用于判断请求是否成功,常见的200表示成功,404表示资源未找到,500表示服务器内部错误等。
在实际应用中,GET请求常需要传递参数,参数可以通过URL查询字符串传递,也可以使用params参数动态添加,向https://api.example.com/data发送请求并传递key1=value1和key2=value2两个参数,可直接构造URL:https://api.example.com/data?key1=value1&key2=value2,或使用字典形式通过params参数传递:params = {'key1': 'value1', 'key2': 'value2'},然后调用requests.get('https://api.example.com/data', params=params)。requests库会自动对参数进行URL编码,确保特殊字符(如空格、中文)的正确传输。
服务器返回的响应内容可以通过response.text获取字符串形式的数据,或通过response.json()解析JSON格式的数据(如果响应内容是JSON),假设服务器返回JSON数据:{"name": "Alice", "age": 30},则可通过data = response.json()解析为Python字典,方便后续处理。response.content可获取二进制数据,适用于下载图片、文件等场景;response.headers则可查看响应头信息,如服务器类型、内容编码等。
处理网络请求时,错误处理至关重要。requests库提供了多种异常类,如requests.exceptions.RequestException是所有请求异常的基类,requests.exceptions.ConnectionError表示连接错误,requests.exceptions.Timeout表示请求超时等,可通过try-except捕获异常,try: response = requests.get(url, timeout=5) response.raise_for_status() except requests.exceptions.RequestException as e: print(f"请求失败: {e}")。raise_for_status()会在状态码不为200时抛出异常,简化错误判断逻辑。

有时,请求需要添加请求头(Headers)以模拟浏览器行为或满足服务器要求,设置User-Agent头:headers = {'User-Agent': 'Mozilla/5.0'},然后调用requests.get(url, headers=headers),常见的请求头还包括Authorization(用于身份验证)、Accept(指定可接受的响应格式)等,对于需要身份验证的API,可通过auth参数传递用户名和密码,requests.get(url, auth=('username', 'password')),或使用OAuth2等更复杂的认证方式。
下表总结了requests.get()常用参数及其作用:
| 参数 | 类型 | 作用 |
|---|---|---|
| url | str | 目标服务器地址 |
| params | dict | URL查询参数 |
| headers | dict | 请求头信息 |
| auth | tuple | 身份验证信息 |
| timeout | float | 请求超时时间(秒) |
| cookies | dict | Cookie信息 |
在性能优化方面,可使用Session对象复用TCP连接,减少握手开销。with requests.Session() as session: response = session.get(url),适用于频繁请求同一服务器的场景,可通过stream=True参数流式下载大文件,避免内存占用过高:response = requests.get(url, stream=True) for chunk in response.iter_content(chunk_size=8192): process(chunk)。
相关问答FAQs:

Q1: 如何处理GET请求中的中文参数?
A: requests库会自动对参数进行URL编码,因此直接传递中文参数即可。params = {'name': '张三'},requests.get(url, params=params)会自动将“张三”编码为%E5%BC%A0%E4%B8%89,若需手动编码,可使用urllib.parse.quote()函数。
Q2: GET请求与POST请求的主要区别是什么?
A: GET请求将参数附加在URL后,适用于查询数据,有长度限制且不安全(参数可见);POST请求将数据放在请求体中,适用于提交数据,无长度限制且相对安全,Python中可通过requests.post(url, data=data)发送POST请求。
