快速检查python中是否存在远程URL上的图像的方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了快速检查python中是否存在远程URL上的图像的方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1877字,纯文字阅读大概需要3分钟。
内容图文
我正在使用python-requests库来完成我的请求.
在网站的主页上,我收到了一堆图片并将其显示给用户.有时这些图像会被删除,我会得到一个破碎的图像网址.
所以我想检查图像是否存在.
这是我做的:
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)
但它需要的时间比我想要的要长一些.
有没有更快的方法?
解决方法:
您的请求是阻塞和同步的,这就是为什么它需要花费一些时间.简单来说,这意味着第二个请求在第一个请求完成之前不会启动.
可以把它想象成一个带有一堆盒子的传送带,你有一个工人来处理每个盒子.
工人一次只能处理一个盒子;他必须等待处理才能开始处理另一个盒子(换句话说,他不能从腰带上拿一个盒子,将它放在某处待处理,然后再拿回另一个盒子).
为了减少处理盒子所需的时间,您可以:
>减少处理每个盒子所需的时间.
>使它可以同时处理多个框(换句话说,工人不必等待).
>增加皮带和工人的数量,然后将皮带分开.
我们真的不能做#1,因为这个延迟来自网络(你可以减少超时时间,但不建议这样做).
相反,我们想做的是#2 – 因为一个盒子的处理是独立的,我们不需要等待一个盒子完成开始处理下一个盒子.
所以我们想要做以下事情:
>同时快速向服务器发送多个请求以获取URL.
>等待每个人完成(彼此独立).
>收集结果.
有多种方法可以做到这一点,在documentation for requests中列出;这是一个使用grequests的例子:
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)))]
内容总结
以上是互联网集市为您收集整理的快速检查python中是否存在远程URL上的图像的方法全部内容,希望文章能够帮你解决快速检查python中是否存在远程URL上的图像的方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。