突破网络边界:了解requests模块的基本概念

在我们开始使用requests模块之前,让我们先了解一下它的基本概念。requests模块是一个简洁而高效的HTTP库,可用于发送各种HTTP请求,并处理响应数据。它提供了简单且直观的接口,让我们能够轻松地进行GET、POST、PUT、DELETE等各种类型的请求。

发起挑战:动手实践requests模块

发起请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests

response = requests.get("https://jsonplaceholder.typicode.com/posts/1")
# 获取状态码
print(response.status_code)
print("----------------")
# 获取网页内容
print(response.text)
print("----------------")
data = response.json()
# 获取请求中的title字段
print(data["title"])
print("----------------")
# 获取请求中的boby字段
print(data["body"])

在这个例子中,我们使用requests模块发起了一个GET请求,获取了一个来自JSON Placeholder API的示例数据。我们使用 requests.get() 方法,并传入需要获取数据的URL参数。然后,我们通过 response.json() 方法来解析响应的JSON数据。

最后,我们打印出了获取到的数据中的 “title” 和 “body” 字段。

拓展

requests库中,可以通过params参数直接传递参数,requests库会自动处理参数并拼接到URL中。

下面是一个使用params参数的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
import requests

payload = {
'tn': '15007414_15_dg',
'ie': 'utf-8',
'wd': 'requests'
}
url = 'http://www.baidu.com'

r = requests.get(url, params=payload)
print(r.url)

在这个示例中,我们直接将参数params传递给requests.get()方法的params参数中,requests库会自动将它们拼接到URL中,发送GET请求。

文件上传

1
2
3
4
5
6
7
8
import requests

url = "http://httpbin.org/post"
files = {'file': open(r"C:\Users\85031\Desktop\20190801101348861.jpg", 'rb')}

response = requests.post(url, files=files)
print(response.text)

在这个例子中,我们首先定义了要上传文件的URL地址(url),然后使用open函数打开要上传的文件,并将其赋值给files字典中的'file'键。请确保替换实际的文件名和路径。

接下来,我们使用requests.post方法发送一个POST请求,并传入URL和files参数。files参数指定文件的键值对,其中键为'file',值为我们打开的文件对象。

最后,我们打印出服务器的响应内容(response.text),可以根据实际情况进行相应的处理。

获取Cookies

1
2
3
4
5
6
7
8
9
import requests

url = "https://www.baidu.com"

response = requests.get(url)
cookies = response.cookies

for cookie in cookies:
print(f"{cookie.name}: {cookie.value}")

在这个例子中,我们首先定义了要请求的URL地址(url)。然后,我们使用requests.get方法发送一个GET请求,并将其赋值给response变量。

接下来,我们可以通过response.cookies访问返回的Cookies。可以通过for循环遍历cookies对象,获取每个cookie的名称和值。在示例中,我们简单地打印每个cookie的名称和值。

你可以根据实际情况,进一步处理或使用这些cookies,例如将它们传递给后续请求,以实现登录或保持会话等功能。

注意:在实际使用中,你可能需要对请求进行相应的设置、处理重定向或处理异常等。此示例仅展示了获取cookies的核心部分。

维持会话

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests

# 创建一个会话对象
session = requests.Session()

# 发起第一个请求
session.get('http://httpbin.org/cookies/set/number/52346') # 处理第一个请求的响应...

# 发起第二个请求
response2 = session.get("http://httpbin.org/cookies")
# 处理第二个请求的响应...
print(response2.text)

在这个例子中,我们创建了一个Session对象,命名为session。然后,我们可以使用该对象,连续发起多个请求。

在第一个请求中,我们使用session.get方法,并传递URL并设置Cookie信息(例如number)。

在第二个请求中,我们使用相同的session对象再次调用session.get方法,并传递另一个URL。这样,请求将重用之前的会话信息和Cookie。

你可以根据实际需要,发起其他请求或使用不同的HTTP方法(如POST、PUT等)。无论多少请求,只要使用同一个session对象,会话状态和Cookie信息都将保持一致。

注意:在实际使用中,你可能需要处理异常、设置请求头、处理重定向等。此示例仅展示了会话维持的核心部分。

重定向

在Python的requests库中,默认情况下,对于重定向的请求,requests库会自动跟随重定向。这意味着,如果发起的请求得到一个重定向响应,requests库会自动发送一个新的请求,跟随重定向的链接。

以下是一个示例代码,演示如何在requests库中处理重定向:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests

url = 'http://cheneyblog.com'

response = requests.get(url)

# 检查是否重定向
if response.history:
print('Redirects:')
for redirect in response.history:
print(redirect.status_code, redirect.url)

print('Final URL:', response.url)
print('Response:', response.text[-50:])

在这个示例中,我们使用requests.get()方法发送一个GET请求到url。如果该请求经历了重定向,我们可以通过response.history属性来获取重定向的历史列表,包括每次重定向的状态码和URL。最终的URL可以通过response.url获取,并且返回的响应可以通过response.text来获取。

如果你想禁用重定向,你可以使用allow_redirects参数,并将其设置为False,如下所示:

1
2
3
4
5
6
7
8
9
10
import requests

url = 'http://cheneyblog.com'

response = requests.get(url, allow_redirects=False)

print('Status Code:', response.status_code)
print('Response:', response.text[-50:])
print('ResponseURL:', response.url)

在这个示例中,我们将allow_redirects参数设置为False,这样就禁用了自动跟随重定向。这意味着,如果该请求得到一个重定向响应,requests库会返回重定向的响应,而不会自动发送新的请求。

超时设置

在Python的requests库中,你可以通过设置timeout参数来指定请求的超时时间。timeout参数用于设置连接和读取的超时时间,以秒为单位。

以下是一个示例代码,演示如何在requests库中设置超时时间:

1
2
3
4
5
6
7
8
9
import requests

url = 'http://example.com'

# 设置连接超时时间为5秒,读取超时时间为5秒
response = requests.get(url, timeout=(5, 5))

print('Status Code:', response.status_code)
print('Response:', response.text)

在这个示例中,我们通过在requests.get()方法中指定timeout参数,将连接超时时间和读取超时时间都设置为5秒。这意味着,如果连接或读取操作在5秒内没有完成,将会引发一个requests.exceptions.Timeout异常。

除了在requests.get()方法中设置timeout参数外,你还可以在全局范围内通过requests模块的default_timeout属性来设置默认的超时时间,如下所示:

1
2
3
4
5
6
7
8
9
10
11
import requests

requests.default_timeout = 5

url = 'http://example.com'

response = requests.get(url)

print('Status Code:', response.status_code)
print('Response:', response.text)

在这个示例中,我们通过将requests.default_timeout属性设置为5秒,来指定默认的超时时间。这样在后续的请求中,如果没有显式指定timeout参数,将会使用该默认的超时时间。

无论是全局设置还是针对特定请求设置超时时间,都可以帮助你控制请求的超时行为,以便更好地处理网络请求过程中可能出现的超时情况。

代理设置

在Python的requests库中,你可以通过设置 proxies 参数来指定代理服务器,从而在发送请求时使用代理。代理服务器可以帮助你隐藏真实的客户端地址,或者通过代理访问被封锁的资源。

以下是一个示例代码,演示如何在requests库中设置代理:

1
2
3
4
5
6
7
8
9
10
11
12
import requests

url = 'http://example.com'
proxies = {
'http': 'http://<proxy_ip>:<proxy_port>',
'https': 'http://<proxy_ip>:<proxy_port>'
}

response = requests.get(url, proxies=proxies)

print('Status Code:', response.status_code)
print('Response:', response.text)

在这个示例中,我们通过在 requests.get() 方法中指定 proxies 参数,将 HTTP 和 HTTPS 请求分别指定了代理服务器的地址。你需要将 <proxy_ip> 替换为代理服务器的 IP 地址,将 <proxy_port> 替换为代理服务器的端口号。

另外,如果你的代理服务器需要进行身份验证,你可以将代理的用户名和密码加入到proxies字典中,例如:

1
2
3
4
proxies = {
'http': 'http://username:password@<proxy_ip>:<proxy_port>',
'https': 'http://username:password@<proxy_ip>:<proxy_port>'
}

在这个示例中,我们在代理地址中包含了用户名和密码信息。

通过设置 proxies 参数,你可以方便地在 requests 库中使用代理服务器,以满足各种实际需求。

突破极限:开启更高级的网络请求操作

requests模块不仅仅可以发送简单的GET请求,还提供了众多功能强大的方法,满足我们在网络请求中的各种需求。我们可以通过设置请求头、发送POST请求、上传文件、处理Cookies等等。同时,requests模块还具备异常处理、会话管理和重试机制等高级功能,让我们能够更好地控制网络请求过程。