Grequests是什么?
grequests
是一个Python库,它是requests
库的异步版本。它允许你同时发送多个HTTP请求,而不必等待每个请求依次响应。可以在等待服务器响应的同时执行其他任务,从而节省时间并提高效率。
安装Grequests
pip install grequests
使用示例一:批量获取网页
假如有一个网站列表,想快速检查它们是否都能正常访问。使用grequests
。下面是一个代码的示例:
import grequests # 定义一组要访问的URL urls = [ 'https://www.baidu.com', 'https://www.taobao.com', 'https://www.12306.cn/index/', # 更多URL... ] # 创建一个请求列表 unsent_requests = (grequests.get(url) for url in urls) # 使用grequests发送所有请求 results = grequests.map(unsent_requests) # 输出结果 for response in results: if response: print(f'{response.url} - 状态码: {response.status_code}') else: print('请求失败')
在这个代码中,我们首先定义了一个URL列表,然后创建了一个未发送请求的生成器。grequests.map()
函数接收这个生成器,并发送所有请求,然后返回一个包含响应的列表。最后我们遍历响应列表,打印出每个URL的状态码。
使用示例二:异步下载多个文件
如果你需要下载多个文件,grequests
也可以做到。以下是一个下载多个图片并保存到本地的示例:
import os import grequests # 定义图片链接列表 image_urls = [ 'https://example.com/image1.jpg', 'https://example.com/image2.jpg', 'https://example.com/image3.jpg', # 更多图片链接... ] # 准备下载函数 def download_image(response, *args, **kwargs): if response.status_code == 200: # 从URL中提取图片名称 image_name = os.path.basename(response.url) # 打开一个文件用于写入二进制数据 with open(image_name, 'wb') as f: f.write(response.content) print(f'下载完成: {image_name}') # 创建请求列表 unsent_requests = (grequests.get(url, stream=True, hooks={'response': download_image}) for url in image_urls) # 发送请求 grequests.map(unsent_requests)
在这个代码中,定义了一个图片链接列表,为每个下载请求指定了一个回调函数download_image
,它会在响应到达时触发。通过在请求中设置stream=True
,告诉grequests
以流式传输的方式获取数据,这对于大文件下载非常有用。hooks
参数则用于指定回调函数。最后,我们使用grequests.map()
来异步发送所有下载请求。