目录
HTTP协议是互联网上最常用的协议之一,掌握HTTP协议以及如何使用Python的requests模块来发送HTTP请求,对于数据抓取、API调用等任务至关重要。本文将从HTTP协议的基础知识出发,详细介绍如何使用requests模块发送GET和POST请求、处理响应数据、添加请求头、处理异常等,并通过多个实际案例帮助新手朋友快速上手。

HTTP(HyperText Transfer Protocol)协议,即超文本传输协议,是一种请求-响应式协议。客户端(如浏览器)发起HTTP请求,服务器对请求作出响应。HTTP协议基于TCP协议进行数据的可靠传输,常用的端口号是80(HTTP)和443(HTTPS)。
URL(Uniform Resource Locator)是统一资源定位符,用于定位互联网上的资源。HTTP URL的常用格式如下:
http://
HTTP协议定义了多种请求方法,常用的包括GET和POST。
HTTP请求格式分为请求行、请求头和请求体。
HTTP状态码用于表示服务器的处理状态,常见的状态码包括:
requests模块是Python中一个简单易用的HTTP库,用于发送HTTP请求。requests模块默认使用HTTP/1.1协议,但在支持HTTP/2的环境中,也可以自动利用HTTP/2的特性。
使用pip命令安装requests模块:
pip install requests
使用requests模块中的get()函数可以发送GET请求。
- import requests
-
- # 发送GET请求
- response = requests.get('https://baidu.com')
-
- # 输出响应内容
- print(response.text)
上述代码向百度的主页发送了一个GET请求,并打印出了服务器返回的HTML内容。
发送带参数的GET请求时,可以将参数以字典的形式传递给params参数。
- import requests
-
- # 发送带参数的GET请求
- params = {'key': 'value'}
- response = requests.get('https://httpbin.org/get', params=params)
-
- # 输出响应内容
- print(response.json())
上述代码向httpbin.org/get发送了一个带有查询参数的GET请求,并打印出了JSON格式的响应内容。
使用requests模块中的post()函数可以发送POST请求。
- import requests
-
- # 要发送的数据
- data = {'key1': 'value1', 'key2': 'value2'}
-
- # 发送POST请求
- response = requests.post('https://httpbin.org/post', data=data)
-
- # 输出响应内容
- print(response.text)
上述代码向httpbin.org/post发送了一个POST请求,并打印出了响应内容。
requests模块会自动将data参数中的数据编码为application/x-www-form-urlencoded格式,即表单编码。
发送JSON格式的POST请求时,可以将数据以字典的形式传递给json参数。
- import requests
-
- # 要发送的数据
- data = {'key1': 'value1', 'key2': 'value2'}
-
- # 发送JSON格式的POST请求
- response = requests.post('https://httpbin.org/post', json=data)
-
- # 输出响应内容
- print(response.text)
上述代码向httpbin.org/post发送了一个包含JSON数据的POST请求,并打印出了响应内容。
在发送HTTP请求时,可以通过headers参数添加请求头。
- import requests
-
- # 发送GET请求,添加请求头
- headers = {'User-Agent': 'Mozilla/5.0'}
- response = requests.get('https://baidu.com', headers=headers)
-
- # 输出响应内容
- print(response.text)
上述代码向百度的主页发送了一个带有自定义User-Agent的GET请求。
如果响应内容是JSON格式,可以使用response.json()方法解析JSON数据。
- import requests
-
- # 发送GET请求,处理JSON响应
- response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
- data = response.json()
-
- # 输出JSON数据
- print(data)
上述代码向jsonplaceholder.typicode.com/posts/1发送了一个GET请求,并解析了JSON格式的响应内容。
requests模块可能会抛出异常,例如网络连接问题或HTTP错误。可以使用try...except块来处理这些异常。
- import requests
- from requests.exceptions import RequestException, Timeout
-
- try:
- # 设置超时时间为5秒,发送GET请求,处理错误和异常
- response = requests.get('https://baidu.com', timeout=5)
- response.raise_for_status() # 如果响应状态码不是200,抛出异常
- print(response.text)
- except Timeout:
- print("请求超时")
- except RequestException as e:
- print(f"请求失败: {e}")
上述代码在发送GET请求时设置了超时时间,并处理了可能抛出的超时异常和请求异常。
使用会话对象可以跨请求保持某些参数,如cookies、请求头等。
- import requests
-
- # 创建会话对象
- session = requests.Session()
-
- # 设置请求头
- session.headers.update({'User-Agent': 'Mozilla/5.0'})
-
- # 发送GET请求
- response = session.get('https://baidu.com')
-
- # 输出响应内容
- print(response.text)
上述代码创建了一个会话对象,并设置了自定义的User-Agent,然后发送了一个GET请求。
使用files参数可以发送带有文件上传的POST请求。
- import requests
-
- # 要上传的文件
- files = {'file': open('example.txt', 'rb')}
-
- # 发送文件上传的POST请求
- response = requests.post('https://httpbin.org/post', files=files)
-
- # 输出响应内容
- print(response.text)
上述代码向httpbin.org/post发送了一个包含文件上传的POST请求。
可以通过proxies参数设置代理。
- import requests
-
- # 代理设置
- proxies = {
- 'http': 'http://10.10.1.10:3128',
- 'https': 'http://10.10.1.10:1080',
- }
-
- # 发送GET请求,使用代理
- response = requests.get('https://www.zdaye.com', proxies=proxies)
-
- # 输出响应内容
- print(response.text)
上述代码设置了HTTP和HTTPS的代理,并通过代理发送了一个GET请求到`example.com`。
requests模块会自动处理cookies,如果需要手动添加或获取cookies,可以使用`requests.Session()`对象。
- import requests
-
- # 创建会话对象
- session = requests.Session()
-
- # 发送GET请求,获取cookies
- response = session.get('https://example.com')
-
- # 获取cookies
- cookies = session.cookies.get_dict()
- print(cookies)
-
- # 设置cookies
- session.cookies.set('example_cookie', 'example_value')
-
- # 再次发送GET请求,携带cookies
- response = session.get('https://example.com')
- print(response.text)
上述代码创建了一个会话对象,通过GET请求获取了cookies,并手动设置了一个cookie,然后再次发送GET请求时携带了这个cookie。
在发送请求时,可以通过timeout参数设置超时时间。
- import requests
-
- try:
- # 发送GET请求,设置超时时间为5秒
- response = requests.get('https://example.com', timeout=5)
- print(response.text)
- except requests.exceptions.Timeout:
- print("请求超时")
上述代码在发送GET请求时设置了超时时间为5秒,如果请求超过这个时间还没有响应,就会抛出requests.exceptions.Timeout异常。
requests模块默认会处理HTTP重定向。如果需要禁用重定向,可以将allow_redirects参数设置为False。
- import requests
-
- # 发送GET请求,禁用重定向
- response = requests.get('https://example.com', allow_redirects=False)
- print(response.status_code)
- print(response.headers)
上述代码发送了一个GET请求到example.com,并禁用了重定向,打印出了响应的状态码和头部信息。
在默认情况下,requests模块会验证SSL证书。如果服务器使用的是自签名证书,可以通过verify参数禁用SSL证书验证。
- import requests
-
- # 发送GET请求,禁用SSL证书验证
- response = requests.get('https://self-signed.badssl.com/', verify=False)
- print(response.text)
注意:禁用SSL证书验证会降低安全性,因此在实际应用中应尽量避免。
如果需要发送带有HTTP认证的请求,可以使用auth参数。
- import requests
- from requests.auth import HTTPBasicAuth
-
- # 发送GET请求,使用HTTP基本认证
- response = requests.get('https://example.com/protected', auth=HTTPBasicAuth('username', 'password'))
- print(response.text)
上述代码使用HTTP基本认证发送了一个GET请求到受保护的资源。
requests模块是一个功能强大且易于使用的HTTP库,适用于各种HTTP请求场景。通过本文的介绍,你可以掌握requests模块的基本用法和高级特性,包括发送GET和POST请求、处理响应数据、添加请求头、处理异常、会话对象、文件上传、代理设置、Cookies处理、超时设置、重定向处理、SSL证书验证和自定义认证等。
希望本文能帮助你更好地理解和使用requests模块,成为HTTP请求的高手。如果你有任何问题或建议,请随时留言交流。