国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

python 基于AioHttp 異步抓取火星圖片

瀏覽:86日期:2022-06-24 14:10:52

翻譯:大江狗

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

小編注:aiohttp是基于asyncio實(shí)現(xiàn)的異步http框架。

本文案例也可以使用異步django實(shí)現(xiàn)。

我是Andy Weir寫的《火星人》一書的忠實(shí)粉絲。閱讀時,我想知道馬克·沃特尼(Mark Watney)繞著紅色星球走的感覺如何。最近,多虧了 Twilio的這篇博文, 我發(fā)現(xiàn)NASA提供了一個公共API,可以提供火星漫游者拍攝的照片。但是,由于不是MMS的忠實(shí)擁護(hù)者,我決定編寫自己的應(yīng)用程序,以將具有啟發(fā)性的圖像直接傳遞到我的瀏覽器中。

創(chuàng)建aiohttp應(yīng)用程序

讓我們從一個簡單的應(yīng)用程序開始,只是為了啟動和運(yùn)行aiohttp。首先,創(chuàng)建一個新的virtualenv。建議使用Python 3.5以后版本,因為我們將使用asyncio提供的async def和await語法。如果您想進(jìn)一步開發(fā)該項目并利用異步理解的優(yōu)勢,則可以使用Python 3.6(本例使用python版本)。接下來,安裝aiohttp:

pip install aiohttp

現(xiàn)在創(chuàng)建一個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,則可能需要說明以下幾點(diǎn):

get_mars_photo協(xié)程是一個請求處理程序;它以HTTP請求作為唯一參數(shù),并負(fù)責(zé)返回HTTP響應(yīng)(或引發(fā)異常) app是高級服務(wù)器;它支持路由器,中間件和信號(對于該程序,我們將僅使用路由器) app.router.add_get 在HTTP GET方法和’/’路徑上注冊請求處理程序

注意:請求處理程序不必一定是協(xié)程,它們可以是常規(guī)函數(shù)。但是我們將使用asyncio的功能,因此程序中的大多數(shù)函數(shù)都將使用進(jìn)行定義async def。

運(yùn)行應(yīng)用程序

要運(yùn)行您的應(yīng)用程序,您可以在文件末尾添加以下行:

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

然后像運(yùn)行其他任何Python腳本一樣運(yùn)行它:

python nasa.py

但是有更好的方法。在許多第三方庫中,您可以找到aiohttp-devtools。它提供了一個很好的runserver命令,可以自動檢測您的應(yīng)用并支持實(shí)時重載:

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

現(xiàn)在如果您訪問localhost:8080,則應(yīng)該在瀏覽器中看到'A photo of mars'的字樣。

使用NASA API

當(dāng)然,這還沒有結(jié)束。如果您是一位敏銳的觀察者,您會注意到我們沒有得到實(shí)際的圖像,而是一些文本。現(xiàn)在讓我們解決這個問題。

要從火星獲取照片,我們將使用NASA API。每個火星探路者(rover)都有自己的URL(對于好奇號,它url是https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos)。我們必須為每個請求至少提供2個參數(shù):

sol:火星輪轉(zhuǎn)或拍攝照片的日期,從探路者的著陸日期開始算起(最大值可以rover/max_sol在響應(yīng)的一部分中找到 ) API_KEY:由美國航天局提供的API密鑰(你可以使用默認(rèn)的:DEMO_KEY)

響應(yīng)數(shù)據(jù)里我們將獲得一張照片列表,每張照片均帶有URL,相機(jī)信息和探路者信息。

修改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)

到底發(fā)生了什么事?

我們選擇一個隨機(jī)拍攝日期(對于“好奇心” max_sol,在撰寫本文時,其值為1722) ClientSession 創(chuàng)建一個會話,我們可以使用該會話從NASA API獲取響應(yīng) 我們使用獲取JSON響應(yīng) resp.json() 我們檢查響應(yīng)中是否存在“照片”鍵;如果沒有,我們已經(jīng)達(dá)到了每小時請求數(shù)量的上限,我們需要稍等片刻 如果當(dāng)天沒有照片,我們會再次檢查是否有其他拍攝時間 然后,我們使用HTTPFound響應(yīng)重定向到找到的照片 獲取NASA API密鑰

DEMO_KEYNASA提供的默認(rèn)設(shè)置可以正常工作,但是您很快就會達(dá)到每小時API調(diào)用的限制。我建議您獲取自己的API密鑰。您可以在此處進(jìn)行操作 (注冊過程非常簡單快捷)。

現(xiàn)在,當(dāng)您運(yùn)行該應(yīng)用程序時,您將直接從火星重定向到一個漂亮的圖像:

python 基于AioHttp 異步抓取火星圖片

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

驗證圖像

您剛剛看到的圖像并不讓人受到啟發(fā)。事實(shí)證明,漫游者拍攝了很多非常無聊的照片。我想看看馬克·沃特尼(Mark Watney)在他不可思議的旅程中所看到的,但這還不夠好。讓我們找到一種解決方法。

我們將需要對圖像進(jìn)行某種形式的驗證。在指定篩選條件前,我們可以修改代碼:

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’)

這里發(fā)生了一些新的事情:

我們使用先前定義的函數(shù)獲取URL,然后使用讀取圖像中的原始字節(jié) resp.read() 我們檢查我們的圖片是否足夠好;如果沒有,我們一直在尋找 一旦有了令人滿意的照片,我們會將其放入響應(yīng)中(注意,我們?nèi)匀皇褂门cweb.Response以前相同的照片,但是這次我們指定body 而不是text,同時了定義content_type

注意:在此代碼中,我們刪除了重定向(HTTPFound),因此現(xiàn)在我們可以輕松地刷新頁面以獲取另一個圖像。

現(xiàn)在我們需要弄清楚如何驗證照片。我們可以很容易做到的一件事就是檢查圖像尺寸否足夠大。這不是一個完美的驗證,但現(xiàn)在應(yīng)該這樣做。要處理圖像,我們將需要python的圖片庫Pillow。

pip install pillow

我們的驗證函數(shù)可能如下所示:

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

現(xiàn)在刷新瀏覽器,應(yīng)該可以看到火星大圖了。

python 基于AioHttp 異步抓取火星圖片

現(xiàn)在我們可以更進(jìn)一步,拒絕灰度圖像:

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’

現(xiàn)在我們的程序開始返回更多鼓舞人心的照片:

python 基于AioHttp 異步抓取火星圖片

偶爾還能看到機(jī)器人自拍:

python 基于AioHttp 異步抓取火星圖片

總結(jié)

我們整個程序如下所示:

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),但是現(xiàn)在它已經(jīng)完成了工作:我們可以得到一張隨機(jī)的,鼓舞人心的火星照片,并覺得我們確實(shí)在那里。

我希望您喜歡這個簡短的教程。如果您發(fā)現(xiàn)錯誤或有任何疑問,請告訴我。

以上就是python 基于AioHttp 異步抓取火星圖片的詳細(xì)內(nèi)容,更多關(guān)于python AioHttp 抓取火星圖片的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产一级毛片卡 | 九色自拍视频 | 欧美成人精品第一区 | 99久久免费精品视频 | 亚洲视频在线观看免费 | 日本一本色道 | 欧美一级毛片日韩一级 | 性日韩精品 | 免费国产黄网站在线观看视频 | 成人全黄三级视频在线观看 | www.色中色 | 亚洲香蕉一区二区三区在线观看 | 搞黄网站在线观看 | 成人免费视频社区 | 国产高清国产专区国产精品 | 精品视频久久久久 | 欧美日韩日本国产 | 欧美亚洲午夜 | 亚洲国产第一 | 国产成人久久精品推最新 | f性欧美| 欧美另类特大 | 精品国产高清a毛片无毒不卡 | 日韩亚洲欧美综合一区二区三区 | 亚洲欧美国产高清va在线播放 | 国产免费一区二区三区在线观看 | 国产成人精品视频播放 | 一级特黄特色的免费大片视频 | 美女张开大腿让男人捅 | 欧美国产在线观看 | 欧美整片在线 | 国产亚洲精品国产第一 | 国产精品久久久久毛片真精品 | 日本久久综合 | 成人精品在线观看 | 91青青国产在线观看免费 | 日本aa毛片a级毛片免费观看 | 欧美精品亚洲精品日韩 | 日韩一区三区 | 欧美日韩一区二区不卡三区 | 成人国产精品一区二区网站 |