🚀个人主页:为梦而生~ 关注我一起学习吧!
💡专栏:python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~
💡往期推荐:
⭐️前面比较重要的基础内容:
【Python爬虫开发基础⑦】urllib库的基本使用
【Python爬虫开发基础⑧】XPath库及其基本用法
【Python爬虫开发基础⑨】jsonpath和BeautifulSoup库概述及其对比
【Python爬虫开发基础⑩】selenium概述
【Python爬虫开发基础⑪】requests库概述(GET和POST请求)
⭐️爬虫的实战文章:
【Python爬虫开发实战①】使用urllib以及XPath爬取可爱小猫图片
【Python爬虫开发实战②】使用urllib以及jsonpath爬取即将上映电影信息
大家可以复制代码感受一下爬虫的魅力~
💡本期内容:上一篇文章我们简单的介绍了requests库,这一篇文章我们接着讲~
文章目录
- 1 文件上传
- 2 cookies处理
- 3 状态码处理
- 4 异常处理
1 文件上传
使用 requests 库进行文件上传非常方便。可以通过传递一个 files 参数来指定要上传的文件。
import requests
# 设置上传的文件路径和目标 URL
file_path = 'path/to/file.jpg'
url = 'https://api.example.com/upload'
# 创建文件对象,并设置文件名和文件内容类型
files = {'file': open(file_path, 'rb')}
# 发送 POST 请求并上传文件
response = requests.post(url, files=files)
# 检查响应状态码
if response.status_code == 200:
# 获取响应内容(文本格式)
content = response.text
print(f'Response content: {content}')
else:
print('Failed to upload file. Status code:', response.status_code)
在上述示例代码中,我们首先指定了要上传的文件路径 file_path 和目标 URL url。然后,创建了一个 files
字典,其中键为 'file'
,值为使用 open()
函数打开文件对象。注意,这里需要将文件以二进制模式打开 ('rb')
。
接下来,我们使用 requests.post()
方法发送 POST 请求,并通过参数 files=files
来指定要上传的文件。
最后,我们检查响应状态码是否为 200,如果成功,则获取响应内容并打印出来。如果上传失败,则打印相应的错误信息和状态码。
注意:可以根据实际需求对文件上传进行更多的定制,例如设置文件名、文件类型等。requests 库提供了丰富的选项来满足不同的文件上传需求。可以根据具体情况进行相应的设置,并将文件对象以适当的方式传递给 requests.post()
方法。
2 cookies处理
在使用 requests 库发送网络请求时,可以方便地处理和管理 cookies。Cookies 是服务器存储在用户浏览器中的数据,用于跟踪用户会话和存储用户信息。requests 库提供了一些方法来处理和操作 cookies。
-
获取 cookies: 可以使用
response.cookies
属性获取响应中的 cookies。它返回一个RequestsCookieJar
对象,可以通过索引或属性名访问特定的 cookie 值。 -
发送 cookies: 可以通过传递 cookies 参数将 cookies 添加到请求中。cookies 参数可以是一个字典,其中键为 cookie 名称,值为 cookie 值。
-
保存 cookies: 通过设置
session
属性为True
,可以创建一个会话对象,该对象将自动保存和管理 cookies。在后续请求中,会话对象会自动发送之前收到的 cookies,并接收和更新新的 cookies。
示例代码:
import requests
# 发送 GET 请求并获取 cookies
response = requests.get('https://api.example.com')
cookies = response.cookies
# 将 cookies 添加到后续请求中
url = 'https://api.example.com/data'
response = requests.get(url, cookies=cookies)
# 创建会话对象,并保存 cookies
session = requests.Session()
response = session.get('https://api.example.com/login')
# 做其他操作,会话对象会自动发送和接收 cookies
response = session.get('https://api.example.com/profile')
在上述示例代码中,我们首先发送一个 GET 请求并获取响应中的 cookies。通过 response.cookies
属性可以获得一个 RequestsCookieJar
对象,其中包含了响应中的 cookies。
接下来,我们将 cookies 添加到后续请求中,通过 cookies=cookies
参数传递给 requests.get()
方法。这样,在发送请求时会自动带上之前收到的 cookies。
另外,我们还创建了一个会话对象 session,通过 requests.Session()
创建。会话对象会自动保存和管理 cookies。在后续的请求中,直接使用会话对象发送请求,会话对象会自动发送和接收 cookies。
注意:需要注意的是,如果没有指定会话对象或手动处理 cookies,requests 库默认会将每个请求视为相互独立的,不会自动处理 cookies。
cookie从需要在开发者工具的抓包中找:
3 状态码处理
requests 库提供了一种简便的方式来处理 HTTP 请求的响应状态码。在发送请求后,可以通过访问 response.status_code
属性来获取响应的状态码,并根据状态码进行相应的处理。
以下是一些常见的 HTTP 状态码和其含义:
状态码 | 意义 |
---|---|
200 OK | 请求成功,信息在返回的响应报文中 |
201 Created | 请求成功,并在服务器上创建了新资源 |
204 No Content | 请求成功,但响应中没有返回任何内容 |
301 Moved Permanently | 请求的对象已经被永远的转移了,新的URL定义在响应报文的Location,首部行中,客户软件将自动获取新的URL |
400 Bad Request | 一个通用的差错代码,指示该请求不能被服务器理解 |
401 Unauthorized | 请求未被授权,需要提供有效的身份验证信息 |
403 Forbidden | 请求被服务器拒绝,通常是因为权限不足 |
404 Not Found | 被请求的文档不在服务器上 |
500 Internal Server Error | 服务器内部发生错误,无法完成请求 |
505 HTTP Version Not Supported | 服务器不支持请求报文使用的HTTP协议版本 |
示例代码:
import requests
# 发送 GET 请求
response = requests.get('https://api.example.com')
# 获取响应状态码
status_code = response.status_code
# 根据状态码进行处理
if status_code == 200:
print('Request successful')
elif status_code == 404:
print('Page not found')
elif status_code == 500:
print('Internal Server Error')
else:
print('Unexpected status code:', status_code)
在上述示例代码中,我们发送了一个 GET 请求到 'https://api.example.com'
。然后,通过访问 response.status_code
来获取响应的状态码,并将其赋值给变量 status_code
。
接下来,我们使用条件语句对不同的状态码进行处理。以常见的状态码为例,如果状态码为 200,则表示请求成功,我们打印出相应的成功信息。如果状态码为 404,则表示页面未找到,我们打印出相应的错误信息。如果状态码为 500,则表示服务器内部错误,同样打印出相应的错误信息。对于其他未预料到的状态码,我们打印出无法识别的状态码信息。
注意:状态码的具体含义可能根据不同的 HTTP 协议版本和服务器实现有所差异。因此,在实际应用中,可能需要参考相应的文档或规范来了解每个状态码的含义,并根据具体情况进行适当处理。
4 异常处理
requests 库提供了一套完善的异常处理机制,用于捕获和处理与网络请求相关的异常。当发生异常时,可以通过捕获 requests.exceptions.RequestException
异常来处理,并根据不同的异常类型进行相应的操作。
import requests
from requests.exceptions import RequestException
try:
# 发送 GET 请求
response = requests.get('https://api.example.com')
# 检查响应状态码
response.raise_for_status()
# 处理响应数据
data = response.json()
print('Response data:', data)
except requests.exceptions.HTTPError as err:
print('HTTP Error:', err)
except requests.exceptions.ConnectionError as err:
print('Connection Error:', err)
except requests.exceptions.Timeout as err:
print('Timeout Error:', err)
except requests.exceptions.RequestException as err:
print('Error occurred:', err)
在上述示例代码中,我们首先尝试发送一个 GET 请求到 'https://api.example.com'
。然后,使用 response.raise_for_status()
方法检查响应的状态码,如果状态码表明请求失败,将会抛出 requests.exceptions.HTTPError
异常。
在 try
语句块中,我们通过多个 except
子句来捕获和处理不同类型的异常。例如,如果发生连接错误(如网络连接问题、DNS 错误等),将抛出 requests.exceptions.ConnectionError
异常;如果发生超时错误,将抛出 requests.exceptions.Timeout
异常。
最后,我们使用 requests.exceptions.RequestException
来捕获其他的请求异常,这包括 HTTPError、ConnectionError、Timeout 以及其他未明确定义的异常类型。在这个异常处理块中,可以打印出发生的异常信息,或者根据实际需求进行相应的错误处理。
注意:捕获 RequestException
异常将会捕获所有与请求相关的异常,因此它应该作为捕获异常的基类。如果你只想捕获特定类型的异常,可以将其放在更具体的子类异常之前。
通过合理的异常处理,可以增加代码的健壮性和可靠性,并提供有用的错误信息和反馈给用户。在实际使用中,可以根据具体的场景和需求,进一步处理异常、记录日志、重试请求或采取其他适当的措施。