文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python基于AioHttp异步抓取火星图片的案例

2023-06-14 06:46

关注

这篇文章主要介绍python基于AioHttp异步抓取火星图片的案例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

创建aiohttp应用程序

让我们从一个简单的应用程序开始,只是为了启动和运行aiohttp。首先,创建一个新的virtualenv。建议使用Python 3.5以后版本,因为我们将使用asyncio提供的async def和await语法。如果您想进一步开发该项目并利用异步理解的优势,则可以使用Python 3.6(本例使用python版本)。接下来,安装aiohttp:

pip install aiohttp

现在创建一个python文件(称为nasa.py),并将一些代码放入其中:

from aiohttp import webasync def get_mars_photo(request): return web.Response(text='A photo of Mars')app = web.Application()app.router.add_get('/', get_mars_photo, name='mars_photo')

如果您不熟悉aiohttp,则可能需要说明以下几点:

注意:请求处理程序不必一定是协程,它们可以是常规函数。但是我们将使用asyncio的功能,因此程序中的大多数函数都将使用进行定义async def。

运行应用程序

要运行您的应用程序,您可以在文件末尾添加以下行:

web.run_app(app, host='127.0.0.1', port=8080)

然后像运行其他任何Python脚本一样运行它:

python nasa.py

但是有更好的方法。在许多第三方库中,您可以找到aiohttp-devtools。它提供了一个很好的runserver命令,可以自动检测您的应用并支持实时重载:

pip install aiohttp-devtoolsadev runserver -p 8080 nasa.py

现在如果您访问localhost:8080,则应该在浏览器中看到"A photo of mars"的字样。

使用NASA API

当然,这还没有结束。如果您是一位敏锐的观察者,您会注意到我们没有得到实际的图像,而是一些文本。现在让我们解决这个问题。

要从火星获取照片,我们将使用NASA API。每个火星探路者(rover)都有自己的URL(对于好奇号,它url是https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos)。我们必须为每个请求至少提供2个参数:

响应数据里我们将获得一张照片列表,每张照片均带有URL,相机信息和探路者信息。

修改nasa.py文件,如下所示:

import randomfrom aiohttp import web, ClientSessionfrom aiohttp.web import HTTPFoundNASA_API_KEY = 'DEMO_KEY'ROVER_URL = 'https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos'async def get_mars_image_url_from_nasa(): while True:  sol = random.randint(0, 1722)  params = {'sol': sol, 'api_key': NASA_API_KEY}  async with ClientSession() as session:   async with session.get(ROVER_URL, params=params) as resp:    resp_dict = await resp.json()  if 'photos' not in resp_dict:   raise Exception  photos = resp_dict['photos']  if not photos:   continue  return random.choice(photos)['img_src']async def get_mars_photo(request): url = await get_mars_image_url_from_nasa() return HTTPFound(url)

到底发生了什么事?

获取NASA API密钥

DEMO_KEYNASA提供的默认设置可以正常工作,但是您很快就会达到每小时API调用的限制。我建议您获取自己的API密钥。您可以在此处进行操作 (注册过程非常简单快捷)。

现在,当您运行该应用程序时,您将直接从火星重定向到一个漂亮的图像:

python基于AioHttp异步抓取火星图片的案例

好吧,这不完全是我的意思...

验证图像

您刚刚看到的图像并不让人受到启发。事实证明,漫游者拍摄了很多非常无聊的照片。我想看看马克·沃特尼(Mark Watney)在他不可思议的旅程中所看到的,但这还不够好。让我们找到一种解决方法。

我们将需要对图像进行某种形式的验证。在指定筛选条件前,我们可以修改代码:

async def get_mars_photo_bytes(): while True:  image_url = await get_mars_image_url_from_nasa()  async with ClientSession() as session:   async with session.get(image_url) as resp:    image_bytes = await resp.read()  if await validate_image(image_bytes):   break return image_bytesasync def get_mars_photo(request): image = await get_mars_photo_bytes() return web.Response(body=image, content_type='image/jpeg')

这里发生了一些新的事情:

注意:在此代码中,我们删除了重定向(HTTPFound),因此现在我们可以轻松地刷新页面以获取另一个图像。

现在我们需要弄清楚如何验证照片。我们可以很容易做到的一件事就是检查图像尺寸否足够大。这不是一个完美的验证,但现在应该这样做。要处理图像,我们将需要python的图片库Pillow。

pip install pillow

我们的验证函数可能如下所示:

import iofrom PIL import Imageasync def validate_image(image_bytes): image = Image.open(io.BytesIO(image_bytes)) return image.width >= 1024 and image.height >= 1024

现在刷新浏览器,应该可以看到火星大图了。

python基于AioHttp异步抓取火星图片的案例

现在我们可以更进一步,拒绝灰度图像:

async def validate_image(image_bytes): image = Image.open(io.BytesIO(image_bytes)) return image.width >= 1024 and image.height >= 1024 and image.mode != 'L'

现在我们的程序开始返回更多鼓舞人心的照片:

python基于AioHttp异步抓取火星图片的案例

偶尔还能看到机器人自拍:

python基于AioHttp异步抓取火星图片的案例

总结

我们整个程序如下所示:

import randomimport iofrom aiohttp import web, ClientSessionfrom PIL import ImageNASA_API_KEY = 'DEMO_KEY'ROVER_URL = 'https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos'async def validate_image(image_bytes): image = Image.open(io.BytesIO(image_bytes)) return image.width >= 1024 and image.height >= 1024 and image.mode != 'L'async def get_mars_image_url_from_nasa(): while True:  sol = random.randint(0, 1722)  params = {'sol': sol, 'api_key': NASA_API_KEY}  async with ClientSession() as session:   async with session.get(ROVER_URL, params=params) as resp:    resp_dict = await resp.json()  if 'photos' not in resp_dict:   raise Exception  photos = resp_dict['photos']  if not photos:   continue  return random.choice(photos)['img_src']async def get_mars_photo_bytes(): while True:  image_url = await get_mars_image_url_from_nasa()  async with ClientSession() as session:   async with session.get(image_url) as resp:    image_bytes = await resp.read()  if await validate_image(image_bytes):   break return image_bytesasync def get_mars_photo(request): image = await get_mars_photo_bytes() return web.Response(body=image, content_type='image/jpeg')app = web.Application()app.router.add_get('/', get_mars_photo, name='mars_photo')

我们还可以改善很多事情(例如max_sol从API中获取价值,传递流动站的名称,缓存URL),但是现在它已经完成了工作:我们可以得到一张随机的,鼓舞人心的火星照片,并觉得我们确实在那里。

以上是“python基于AioHttp异步抓取火星图片的案例”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯