Python requests库使用指南:从安装到高级应用

小岛来信
小岛来信
发布时间:2026-10-13 | 4人浏览过
原创

本文详细解析Python第三方库requests的使用方法,涵盖安装步骤、GET/POST等常见HTTP请求的构建、URL参数传递技巧、响应内容(文本、二进制、JSON)的获取与编码处理。此外,还介绍了自定义请求头、Session对象维持状态、文件上传、SSL证书验证及错误处理等高级功能,帮助开发者高效进行网络通信。

本文详细介绍Python中requests库的具体应用实例,供读者参考学习。

是Python的一个第三方HTTP库,基于urllib构建,采用Apache2 Licensed开源协议。相较于urllib,它更为便捷,能显著减少开发工作量,完全满足HTTP测试需求。下文将记录其具体使用方式。

安装

在使用requests库之前,必须先完成安装操作:

pip install requests

创建请求

通过requests库发起请求非常简单,首先需要导入requests库:

import requests

接下来尝试创建一个请求,用于获取百度的网页信息:

result = requests.get('http://www.baidu.com/')

此时我们获得了一个Response对象,可以从该对象中提取所需的所有信息。上述示例使用的是GET请求,接下来演示如何使用requests库发起POST请求:

result = requests.post('http://www.baidu.com/',data={key:value})

操作是否简单?那么其他HTTP请求方法,如PUT、DELETE、HEAD和OPTIONS又该如何处理呢?

result = requests.put('http://www.baidu.com/',data={key,value})
result = requests.head('http://www.baidu.com/')
result = requests.delete('http://www.baidu.com/')
result = requests.options('http://www.baidu.com/')

在URL中传递参数

经常需要在URL的查询字符串中发送数据。若手动构建网址,这些数据会以键值对形式出现在问号之后,例如https://www.baidu.com/s?wd=requests。requests允许通过params关键字参数,将参数以字符串字典的形式提供。例如,要将name=zhangsan和age=18传递到https://www.baidu.com/s,可以这样编写代码:

data = {"name":"zhangsan","age":18}
result = requests.get("https://www.baidu.com/s",params=data)

打印URL后发现,该URL已被正确编码:

print result.url # https://www.baidu.com/s?name=zhangsan&age=18

此外,还可以传递列表数据:

data = {"name":"zhangsan","favorite":["football","basketball"]}
result = requests.get("https://www.baidu.com/s",params=data)
print result.url # https://www.baidu.com/s?name=zhangsan&favorite=football&favorite=basketball

响应内容

从上述示例可知,每次请求后都会返回一个对象,我们可以从中获取响应内容:

result = requests.get("https://api.github.com/events")
print result.text    # [{"id":"6924608641","type":"PushEvent",...}]

二进制响应内容

print result.content  # b'[{"id":"6924656608","type":"CreateEvent",...}]'

对于JSON格式的响应内容,如果解码失败,方法将会引发异常。

print result.json()     # [{"id":"6924608641","type":"PushEvent",...}]

请求会自动解码服务器返回的内容,大多数unicode字符集均可无缝解码。我们可以通过以下方式获取当前的编码格式:

print result.encoding

如果响应内容的编码格式不符合预期,可以在调用result.text之前,对result.encoding属性进行赋值,以指定新的编码格式。

要检查请求是否成功,可以使用result.raise_for_status()或result.status_code来验证是否符合预期。

套接字响应

在极少数情况下,如果需要从服务器获取原始套接字响应,可以通过result.raw来获取。若需执行此操作,请确保在初始请求中设置stream=True。完成设置后,可以这样操作:

result = requests.get("https://api.github.com/events",stream=True)
print result.raw        # <urllib3.response.HTTPResponse object at 0x10ce52dd8>
print result.raw.read(10)    # b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

通常情况下,我们采用如下模式来保存正在流式传输的内容:

with open("info.txt","wb") as f:
  for item in result.iter_content(chunk_size=128):
    f.write(item)

自定义头部

若要在请求中添加自定义请求头,只需将字典传递给headers参数即可。例如,在请求中指定User-Agent:

header = {"user-agent":'my_test/0001'}
result = requests.get("https://api.github.com/events",headers=header)

注意,请求头的值必须是字符串、字节字符串或unicode。虽然允许使用unicode,但建议避免使用。

复杂的POST请求

通常情况下,我们希望发送类似HTML表单的编码数据。为此,只需将字典传递给data参数即可:

infoDict = {"name":"张三"}
result = requests.post('http://127.0.0.1:5000/test/post',data=infoDict)

此外,还可以传递元组数据:

tupleInfo = ("name","张三")
result = requests.post('http://127.0.0.1:5000/test/post',data=tupleInfo)

有时需要发送非编码格式的数据,即直接发送字符串而非字典,此时数据将原样发送:

import json
infoDict = {"name":"张三"}
result = requests.post('http://127.0.0.1:5000/test/post',data=json.dumps(infoDict))

若希望发送字典数据并自动编码,可以通过json参数实现:

infoDict = {"name":"张三"}
result = requests.post('http://127.0.0.1:5000/test/post',json=infoDict)

注意,如果已经传递了data参数或files参数,json参数将被忽略。

POST上传文件

使用requests上传文件非常简单:

with open('info.txt','rb') as f:
  result = requests.post('http://localhost:5000/post',files={"files":f})

响应状态码

执行请求后,可以使用以下方法查看状态码,以检测请求是否成功:

result = requests.get('http://localhost:5000/get')
print result.status_code  # 200

当返回200时,表示请求执行成功。我们还可以使用以下方法判断请求是否成功:True表示成功,False表示不成功:

print result.staatus_code == requests.codes.ok    # True

当执行错误请求(如4XX客户端错误或5XX服务器错误)时,可以使用以下方法抛出异常进行检查:

result = requests.get('http://localhost:5000/get')
print result.status_code      # 404
print result.raise_for_status()   # Traceback (most recent call last): ...

但如果请求执行成功,即状态码为200,此时raise_for_status()的值将为None。

响应头

我们可以使用Python字典来查看服务器的响应头文件:

print result.headers    # {'Content-Type': 'text/html; charset=utf-8', 'Content-Length': '2', 'Server': 'Werkzeug/0.12.2 Python/2.7.10', 'Date': 'Sun, 03 Dec 2017 14:15:32 GMT'}

Cookies

如果响应中包含Cookie,可以这样快速访问它:

result = requests.get('http://localhost:5000/get')
print result.cookies['userName']

或者,如果需要将自定义Cookie发送给服务器,可以使用cookies参数:

cookie = {'userName':'zhangsan'}
result = requests.get('http://localhost:5000/get',cookies=cookie)

RequestCookieJar提供了完整的接口,适用于在多个域和路径中使用,它将返回一个Cookie,因此也可以传入到cookies参数中。

c = requests.cookies.RequestsCookieJar()
c.set('userName','zhangsan',domain='http://localhost:5000',path='/get')
result = requests.get('http://localhost:5000/get',cookies=c)

Session对象

Session对象允许在请求中保存特定参数,它将在所有由会话实例创建的请求中保存Cookie,并使用urllib3连接池。如果向同一主机发出多个请求,底层TCP连接将被复用,从而显著提高性能。Session具备主API的所有请求方法:

s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {"sessioncookie": "123456789"}}'

但请注意,方法级参数不会在请求中保存,即使使用Session。此示例仅发送第一个请求的Cookie,不会发送第二个:

result = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(result.text)
# '{"cookies": {"from-my": "browser"}}'
result = s.get('http://httpbin.org/cookies')
print(result.text)
# '{"cookies": {}}'

请求和响应对象

每次发起GET请求时,都在执行两件事。首先,构造一个Request对象,该对象将被发送到服务器以请求或查询特定资源。其次,Response对象在从服务器获得响应后生成。该Response对象包含服务器返回的所有信息,并包含最初创建的Request对象。这是一个简单的请求,从维基百科服务器获取重要信息:

result = requests.get('http://en.wikipedia.org/wiki/Monty_Python')

现在需要获取服务器发送给我们的头文件信息:

print result.headers

如果需要获取发送给服务器的头文件信息,可以这样做:

print result.request.headers

SSL证书验证

请求将验证HTTPS请求的SSL证书,行为类似于Web浏览器。默认情况下启用SSL验证,如果无法验证SSL证书,将会引发SSLError:

result = reqests.get('https://kyfw.12306.cn/otn/login/init')
# requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",)

为避免出现此错误,可以将CA证书的CA_BUNDLE文件或目录传递给verify参数:

result = reqests.get('https://kyfw.12306.cn/otn/login/init',verify='/path/...')

或者使用Session方式将其存储起来:

s = Session()
s.verify='/path/...'
result = s.get('https://kyfw.12306.cn/otn/login/init')

如果将verify参数设置为False,请求也可以忽略SSL证书验证:

result = requests.get('https://kyfw.12306.cn/otn/login/init',verify=False)

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。

希望本文所述内容对大家学习Python程序设计有所帮助。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表