您的位置:

使用Python RequestsSession进行网络请求

引言

网络请求在现代编程中是一个重要的环节,特别是在Web开发中,很多功能都需要与服务器进行交互。Python作为一种脚本语言,自带有一个强大的HTTP库——requests。使用requests库,可以顺利进行各种网络请求,包括GET、POST、PUT等常见的方式。而RequestsSession则是requests库的一个高级功能,为多次访问同一网站提供了一些优化,如自动存储cookie等。本文将从如何使用requests和RequestsSession发送网络请求,如何处理返回结果,以及其它一些常用技巧等方面进行详细介绍。

网络请求的基本功

1. 发送GET请求

发送GET请求是最简单的一种请求方式。requests库的get方法可以让我们非常方便地进行发送请求操作,下面是一个简单的示例:

import requests
response = requests.get("http://www.baidu.com")
print(response.text)

运行上面的代码,可以得到百度首页的HTML代码。

2. 发送POST请求

POST请求可以向服务器提交数据。一般来说,POST数据通常放在请求体中。requests库的post方法可以让我们非常方便地进行发送POST请求操作,下面是一个简单的示例:

import requests
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post("http://httpbin.org/post", data=payload)
print(response.text)

运行上面的代码,可以得到POST请求返回的内容。

使用RequestsSession进行GET请求

使用RequestsSession可以进行多次访问同一网站,并且可以保证每次访问使用的cookie一致。下面是一个使用RequestsSession进行GET请求的示例:

import requests
session = requests.Session()
r = session.get('https://github.com/')
print(r.text)

使用RequestsSession其实就是新建一个Session对象,然后使用该对象的get方法进行请求。如上就是简单的调用方法,可以看到我们不需要再次指定网站地址,这意味着我们可以紧密保有会话的状态。

使用RequestsSession进行POST请求

同样,我们可以使用RequestsSession进行POST请求。下面是一个使用RequestsSession进行POST请求的示例:

import requests
session = requests.Session()
payload = {'key1': 'value1', 'key2': 'value2'}
r = session.post("http://httpbin.org/post", data=payload)
print(r.text)

与上面GET请求类似,这里我们只需要改变方法名称为post即可。

使用RequestsSession进行文件上传

1. 单个文件上传

我们可以使用RequestsSession将文件上传到服务器。这里我们举一个发送单个文件的例子:

import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder

session = requests.Session()
m = MultipartEncoder(fields={'file': ('test.txt', open('test.txt', 'rb'), 'text/plain')})
r = session.post("http://httpbin.org/post", data=m, headers={'Content-Type': m.content_type})
print(r.text)

运行成功后,返回结果即为上传后的数据信息。

2. 多个文件上传

在实际应用中,我们可能需要上传多个文件。此时,我们同样可以使用RequestsSession将多个文件上传到服务器,这里我们举一个发送多个文件的例子:

import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder

session = requests.Session()
m = MultipartEncoder(
    fields=[
        ('field1', 'value1'),
        ('field2', 'value2'),
        ('file1', ('test1.txt', open('test1.txt', 'rb'), 'text/plain')),
        ('file2', ('test2.txt', open('test2.txt', 'rb'), 'text/plain'))
    ]
)
r = session.post("http://httpbin.org/post", data=m, headers={'Content-Type': m.content_type})
print(r.text)

其他技巧

1. 设置请求头信息

我们可以使用requests库自定义请求头信息,下面是一个设置请求头信息的示例:

import requests

url = 'http://httpbin.org/headers'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
r = requests.get(url, headers=headers)
print(r.content)

2. 使用代理服务器

如果我们需要使用代理服务器来进行网络请求,也可以采用requests库进行操作。下面是一个使用代理服务器的示例:

import requests

url = 'http://httpbin.org/ip'
proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'http://10.10.1.10:1080',
}

r = requests.get(url, proxies=proxies)
print(r.content)

3. 设置超时时间

在网络请求过程中,如果连接超时或响应超时,我们可以设置超时时间来避免长时间等待导致程序的崩溃或堵塞。下面是一个设置超时时间的示例:

import requests

url = 'http://httpbin.org/delay/5'
r = requests.get(url, timeout=3)
print(r.content)

结语

在本文中,我们详细介绍了使用requests和RequestsSession进行网络请求的方法和技巧。requests库具有简单易用、接口清晰等特点,能够有效地提高我们的Web开发效率。对于日常开发中常见的需要网络请求的场景,掌握requests库的常用方法和技巧将能够事半功倍。