检查python中是否存在远程URL上的图像的快速方法
我正在使用图书馆来完成我的请求 在网站的主页上,我得到了一堆图片,并将它们展示给用户。有时这些图片会被删除,我会得到一个坏掉的图片url 所以我想检查图像是否存在 以下是我所做的:检查python中是否存在远程URL上的图像的快速方法,python,django,python-requests,Python,Django,Python Requests,我正在使用图书馆来完成我的请求 在网站的主页上,我得到了一堆图片,并将它们展示给用户。有时这些图片会被删除,我会得到一个坏掉的图片url 所以我想检查图像是否存在 以下是我所做的: items = Item.objects.filter(shop__is_hidden=False, is_hidden=False).order_by("?")[:16] existing_items = [] for item in items: response = requests.head(it
items = Item.objects.filter(shop__is_hidden=False, is_hidden=False).order_by("?")[:16]
existing_items = []
for item in items:
response = requests.head(item.item_low_url)
if response.status_code == 200:
existing_items.append(item)
但这比我想要的要长一点
有没有更快的方法?您的请求是阻塞和同步的,这就是为什么需要花费一些时间的原因。简单地说,这意味着第二个请求直到第一个请求完成才开始 把它想象成一条传送带和一堆箱子,你有一个工人来处理每个箱子 工人一次只能处理一个箱子;他必须等待处理完成,然后才能开始处理另一个箱子(换句话说,他不能从皮带上拿一个箱子,把它扔到某个地方进行处理,然后回来再拣另一个) 要减少处理方框所需的时间,您可以:
谢谢你全面的回答。它确实更快了,但是
结果
变成了响应
对象的列表,而不是项目,这是令人惊讶的。有什么办法解决这个问题吗?它有一堆响应对象的原因是因为这是从grequests.map(rq)
返回的。有关将其映射回原始项的方法,请参阅更新。
import grequests
# Create a map between url and the item
url_to_item = {item.item_low_url: item for item in items}
# Create a request queue, but don't send them
rq = (grequests.head(url) for url in url_to_item.keys())
# Send requests simultaneously, and collect the results,
# and filter those that are valid
# Each item returned in the Response object, which has a request
# property that is the original request to which this is a response;
# we use that to filter out the item objects
results = [url_to_item[i.request.url]
for i in filter(lambda x: x.status_code == 200,
grequests.map(rq)))]