日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

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

翻譯:大江狗

原文鏈接: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 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,則可能需要說明以下幾點:

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

注意:請求處理程序不必一定是協程,它們可以是常規函數。但是我們將使用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個參數:

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

響應數據里我們將獲得一張照片列表,每張照片均帶有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)

到底發生了什么事?

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

這里發生了一些新的事情:

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

注意:在此代碼中,我們刪除了重定向(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 異步抓取火星圖片的詳細內容,更多關于python AioHttp 抓取火星圖片的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
999精品一区| 69精品国产久热在线观看| 亚洲精品无播放器在线播放| 亚洲综合在线电影| 日韩成人亚洲| 日韩一区二区三区在线免费观看| 精品中文字幕一区二区三区四区| 国产精品xxxav免费视频| 少妇精品久久久| 午夜视频精品| 美女精品网站| 99国产精品视频免费观看一公开| 久久久夜夜夜| xxxxx性欧美特大| 九九99久久精品在免费线bt| 免费观看亚洲天堂| 成人国产精品| 国产色播av在线| 日韩av二区| 久久久水蜜桃av免费网站| 久久精品导航| 国产一区二区视频在线看| 天堂а√在线最新版中文在线| 老司机精品在线| 黄毛片在线观看| 国产v日韩v欧美v| 中文字幕在线看片| 国产精品亚洲片在线播放| 水蜜桃久久夜色精品一区| 国产va免费精品观看精品视频| 青草综合视频| 国产精品17p| 亚洲日产av中文字幕| 久久国产免费看| 国产极品嫩模在线观看91精品| 国产精品99精品一区二区三区∴ | 91视频一区| 亚洲www免费| 亚洲一区成人| 国产日韩中文在线中文字幕| 激情欧美一区| 国产精品高清一区二区| 亚洲成人免费| 成人免费电影网址| 鲁鲁在线中文| 色网在线免费观看| 欧美黄色精品| 日韩精品导航| 久久亚洲黄色| 国产精品一区二区av日韩在线| 欧美一区二区三区久久| 爽爽淫人综合网网站| 老司机精品视频在线播放| 久久麻豆视频| 国产精品片aa在线观看| 精品国产亚洲一区二区三区| 新版的欧美在线视频| 美女亚洲一区| 亚洲tv在线| 久久成人国产| 久久精品国内一区二区三区水蜜桃| 日韩视频网站在线观看| 蜜桃久久av| 中文字幕日韩高清在线| 9国产精品视频| 激情六月综合| 99久久夜色精品国产亚洲1000部| 欧美日韩精品一区二区视频| 国产精品普通话对白| 亚洲欧美久久精品| 欧美一区免费| 国户精品久久久久久久久久久不卡| 亚洲欧洲国产精品一区| 久久a爱视频| 激情欧美亚洲| 欧美激情网址| 欧美一区二区性| 日韩精品免费视频一区二区三区| 久久久777| 国产精品亚洲欧美| 狠狠操综合网| 国产精品欧美三级在线观看| 欧美 日韩 国产一区二区在线视频| 婷婷久久免费视频| 精品日产乱码久久久久久仙踪林| 亚洲国产一区二区在线观看| 国产精品乱战久久久| 国产亚洲一区二区手机在线观看| 国产亚洲高清一区| 久久一级电影| 国产精品久久国产愉拍| 美日韩精品视频| 中文字幕人成乱码在线观看| 国产亚洲一区二区三区不卡| 久久国产亚洲| 国产精品22p| 日本不卡高清视频| 亚洲香蕉网站| 乱一区二区av| 日韩不卡在线观看日韩不卡视频| 久久国产电影| 911亚洲精品| 蜜桃视频在线观看一区二区| 日韩欧美一区二区三区免费看| 久久国产三级| 一区二区国产在线观看| 亚洲精品国产嫩草在线观看 | 日韩精品一区二区三区免费观影| 国产精品成人**免费视频| 免费中文字幕日韩欧美| 国产精品一区二区99| 日韩精品免费视频一区二区三区| 红桃视频国产一区| 国产美女亚洲精品7777| 亚洲图片久久| japanese国产精品| 日韩中文在线电影| www.51av欧美视频| 亚洲精品伊人| 综合亚洲色图| 老牛影视一区二区三区| 欧美欧美黄在线二区| 综合激情视频| 国产视频一区在线观看一区免费| 中文字幕乱码亚洲无线精品一区| 精品国产精品久久一区免费式| 夜夜嗨网站十八久久| 激情综合在线| 国产精品流白浆在线观看| 亚洲最大av| 午夜日韩影院| 久久久久久久久丰满| 国产一区二区三区四区五区传媒| 国产欧美一区二区精品久久久 | 亚洲精华国产欧美| 欧美一区久久| 欧美成人基地| 亚洲精品一级二级| 亚洲二区三区不卡| 国产精品日韩欧美一区| 婷婷亚洲五月色综合| 国产91在线播放精品| 日韩黄色大片| 青青草国产成人99久久| 日本中文字幕一区二区| 一区二区高清| 日韩精品永久网址| 日韩免费看片| 秋霞影院一区二区三区| 亚洲午夜电影| 蜜桃91丨九色丨蝌蚪91桃色| 免播放器亚洲| 亚洲精品护士| 国产精品成人3p一区二区三区| 麻豆高清免费国产一区| 精品国产黄a∨片高清在线| 亚洲三级国产| 国产欧洲在线| 亚洲在线久久| 蜜桃成人精品| 亚洲欧美日韩综合国产aⅴ| 久久中文字幕一区二区| 亚洲一卡久久| 波多视频一区| 亚洲夜间福利| 精品国产乱码久久久久久樱花 | 99久久久久久中文字幕一区| 最新日韩欧美| 亚洲精品伊人| 大香伊人久久精品一区二区| 亚洲91视频| 日韩中文字幕一区二区高清99| 久久在线91| 亚洲自啪免费| 麻豆久久久久久久| 免费观看不卡av| 91亚洲精品在看在线观看高清| 精品视频自拍| aa国产精品| 麻豆精品av| 国产精品免费看| 久久国产中文字幕| 日韩精品2区| 国产成人免费| 欧美成人精品午夜一区二区| 日韩专区视频网站| 少妇精品久久久| 欧美一区成人| 麻豆高清免费国产一区| 国产专区一区| 国产伦精品一区二区三区在线播放 | 国产美女撒尿一区二区| 久久国产欧美日韩精品| 亚洲三级毛片| 久久国产麻豆精品| 精品国产一区二区三区性色av| 国内精品伊人| 欧美日中文字幕| 日韩av一区二区在线影视| 欧美影院精品|