• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python 基于AioHttp 异步抓取火星图片

    翻译:大江狗

    原文链接:https://pfertyk.me/2017/06/getting-mars-photos-from-nasa-using-aiohttp/

    小编注:aiohttp是基于asyncio实现的异步http框架。

    本文案例也可以使用异步django实现。

    我是Andy Weir写的《火星人》一书的忠实粉丝。阅读时,我想知道马克·沃特尼(Mark Watney)绕着红色星球走的感觉如何。最近,多亏了 Twilio的这篇博文, 我发现NASA提供了一个公共API,可以提供火星漫游者拍摄的照片。但是,由于不是MMS的忠实拥护者,我决定编写自己的应用程序,以将具有启发性的图像直接传递到我的浏览器中。

    创建aiohttp应用程序

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

    pip install aiohttp

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

    from aiohttp import web
    
    async 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-devtools
    adev 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 random
    
    from aiohttp import web, ClientSession
    from aiohttp.web import HTTPFound
    
    NASA_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密钥。您可以在此处进行操作 (注册过程非常简单快捷)。

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

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

    验证图像

    您刚刚看到的图像并不让人受到启发。事实证明,漫游者拍摄了很多非常无聊的照片。我想看看马克·沃特尼(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_bytes
    
    
    async 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 io
    from PIL import Image
    
    async def validate_image(image_bytes):
     image = Image.open(io.BytesIO(image_bytes))
     return image.width >= 1024 and image.height >= 1024

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

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

    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'

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

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

    总结

    我们整个程序如下所示:

    import random
    import io
    
    from aiohttp import web, ClientSession
    
    from PIL import Image
    
    NASA_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_bytes
    
    
    async 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 异步抓取火星图片的详细内容,更多关于python AioHttp 抓取火星图片的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • Python中使用aiohttp模拟服务器出现错误问题及解决方法
    • Python requests及aiohttp速度对比代码实例
    • Python aiohttp百万并发极限测试实例分析
    • python aiohttp的使用详解
    • Python中利用aiohttp制作异步爬虫及简单应用
    • Python中asyncio与aiohttp入门教程
    • Python爬虫抓取指定网页图片代码实例
    • python requests抓取one推送文字和图片代码实例
    • Python3简单爬虫抓取网页图片代码实例
    • Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
    • Python爬虫实现抓取京东店铺信息及下载图片功能示例
    • Python爬虫之网页图片抓取的方法
    • python抓取网站的图片并下载到本地的方法
    上一篇:python 绘制斜率图进行对比分析
    下一篇:Python使用openpyxl复制整张sheet
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python 基于AioHttp 异步抓取火星图片 python,基于,AioHttp,异步,抓取,