一、介紹
我們先來(lái)看一下實(shí)現(xiàn)的程序有什么功能:
功能也是非常簡(jiǎn)單的,輸入城市,顯示當(dāng)前城市、當(dāng)前日期時(shí)間、溫度和天氣。
API使用的是國(guó)家氣象局的接口,完全免費(fèi)的:
t.weather.sojson.com/api/weather… 這個(gè)是以北京為例的接口,其中最后的數(shù)字101010100就是北京的城市代碼。查詢(xún)其它城市只需要把城市代碼修改成其它城市的就可以了。
因?yàn)檫@個(gè)API的訪問(wèn)只能通過(guò)城市代碼,在這方面還是有點(diǎn)麻煩的,不過(guò)我把城市代碼整理出了一個(gè)json文件,稍后會(huì)為大家講解這個(gè)過(guò)程。
二、返回?cái)?shù)據(jù)
這里以南昌為例,因?yàn)榉祷氐臄?shù)據(jù)比較多,就不完整的列舉了。請(qǐng)求成功時(shí),大致數(shù)據(jù)如下:
里面還有很多沒(méi)有拉開(kāi)的地方,然后我們嘗試訪問(wèn)一個(gè)錯(cuò)誤的城市代碼:
t.weather.sojson.com/api/weather… 其中1是非法的城市代碼,我們看一下數(shù)據(jù):
{
"message": "Request resource not found.",
"status": 404
}
復(fù)制代碼
兩者都有一個(gè)status,也就是狀態(tài)碼。當(dāng)狀態(tài)碼為200時(shí),說(shuō)明請(qǐng)求正常完成。404就是我們經(jīng)常看見(jiàn)的,意思就是沒(méi)找到。
二、代碼講解
代碼是非常簡(jiǎn)單的,主要就是使用了兩個(gè)模塊:requests、json。一個(gè)網(wǎng)絡(luò)請(qǐng)求,一個(gè)json解析。
import requests, json
#api地址
url = 'http://t.weather.sojson.com/api/weather/city/'
#輸入城市中文
city = input("請(qǐng)輸入你要查詢(xún)的城市:")
#讀取json文件
f = open('city.json', 'rb')
#使用json模塊的load方法加載json數(shù)據(jù),返回一個(gè)字典
cities = json.load(f)
#通過(guò)城市的中文獲取城市代碼
city = cities.get(city)
#網(wǎng)絡(luò)請(qǐng)求,傳入請(qǐng)求api+城市代碼
response = requests.get(url + city)
#將數(shù)據(jù)以json形式返回,這個(gè)d就是返回的json數(shù)據(jù)
d = response.json()
#當(dāng)返回狀態(tài)碼為200,輸出天氣狀況
if(d['status'] == 200):
print("城市:", d["cityInfo"]["parent"], d["cityInfo"]["city"])
print("時(shí)間:", d["time"], d["data"]["forecast"][0]["week"])
print("溫度:", d["data"]["forecast"][0]["high"], d["data"]["forecast"][0]["low"])
print("天氣:", d["data"]["forecast"][0]["type"])
復(fù)制代碼
代碼方面沒(méi)有特別難的地方,就是在輸出的時(shí)候需要自己對(duì)json數(shù)據(jù)有一些了解,然后根據(jù)自己需要的內(nèi)容,輸出即可。自己可以嘗試請(qǐng)求,然后用HiJson格式化一下,或者也有許多在線(xiàn)格式化的網(wǎng)址,然后分析自己需要的數(shù)據(jù)。
三、將城市代碼轉(zhuǎn)為json數(shù)據(jù)(Excel技巧)
接下來(lái)講講我是如下和城市代碼斗爭(zhēng)的,下面這段大家可以不用看。代碼中使用到的city.json文件我會(huì)在文末上傳。
因?yàn)槲覜](méi)有找到獲取城市代碼的接口,只找到了下面這段文字:
北京:101010100朝陽(yáng):101010300順義:101010400懷柔:101010500通州:101010600昌平:101010700延慶:101010800豐臺(tái):101010900石景山:101011000大興:101011100房山:101011200密云:101011300門(mén)頭溝:101011400平谷:101011500八達(dá)嶺:101011600佛爺頂:101011700湯河口:101011800密云上甸子:101011900齋堂:101012000霞云嶺:101012100北京城區(qū):101012200海淀:101010200天津:101030100寶坻:101030300東麗:101030400西青:101030500北辰:101030600薊縣:101031400漢沽:101030800靜海:101030900津南:101031000塘沽:101031100大港:101031200武清:101030200寧河:101030700上海:101020100寶山:101020300嘉定:101020500南匯:101020600浦東:101021300青浦:101020800松江:101020900奉賢:101021000崇明:101021100徐家匯:101021200閔行:101020200金山:101020700石家莊:101090101張家口:101090301承德:101090402唐山:101090501秦皇島:101091101滄州:101090701衡水:101090801邢臺(tái):101090901邯鄲:101091001保定:101090201廊坊:101090601鄭州:101180101新鄉(xiāng):101180301許昌:101180401平頂山:101180501信陽(yáng):101180601南陽(yáng):101180701開(kāi)封:101180801洛陽(yáng):101180901商丘:101181001焦作:101181101鶴壁:101181201濮陽(yáng):101181301周口:101181401漯河:101181501駐馬店:101181601三門(mén)峽:101181701濟(jì)源:101181801安陽(yáng):101180201合肥:101220101蕪湖:101220301淮南:101220401馬鞍山:101220501安慶:101220601宿州:101220701阜陽(yáng):101220801亳州:101220901黃山:101221001滁州:101221101淮北:101221201銅陵:101221301宣城:101221401六安:101221501巢湖:101221601池州:101221701蚌埠:101220201杭州:101210101舟山:101211101湖州:101210201嘉興:101210301金華:101210901紹興:101210501臺(tái)州:101210601溫州:101210701麗水:101210801衢州:101211001寧波:101210401重慶:101040100合川:101040300南川:101040400江津:101040500萬(wàn)盛:101040600渝北:101040700北碚:101040800巴南:101040900長(zhǎng)壽:101041000黔江:101041100萬(wàn)州天城:101041200萬(wàn)州龍寶:101041300涪陵:101041400開(kāi)縣:101041500城口:101041600云陽(yáng):101041700巫溪:101041800奉節(jié):101041900巫山:101042000潼南:101042100墊江:101042200梁平:101042300忠縣:101042400石柱:101042500大足:101042600榮昌:101042700銅梁:101042800璧山:101042900豐都:101043000武隆:101043100彭水:101043200綦江:101043300酉陽(yáng):101043400秀山:101043600沙坪壩:101043700永川:101040200福州:101230101泉州:101230501漳州:101230601龍巖:101230701晉江:101230509南平:101230901廈門(mén):101230201寧德:101230301莆田:101230401三明:101230801蘭州:101160101平?jīng)?101160301慶陽(yáng):101160401武威:101160501金昌:101160601嘉峪關(guān):101161401酒泉:101160801天水:101160901武都:101161001臨夏:101161101合作:101161201白銀:101161301定西:101160201張掖:101160701廣州:101280101惠州:101280301梅州:101280401汕頭:101280501深圳:101280601珠海:101280701佛山:101280800肇慶:101280901湛江:101281001江門(mén):101281101河源:101281201清遠(yuǎn):101281301云浮:101281401潮州:101281501東莞:101281601中山:101281701陽(yáng)江:101281801揭陽(yáng):101281901茂名:101282001汕尾:101282101韶關(guān):101280201南寧:101300101柳州:101300301來(lái)賓:101300401桂林:101300501梧州:101300601防城港:101301401貴港:101300801玉林:101300901百色:101301001欽州:101301101河池:101301201北海:101301301崇左:101300201賀州:101300701貴陽(yáng):101260101安順:101260301都勻:101260401興義:101260906銅仁:101260601畢節(jié):101260701六盤(pán)水:101260801遵義:101260201凱里:101260501昆明:101290101紅河:101290301文山:101290601玉溪:101290701楚雄:101290801普洱:101290901昭通:101291001臨滄:101291101怒江:101291201香格里拉:101291301麗江:101291401德宏:101291501景洪:101291601大理:101290201曲靖:101290401保山:101290501呼和浩特:101080101烏海:101080301集寧:101080401通遼:101080501阿拉善左旗:101081201鄂爾多斯:101080701臨河:101080801錫林浩特:101080901呼倫貝爾:101081000烏蘭浩特:101081101包頭:101080201赤峰:101080601南昌:101240101上饒:101240301撫州:101240401宜春:101240501鷹潭:101241101贛州:101240701景德鎮(zhèn):101240801萍鄉(xiāng):101240901新余:101241001九江:101240201吉安:101240601武漢:101200101黃岡:101200501荊州:101200801宜昌:101200901恩施:101201001十堰:101201101神農(nóng)架:101201201隨州:101201301荊門(mén):101201401天門(mén):101201501仙桃:101201601潛江:101201701襄樊:101200201鄂州:101200301孝感:101200401黃石:101200601咸寧:101200701成都:101270101自貢:101270301綿陽(yáng):101270401南充:101270501達(dá)州:101270601遂寧:101270701廣安:101270801巴中:101270901瀘州:101271001宜賓:101271101內(nèi)江:101271201資陽(yáng):101271301樂(lè)山:101271401眉山:101271501涼山:101271601雅安:101271701甘孜:101271801阿壩:101271901德陽(yáng):101272001廣元:101272101攀枝花:101270201銀川:101170101中衛(wèi):101170501固原:101170401石嘴山:101170201吳忠:101170301西寧:101150101黃南:101150301海北:101150801果洛:101150501玉樹(shù):101150601海西:101150701海東:101150201海南:101150401濟(jì)南:101120101濰坊:101120601臨沂:101120901菏澤:101121001濱州:101121101東營(yíng):101121201威海:101121301棗莊:101121401日照:101121501萊蕪:101121601聊城:101121701青島:101120201淄博:101120301德州:101120401煙臺(tái):101120501濟(jì)寧:101120701泰安:101120801西安:101110101延安:101110300榆林:101110401銅川:101111001商洛:101110601安康:101110701漢中:101110801寶雞:101110901咸陽(yáng):101110200渭南:101110501太原:101100101臨汾:101100701運(yùn)城:101100801朔州:101100901忻州:101101001長(zhǎng)治:101100501大同:101100201陽(yáng)泉:101100301晉中:101100401晉城:101100601呂梁:101101100烏魯木齊:101130101石河子:101130301昌吉:101130401吐魯番:101130501庫(kù)爾勒:101130601阿拉爾:101130701阿克蘇:101130801喀什:101130901伊寧:101131001塔城:101131101哈密:101131201和田:101131301阿勒泰:101131401阿圖什:101131501博樂(lè):101131601克拉瑪依:101130201拉薩:101140101山南:101140301阿里:101140701昌都:101140501那曲:101140601日喀則:101140201林芝:101140401臺(tái)北縣:101340101高雄:101340201臺(tái)中:101340401海口:101310101三亞:101310201東方:101310202臨高:101310203澄邁:101310204儋州:101310205昌江:101310206白沙:101310207瓊中:101310208定安:101310209屯昌:101310210瓊海:101310211文昌:101310212保亭:101310214萬(wàn)寧:101310215陵水:101310216西沙:101310217南沙島:101310220樂(lè)東:101310221五指山:101310222瓊山:101310102長(zhǎng)沙:101250101株洲:101250301衡陽(yáng):101250401郴州:101250501常德:101250601益陽(yáng):101250700婁底:101250801邵陽(yáng):101250901岳陽(yáng):101251001張家界:101251101懷化:101251201黔陽(yáng):101251301永州:101251401吉首:101251501湘潭:101250201南京:101190101鎮(zhèn)江:101190301蘇州:101190401南通:101190501揚(yáng)州:101190601宿遷:101191301徐州:101190801淮安:101190901連云港:101191001常州:101191101泰州:101191201無(wú)錫:101190201鹽城:101190701哈爾濱:101050101牡丹江:101050301佳木斯:101050401綏化:101050501黑河:101050601雙鴨山:101051301伊春:101050801大慶:101050901七臺(tái)河:101051002雞西:101051101鶴崗:101051201齊齊哈爾:101050201大興安嶺:101050701長(zhǎng)春:101060101延吉:101060301四平:101060401白山:101060901白城:101060601遼源:101060701松原:101060801吉林:101060201通化:101060501沈陽(yáng):101070101鞍山:101070301撫順:101070401本溪:101070501丹東:101070601葫蘆島:101071401營(yíng)口:101070801阜新:101070901遼陽(yáng):101071001鐵嶺:101071101朝陽(yáng):101071201盤(pán)錦:101071301大連:101070201錦州:101070701
復(fù)制代碼
先將這段文字復(fù)制下來(lái),然后打開(kāi)Excel,選中一個(gè)單元,粘貼。就會(huì)有如下效果:
然后我們點(diǎn)擊北京,拖動(dòng)橫向滾動(dòng)條,按住shift,點(diǎn)擊最后一個(gè)數(shù)據(jù):
這樣就把整個(gè)數(shù)據(jù)全選了。然后復(fù)制,點(diǎn)擊北京下面一個(gè)單元格。右擊->選擇性復(fù)制->勾選轉(zhuǎn)置:
轉(zhuǎn)置后效果如下,
但是這樣有一個(gè)明顯的問(wèn)題,北京對(duì)應(yīng)的是101010100。而上面是朝陽(yáng)和101010100在一起,而且在同一單元格。我們先把數(shù)據(jù)拆成兩單元格。在“101010100朝陽(yáng)”單元格,選中“101010100”。復(fù)制到右邊(注意要先將格式設(shè)置為文本):?jiǎn)卧?,再選擇“朝陽(yáng)”,復(fù)制到下一個(gè)單元格:?jiǎn)卧?,然后分別點(diǎn)擊單元格1、單元格2,按ctrl+E,就有如下效果:
數(shù)據(jù)都被分開(kāi)了,然后我們把多余數(shù)據(jù)刪除。我們選中左邊列的數(shù)據(jù)(點(diǎn)開(kāi)頭,按shift,點(diǎn)結(jié)尾),剪切,然后點(diǎn)擊上一個(gè)單元格,復(fù)制:
然后就對(duì)齊了,現(xiàn)在我們?cè)俎D(zhuǎn)置回去。點(diǎn)擊左上角、按住shift、點(diǎn)擊右下角(有數(shù)據(jù)的區(qū)域),然后復(fù)制->點(diǎn)擊一個(gè)空白單元格->選擇性粘貼->轉(zhuǎn)置:
我把兩行對(duì)換位置,然后轉(zhuǎn)置的。轉(zhuǎn)置之后,我們將有效數(shù)據(jù)(橫向的數(shù)據(jù))復(fù)制。然后打開(kāi)瀏覽器:
www.bejson.com/json/col2js… 使用這個(gè)網(wǎng)址,將內(nèi)容復(fù)制進(jìn)去,點(diǎn)轉(zhuǎn)換就好了。效果如下,我們只需要將json文本保存一個(gè)文件就好了。
雖然API的請(qǐng)求確實(shí)是非常方便,但是把這個(gè)城市代碼確實(shí)麻煩。
代碼和文件還用HiJson我都上傳了百度云: 鏈接:pan.baidu.com/s/1_sGBFm0N… 提取碼:o5ay
前段時(shí)間,有位朋友在評(píng)論中提供了一個(gè)城市代碼的接口。在使用過(guò)程中還是遇到了一些問(wèn)題,然后我又找了一下,發(fā)現(xiàn)了另一個(gè)接口:
wthrcdn.etouch.cn/weather_min… 這個(gè)接口不需要傳城市代碼,直接傳入城市名稱(chēng)就可以了。然后代碼就可以改成:
import requests, json
weatherUrl = "http://wthrcdn.etouch.cn/WeatherApi?city=" #返回xml數(shù)據(jù)
weatherUrl = "http://wthrcdn.etouch.cn/weather_mini?city=" #返回json數(shù)據(jù)
cityName = input("請(qǐng)輸入你要查詢(xún)的城市:")
weatherResp = requests.get(weatherUrl + cityName)
d = weatherResp.json()
if(d['status'] >= 1000):
print("城市:", d["data"]["city"])
print("時(shí)間:", d["data"]["forecast"][0]["date"])
print("溫度:", d["data"]["forecast"][0]["high"], d["data"]["forecast"][0]["low"])
print("天氣:", d["data"]["forecast"][0]["type"])
復(fù)制代碼
因?yàn)檫@個(gè)結(jié)構(gòu)返回?cái)?shù)據(jù)正常是1000,所以判斷改成了==1000。一下就方便多了~
作者:ZackSock
鏈接:
https://juejin.cn/post/7032121721905741837