最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)戰(zhàn)之異步獲取中國天氣信息

 更新時(shí)間:2022年03月07日 16:37:19   作者:Huterox  
這篇文章主要介紹了如何利用Python爬蟲異步獲取天氣信息,用的API是中國天氣網(wǎng)。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手試一試

前言

本來是想要更新scrapy的,但是怎么說呢,這玩意不難,看著官方文檔,基本上就能做,主要是前面的如果你的爬蟲基礎(chǔ)不好的話,這個(gè)scrapy你也玩不好,而且對于大部分的人來說安裝scrapy可能都是個(gè)問題,因?yàn)橛幸恍v史遺留的問題,畢竟是從python2過來的老框架。當(dāng)然還有個(gè)原因,我要做的東西,用不上scrapy,能夠用上scrapy如果只是做爬蟲,那必然是分布式爬蟲,但是我這里要做的可能只是一個(gè)客戶端,也就是一個(gè)spider采集軟件,所以這個(gè)scrapy沒法上。

目標(biāo)

今天我們要搞的是獲取天氣,用的API是中國天氣網(wǎng)。

BaseUrl = "http://wthrcdn.etouch.cn/weather_mini?city={}"

網(wǎng)上呢也有很多,那個(gè)直接爬取中國天氣網(wǎng)的爬蟲,但是我就是搞不懂,為啥非要去網(wǎng)頁里面然后去xpath或者正則去搞,明明用的都是同一個(gè)api出來的數(shù)據(jù),我為啥要去頁面把人家渲染后的結(jié)果去反向解析出數(shù)據(jù)?我直接拿數(shù)據(jù)不好嘛?

請求格式

回到這里,咱們的這個(gè)接口呢,是一個(gè)get請求,然后的話,那啥只需要把城市或者編號放在city那個(gè)字段就行了,返回結(jié)果是個(gè)json,我們把這玩意變成字典后是這樣的

{'data':
 {'yesterday': 
 {'date': '5日星期六', 'high': '高溫 16℃', 'fx': '東北風(fēng)', 'low': '低溫 9℃', 'fl': '<![CDATA[3級]]>', 'type': '多云'}, 
 'city': '九江',
  'forecast': [{'date': '6日星期天', 'high': '高溫 12℃', 'fengli': '<![CDATA[3級]]>', 'low': '低溫 7℃', 'fengxiang': '東北風(fēng)', 'type': '中雨'}, 
 {'date': '7日星期一', 'high': '高溫 14℃', 'fengli': '<![CDATA[2級]]>', 'low': '低溫 7℃', 'fengxiang': '北風(fēng)', 'type': '多云'}, 
 {'date': '8日星期二', 'high': '高溫 19℃', 'fengli': '<![CDATA[2級]]>', 'low': '低溫 8℃', 'fengxiang': '東南風(fēng)', 'type': '晴'}, 
 {'date': '9日星期三', 'high': '高溫 21℃', 'fengli': '<![CDATA[2級]]>', 'low': '低溫 11℃', 'fengxiang': '東南風(fēng)', 'type': '晴'},
 {'date': '10日星期四', 'high': '高溫 23℃', 'fengli': '<![CDATA[1級]]>', 'low': '低溫 11℃', 'fengxiang': '南風(fēng)', 'type': '多云'}
 ], 
 'ganmao': '感冒多發(fā)期,適當(dāng)減少外出頻率,適量補(bǔ)充水分,適當(dāng)增減衣物。', 'wendu': '8'}, 'status': 1000, 'desc': 'OK'}

請求限制

這里不得不說一下,中國天氣網(wǎng) yyds 這個(gè)接口完全沒有限制。為啥,我要做的是獲取全國的天氣信息,包括縣城,中國大大小小幾千個(gè)縣城,而且還要分時(shí)段去分析,所以每天的請求訪問至少2w起步。如果有限制的話,咱們就得那啥反反爬了,但是通過我的測試,沒問題。

requests非異步獲取

來,我們來先做一個(gè)對比,沒有對比就沒有傷害是吧,由于非常簡單我就直接上代碼了。

import requests
from datetime import datetime

class GetWeather(object):

    urlWheather = "http://wthrcdn.etouch.cn/weather_mini?city={}"
    requests = requests
    error = {}
    today = datetime.today().day
    weekday = datetime.today().weekday()
    week = {0:"星期一",1:"星期二",2:"星期三",3:"星期四",4:"星期五",5:"星期六",6:"星期天"}

    def __getday(self)->str:
        day = str(self.today)+"日"+self.week.get(self.weekday)
        return day


    def get_today_wheather(self,city:str)->dict:

        data = self.getweather(city)
        data = data.get("data").get("forecast")
        today = self.__getday()
        for today_w in data:
            if(today_w.get("date")==today):
                return today_w

    def getweather(self,city:str,timeout:int=3)->dict:
        url = self.urlWheather.format(city)
        try:
            resp = self.requests.get(url,timeout=timeout)
            jsondata =  resp.json()
            return jsondata
        except Exception as e:
            self.error['error'] = "天氣獲取異常"
            return self.error
    def getweathers(self,citys:list,timeout:int=3):
        wheathers_data = {}
        for city in citys:
            url = self.urlWheather.format(city)
            try:
                resp = self.requests.get(url=url,timeout=timeout)
                wheather_data = resp.json()
                wheathers_data[city]=wheather_data
            except Exception as e:
                self.error['error'] = "天氣獲取異常"
                return self.error

        return wheathers_data



if __name__ == '__main__':
    getwheather = GetWeather()

    start = time.time()
    times = 1
    for i in range(5000):
        data = getwheather.get_today_wheather("九江")
        if((times%100==0)):
            print(data,"第",times,"次訪問")
        times+=1

    print("訪問",times,"次耗時(shí)",time.time()-start,"秒")

這段代碼呢,我做了一個(gè)簡單的封裝。 我們來看看結(jié)果,5000次訪問花了多久

這里我5000次重復(fù)訪問的是同一個(gè)城市 九江

異步獲取

這個(gè)代碼的話我是沒有封裝的,所以看起來比較亂。 這里有幾個(gè)注意點(diǎn)先說一下

系統(tǒng)上限

由于這個(gè),異步的話還是使用的操作系統(tǒng)的一個(gè)底層嘛,所以這個(gè)并發(fā)是有上限的,因?yàn)檫@個(gè)協(xié)程異步是要不斷切換的是吧。看起來有點(diǎn)像python自己的多線程,只是這個(gè)“多線程”完全是當(dāng)IO的時(shí)候才會(huì)切換,不然不會(huì)切換。 所以喲啊限制一下

編碼

import time

import aiohttp
from datetime import datetime
import asyncio

BaseUrl = "http://wthrcdn.etouch.cn/weather_mini?city={}"

WeekIndex = {0:"星期一",1:"星期二",2:"星期三",3:"星期四",4:"星期五",5:"星期六",6:"星期天"}

today = datetime.today().day
day = str(today)+"日"+WeekIndex.get(datetime.today().weekday())

TIMES = 0

async def request(city:str,semaphore:asyncio.Semaphore,timeout:int = 3):
    url = BaseUrl.format(city)
    try:
        async with semaphore:
            async with aiohttp.request("GET", url) as resp:
                data = await resp.json(content_type='')
                return data
    except Exception as e:
        raise e


def getwheater(task):
    data = task.result()
    return data

def get_today_weather(task):
    global TIMES
    data = task.result() #得到返回結(jié)果

    data = data.get("data").get("forecast")

    for today_w in data:
        if (today_w.get("date") == day):
            TIMES+=1#只有IO操作的時(shí)候才會(huì)切換,所以這個(gè)++操作還是一個(gè)原子性操作
            if(TIMES%100==0):
                print(today_w,"第",TIMES,"次訪問")
            return today_w



if __name__ == '__main__':
    semaphore = asyncio.Semaphore(500)
    #操作系統(tǒng)上限是同一個(gè)時(shí)刻509/1024個(gè)并發(fā),windows509 linux 1024
    start = time.time()
    tasks = []
    for i in range(5000):
        c = request("九江",semaphore,3)
        task = asyncio.ensure_future(c)
        task.add_done_callback(get_today_weather)
        tasks.append(task)
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))
    print("耗時(shí)",time.time() - start,"秒")

到此這篇關(guān)于Python實(shí)戰(zhàn)之異步獲取中國天氣信息的文章就介紹到這了,更多相關(guān)Python獲取天氣信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實(shí)現(xiàn)創(chuàng)建詞云的示例詳解

    Python實(shí)現(xiàn)創(chuàng)建詞云的示例詳解

    詞云一般是根據(jù)輸入的大量詞語生成的,如果某個(gè)詞語出現(xiàn)的次數(shù)越多,那么相應(yīng)的大小就會(huì)越大,本文將利用wordcloud模塊實(shí)現(xiàn)詞云生成,需要的可以參考下
    2023-10-10
  • python實(shí)現(xiàn)自動(dòng)打卡小程序

    python實(shí)現(xiàn)自動(dòng)打卡小程序

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動(dòng)打卡小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 為什么你還不懂得怎么使用Python協(xié)程

    為什么你還不懂得怎么使用Python協(xié)程

    這篇文章主要給大家介紹了關(guān)于為什么你還不懂得怎么使用Python協(xié)程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 基于Python開發(fā)PPTX壓縮工具

    基于Python開發(fā)PPTX壓縮工具

    在日常辦公中,PPT文件往往因?yàn)閳D片過大而導(dǎo)致文件體積過大,不便于傳輸和存儲(chǔ),所以本文將使用Python開發(fā)一個(gè)PPTX壓縮工具,需要的可以了解下
    2025-02-02
  • django模型層(model)進(jìn)行建表、查詢與刪除的基礎(chǔ)教程

    django模型層(model)進(jìn)行建表、查詢與刪除的基礎(chǔ)教程

    這篇文章主要給大家介紹了關(guān)于django模型層(model)進(jìn)行建表、查詢與刪除的等基礎(chǔ)操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • jupyter notebook讀取/導(dǎo)出文件/圖片實(shí)例

    jupyter notebook讀取/導(dǎo)出文件/圖片實(shí)例

    這篇文章主要介紹了jupyter notebook讀取/導(dǎo)出文件/圖片實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python多線程URL性能優(yōu)化方法詳解

    Python多線程URL性能優(yōu)化方法詳解

    這篇文章主要介紹了Python多線程URL性能優(yōu)化方法,本文將通過一個(gè)實(shí)際案例,詳細(xì)介紹如何使用ThreadPoolExecutor實(shí)現(xiàn)多線程URL處理,并加入時(shí)間統(tǒng)計(jì)功能進(jìn)行性能分析,需要的朋友可以參考下
    2025-04-04
  • Python3實(shí)現(xiàn)轉(zhuǎn)換Image圖片格式

    Python3實(shí)現(xiàn)轉(zhuǎn)換Image圖片格式

    本篇文章給大家分享了Python3實(shí)現(xiàn)在線轉(zhuǎn)換Image圖片格式的功能以及相關(guān)實(shí)例代碼,有興趣的朋友參考下。
    2018-06-06
  • python數(shù)據(jù)分析之線性回歸選擇基金

    python數(shù)據(jù)分析之線性回歸選擇基金

    這篇文章主要介紹了python數(shù)據(jù)分析之線性回歸選擇基金,文章基于前幾篇的文章內(nèi)容展開詳細(xì)的基金的趨勢分析,感興趣的小伙伴可以參考一下
    2022-05-05
  • python中有關(guān)時(shí)間日期格式轉(zhuǎn)換問題

    python中有關(guān)時(shí)間日期格式轉(zhuǎn)換問題

    這篇文章主要介紹了python中有關(guān)時(shí)間日期格式轉(zhuǎn)換問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評論

比如县| 博客| 松原市| 且末县| 德昌县| 北票市| 淳化县| 靖西县| 额尔古纳市| 光山县| 景泰县| 惠州市| 民勤县| 广安市| 秦安县| 伊金霍洛旗| 九寨沟县| 永仁县| 临沧市| 富宁县| 浪卡子县| 车险| 南郑县| 洛南县| 普格县| 南平市| 冀州市| 年辖:市辖区| 七台河市| 家居| 边坝县| 集贤县| 云安县| 江山市| 凭祥市| 故城县| 宁海县| 龙山县| 广南县| 丰镇市| 东阿县|