这篇文章主要介绍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获取响应