第三课:Requests库实战:高效获取网页数据
Requests库是一个功能强大且易于使用的HTTP客户端库,特别适合用于发送HTTP请求和处理响应。我们将通过解析requests.get和requests.post的核心参数、讲解超时设置与异常处理、探讨文件下载与流式传输,并通过一个批量下载图片的案例来加深理解。
今天我们将深入探讨如何使用Requests库高效地获取网页数据。Requests库是一个功能强大且易于使用的HTTP客户端库,特别适合用于发送HTTP请求和处理响应。我们将通过解析requests.get和requests.post的核心参数、讲解超时设置与异常处理、探讨文件下载与流式传输,并通过一个批量下载图片的案例来加深理解。

一、requests.get/post核心参数解析
requests.get
requests.get()函数用于发送GET请求。其核心参数包括:
- url:请求对象的URL地址。
- params(可选):使用字典作为GET请求的参数。
- headers(可选):使用字典作为GET请求的headers信息。
- cookies(可选):使用CookieJar对象发送GET请求。
- auth(可选):AuthObject启用基本HTTP身份验证。
- timeout(可选):请求超时的设置,用浮点数表示。
requests.post
- requests.post()函数用于发送POST请求。其核心参数包括:
- url:要发送POST请求的目标URL。
- data(可选):要发送的数据,可以是字典、元组列表或字节流。
- json(可选):要发送的JSON数据。如果设置了json参数,则data参数将被忽略。
- headers(可选):要发送的HTTP头部信息。
- params(可选):要发送的URL参数。
- auth(可选):用于进行身份验证的参数。
- timeout(可选):请求超时时间。
- proxies(可选):用于发送请求的代理服务器。
- verify(可选):是否验证服务器的SSL证书。
- files(可选):要上传的文件。
二、超时设置与异常处理
在网络通信中,由于网络状况的不稳定性,请求可能会因为各种原因(如网络延迟、服务器响应慢、网络中断等)而无法及时得到响应。为了应对这种情况,requests库提供了超时设置功能,并通过异常处理机制帮助开发者处理各种网络错误和异常情况。
超时设置
在requests库中,设置超时非常简单,只需要在发起请求时指定timeout参数即可。timeout参数的值是一个浮点数(或元组),表示等待服务器响应的最长时间(以秒为单位)。如果请求在指定的时间内没有收到响应,则会抛出一个Timeout异常。
异常处理
requests库在发生异常时,会抛出相应的异常类型。为了捕获并处理这些异常,我们可以使用Python的try-except语句块。常见的异常类型包括ConnectionError、HTTPError、Timeout等。
import requests
try:
# 发起HTTP GET请求,并设置超时时间为5秒
response = requests.get('https://www.baidu.com', timeout=5)
# 检查请求是否成功
response.raise_for_status()
# 打印响应内容
print(response.text)
except requests.exceptions.Timeout:
# 捕捉超时异常
print("-------------- timeout")
except requests.exceptions.RequestException as e:
# 捕捉其他请求异常
print(f"-------------- request exception {e}")
三、文件下载与流式传输
requests库不仅可以用于获取网页数据,还可以用于下载文件。对于大文件的下载,流式传输是一种高效的方式,因为它可以边下载边保存,避免占用过多内存。
普通下载
对于小文件,可以直接使用Response对象的content属性以字节的方式访问请求响应体,并将其写入文件。
import requests
import os
if not os.path.exists('images-dir'):
os.makedirs('images-dir')
def get_img():
try:
response = requests.get("https://www.域名.com/test-dir/test-img/Nginx使用图片.jpeg", verify=False,timeout=10)
response.raise_for_status()
with open(os.path.join('images-dir', 'single-img.jpeg'), 'wb') as file:
file.write(response.content)
except requests.exceptions as e:
print('-------------------- error')
print(e)
if __name__ == '__main__':
get_img()
流式传输
对于大文件,可以使用流式传输的方式。通过设置stream=True参数,可以逐块读取响应内容,并将其写入文件。
import requests
import os
if not os.path.exists('images-dir'):
os.makedirs('images-dir')
def get_zip():
url = 'https://www.域名.com/test-dir/test-package.zip'
try:
response = requests.get(url, stream=True, timeout=60)
response.raise_for_status()
with open(os.path.join('images-dir', 'test-zip.zip'), 'wb') as file:
for chunk in response.iter_content(chunk_size=1024):
if chunk:
file.write(chunk)
print('----------------------- success')
except requests.exceptions as e:
print('----------------------- exception')
print(e)
if __name__ == '__main__':
get_zip()
四、案例:批量下载图片
下面是一个批量下载图片的案例。假设我们有一个包含多个图片URL的列表,我们需要将这些图片下载到本地。
通过这个案例,我们展示了如何使用Requests库批量下载图片,并处理了可能的异常情况。
import requests
import os
img_list = [
"https://www.域名.com/test-dir/test-img/Nginx使用图片.jpeg",
"https://www.域名.com/test-dir/test-img/NodeJS课程.png",
"https://www.域名.com/test-dir/test-img/Nodejs爬虫图片.jpeg",
"https://www.域名.com/test-dir/test-img/Python 爬虫课程图片.png",
"https://www.域名.com/test-dir/test-img/Ubuntu服务器图片.jpeg",
"https://www.域名.com/test-dir/test-img/puppeteer使用图片.png",
"https://www.域名.com/test-dir/test-img/python爬虫图片.jpeg",
"https://www.域名.com/test-dir/test-img/粟德明横向名片.png"
]
if not os.path.exists('images-multiple'):
os.makedirs('images-multiple')
def loop_img():
for i, url in enumerate(img_list):
print(f'------------------------ 开始处理{i + 1}张图片')
try:
response = requests.get(url, timeout=5)
response.raise_for_status()
# 对图片的后缀进行处理
strs = url.split('.')
file_name = 'test-' + str(i + 1) + '.' + strs[len(strs) - 1]
with open(os.path.join('images-multiple', file_name), 'wb') as file:
file.write(response.content)
except requests.exceptions.Timeout:
# 捕捉超时异常
print('------------------------- timeout')
except requests.exceptions.RequestException as e:
# 捕捉其他请求异常
print('------------------------- request exception')
print(e)
if __name__ == '__main__':
loop_img()
结束语
在本篇博客文章中,我们深入探讨了Requests库的使用,包括requests.get和requests.post的核心参数解析、超时设置与异常处理、文件下载与流式传输,以及一个批量下载图片的案例。希望这些内容能够帮助你更高效地使用Requests库获取网页数据。如果你有任何问题或建议,欢迎在评论区留言!
关注我!!🫵 持续为你带来Python爬虫相关内容。
更多推荐
所有评论(0)