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

  介绍

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

创建AioHttp应用程序

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

pip  install  AioHttp

现在创建一个python文件(称为美国航空航天局。py),并将一些代码放入其中:

得到aiohttp  import 网络      async  def  get_mars_photo(请求):   ,return  web.Response(文本=& # 39;A  photo  of 火星# 39;)      时间=app  web.Application ()   app.router.add_get (& # 39;/& # 39;,, get_mars_photo,, name=& # 39; mars_photo& # 39;)

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

<李>

get_mars_photo协程是一个请求处理程序,它以HTTP请求作为唯一参数,并负责返回HTTP响应(或引发异常)

<李>

应用程序是高级服务器;它支持路由器,中间件和信号(对于该程序,我们将仅使用路由器)

<李>

app.router。add_get在HTTP GET方法和& # 39;/& # 39;路径上注册请求处理程序

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

运行应用程序

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

web.run_app(应用,,主机=& # 39;127.0.0.1 # 39;,,端口=8080)

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

python 美国航空航天局。py

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

pip  install  aiohttp-devtools   adev  runserver  -p  8080年,nasa.py

现在如果您访问localhost: 8080年,则应该在浏览器中看到“mars"照片的字样。

使用NASA API

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

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

<李>

索尔:火星轮转或拍摄照片的日期,从探路者的着陆日期开始算起(最大值可以罗孚/max_sol在响应的一部分中找到)

<李>

API_KEY:由美国航天局提供的API密钥(你可以使用默认的:DEMO_KEY)

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

修改NASA。py文件,如下所示:

import 随机的      得到aiohttp  import 网络,ClientSession   得到aiohttp.web  import  HTTPFound      时间=NASA_API_KEY  & # 39; DEMO_KEY& # 39;   时间=ROVER_URL  & # 39; https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos& # 39;         async  def  get_mars_image_url_from_nasa ():   ,while 真正的:   时间=sol 才能;random.randint (0, 1722)   params 才能=,{& # 39;溶胶# 39;:,索尔,,& # 39;api_key # 39;:, NASA_API_KEY}   async 才能;with  ClientSession (), as 会话:   ,,async  with  session.get (ROVER_URL, params=params), as 职责:   ,,,resp_dict =, await  resp.json ()   if 才能;& # 39;照片# 39;,not 拷贝resp_dict:   ,,raise 例外   时间=photos 才能;resp_dict[& # 39;照片# 39;】   if 才能;not 照片:   ,才能继续   return 才能;random.choice(照片)(& # 39;img_src& # 39;】         async  def  get_mars_photo(请求):=,,url  await  get_mars_image_url_from_nasa ()   ,return  HTTPFound (url)

到底发生了什么事?

<李>

我们选择一个随机拍摄日期(对于“好奇心”max_sol,在撰写本文时,其值为1722)

<李>

ClientSession创建一个会话,我们可以使用该会话从NASA API获取响应

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