Python實(shí)戰(zhàn)!四行Python代碼就能知道你那的天氣贰您,你敢信嗎坏平?

今天給大家?guī)?lái)的Python實(shí)戰(zhàn)項(xiàng)目是四行Python代碼獲取所在城市的天氣預(yù)報(bào),我們隱隱聽(tīng)到唏噓聲枉圃,不信四行Python代碼可以獲取是嗎?那我們一起來(lái)看看:

使用Python獲取天氣預(yù)報(bào)功茴,想想是件很簡(jiǎn)單的事情庐冯。無(wú)非是發(fā)送一個(gè)HTTP請(qǐng)求孽亲,再解析請(qǐng)求返回的結(jié)果。當(dāng)你真的使用Python程序去獲取天氣預(yù)報(bào)以后展父,會(huì)發(fā)現(xiàn)返劲,有不少坑在等著你。這里簡(jiǎn)單記錄一下我遇到的坑栖茉,供大家參考篮绿。

如何獲取

使用Python獲取天氣有兩種不同的方法,一種是像平時(shí)爬蟲(chóng)一樣吕漂,獲取天氣預(yù)報(bào)網(wǎng)站的HTML頁(yè)面亲配,再使用XPath或BeautifulSoup解析HTML頁(yè)面的內(nèi)容。這是比較傳統(tǒng)的爬蟲(chóng)方式惶凝。此外吼虎,還有另外一種比較合適的方法——通過(guò)天氣預(yù)報(bào)網(wǎng)站提供的API。通過(guò)API苍鲜,直接獲取結(jié)構(gòu)化的數(shù)據(jù)思灰,省去了解析HTML的煩惱。

使用API

搜索”天氣預(yù)報(bào) API”這兩個(gè)關(guān)鍵字混滔,會(huì)有很多相關(guān)的內(nèi)容洒疚,例如,這個(gè)

https:/

python -c "import requests"

/wwwzhihu.com/question/20575288

答案下就列出了不少提供API訪問(wèn)天氣預(yù)報(bào)的網(wǎng)站坯屿。

然而油湖,大部分都已經(jīng)不可用了。部分可用的需要收費(fèi)或者需要注冊(cè)领跛,都比較麻煩乏德。有沒(méi)有比較省事的方案呢?找來(lái)找去,我找到了中國(guó)天氣網(wǎng)的API隔节。無(wú)需注冊(cè)直接可用鹅经,返回json格式的數(shù)據(jù)寂呛,無(wú)需使用BeautifulSoup或XPath解析,非常的方便瘾晃。贊!

例如贷痪,可以直接訪問(wèn)下面的地址,在瀏覽器中查看中國(guó)天氣網(wǎng)返回的json數(shù)據(jù):

http://www.weather.com.cn/data/sk/101020100.html

有了API處理起來(lái)就很簡(jiǎn)單了蹦误,直接使用Python世界最知名的requests訪問(wèn)API即可劫拢。

安裝requests:

pip install requests

檢查安裝是否成功:

python -c “import requests”

使用ipython測(cè)試:

In [1]: import requests

In [2]: r = requests.get('http://www.weather.com.cn/data/sk/101020100.html')

In [3]: r.status_code

Out[3]: 200

In [4]: r.content

Out[4]: '{"weatherinfo":{"city":"????μ·","cityid":"101020100","temp":"15","WD":"???é£?","WS":"1?o§","SD":"50%","WSE":"1","time":"17:08","isRadar":"1","Radar":"JC_RADAR_AZ9210_JB","njd":"????? ?????μ","qy":"1020","rain":"0"}}'

In [5]: r.json()

Out[5]: {u'weatherinfo': {u'Radar': u'JC_RADAR_AZ9210_JB',

? u'SD': u'50%',

? u'WD': u'???�',

? u'WS': u'1?o§',

? u'WSE': u'1',

? u'city': u'????μ·',

? u'cityid': u'101020100',

? u'isRadar': u'1',

? u'njd': u'????? ?????μ',

? u'qy': u'1020',

? u'rain': u'0',

? u'temp': u'15',

? u'time': u'17:08'}}

requests庫(kù)包含一個(gè)名為json的方法,當(dāng)請(qǐng)求的地址返回的是json格式的數(shù)據(jù)時(shí)强胰,直接使用該方法訪問(wèn)即可舱沧,無(wú)需使用標(biāo)準(zhǔn)庫(kù)的json庫(kù)。

解決亂碼

如果大家剛才在瀏覽器中打開(kāi)了我給的地址偶洋,會(huì)發(fā)現(xiàn)熟吏,輸出結(jié)果是亂碼的。如下所示:



我們可以在ipython中玄窝,查看數(shù)據(jù)編碼:

In [6]: r.encoding

Out[6]: 'ISO-8859-1'

我們知道牵寺,亂碼是因?yàn)榻獯a的字符集與編碼的字符集不一樣,所以才會(huì)有亂碼恩脂。那么帽氓,我們?cè)趺粗罃?shù)據(jù)的編碼字符集呢?這個(gè)時(shí)候就靠猜了。眾所周知俩块,utf-8因?yàn)楦鞣N優(yōu)點(diǎn)(如果大家感興趣黎休,我可以寫(xiě)一篇字符集編碼的文章),是使用最廣泛的字符集編碼玉凯,因此势腮,我們可以嘗試使用utf-8進(jìn)行解碼。如下所示:

In [7]: r.json()['weatherinfo']['city']

Out[7]: u'????μ·'

In [8]: '????μ·'.decode('utf-8')

Out[8]: u'上海'

In [9]: print '????μ·'.decode('utf-8')

上海

可以看到壮啊,使用utf-8解碼以后嫉鲸,可以正確的顯示數(shù)據(jù)。也就是說(shuō)歹啼,中國(guó)天氣網(wǎng)返回給我們的數(shù)據(jù)玄渗,應(yīng)該是utf-8格式的。那么狸眼,為什么會(huì)亂碼呢?這可能是中國(guó)天氣網(wǎng)的工程師水平不行藤树,也可能是故意不想讓我們使用,誰(shuí)知道呢拓萌。

我們已經(jīng)知道了正確的編碼岁钓,接下來(lái),只要將相應(yīng)的數(shù)據(jù),使用utf-8格式解碼即可屡限。requests庫(kù)本身提供了這樣的功能品嚣,如下所示:

In [10]: r.encoding = 'utf-8'

In [11]: print r.json()['weatherinfo']['city']

上海

獲取不同城市的天氣預(yù)報(bào)

前面的例子,獲取的是上海的天氣預(yù)報(bào)钧大。如果想要使用中國(guó)天氣網(wǎng)的API翰撑,獲取其他城市的天氣預(yù)報(bào)呢?中國(guó)天氣網(wǎng)并沒(méi)有提供相應(yīng)的接口,我們只能自己想辦法啊央。

在我們測(cè)試的URL中眶诈,101020100是城市的代碼,我們只需要找到其他城市的代碼瓜饥,將101020100替換成相應(yīng)的代碼即可逝撬。查找方法是,在中國(guó)天氣網(wǎng)的首頁(yè)乓土,搜索城市的名稱宪潮,地址欄中會(huì)顯示相應(yīng)城市的代碼。如下所示:



4 行Python代碼獲取天氣預(yù)報(bào)

使用Python獲取天氣預(yù)報(bào)的例子中帐我,我們的主要任務(wù)在于找到相應(yīng)的API坎炼,解決字符集編碼問(wèn)題。當(dāng)這些問(wèn)題解決以后拦键,直接使用requests庫(kù)獲取天氣預(yù)報(bào)即可。下面是獲取所在城市天氣預(yù)報(bào)的4行Python代碼:

In [1]: import requests

In [2]: r = requests.get('http://www.weather.com.cn/data/sk/101020100.html')

In [3]: r.encoding = 'utf-8'

In [4]: print r.json()['weatherinfo']['city'], r.json()['weatherinfo']['WD'], r.json()['weatherinfo']['temp']

上海 東風(fēng) 15

感謝您的閱讀檩淋,以上就是我們用四行代碼獲取的上海的天氣預(yù)報(bào)芬为,你現(xiàn)在相信了嗎?還不趕緊套用一下,看看你那的天氣怎么樣蟀悦!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末媚朦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子日戈,更是在濱河造成了極大的恐慌询张,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浙炼,死亡現(xiàn)場(chǎng)離奇詭異份氧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)弯屈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)蜗帜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人资厉,你說(shuō)我怎么就攤上這事厅缺。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵湘捎,是天一觀的道長(zhǎng)诀豁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)窥妇,這世上最難降的妖魔是什么且叁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮秩伞,結(jié)果婚禮上逞带,老公的妹妹穿的比我還像新娘。我一直安慰自己纱新,他們只是感情好展氓,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著脸爱,像睡著了一般遇汞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上簿废,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天空入,我揣著相機(jī)與錄音,去河邊找鬼族檬。 笑死歪赢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的单料。 我是一名探鬼主播埋凯,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扫尖!你這毒婦竟也來(lái)了白对?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤换怖,失蹤者是張志新(化名)和其女友劉穎甩恼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沉颂,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡条摸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兆览。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屈溉。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抬探,靈堂內(nèi)的尸體忽然破棺而出子巾,到底是詐尸還是另有隱情帆赢,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布线梗,位于F島的核電站椰于,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仪搔。R本人自食惡果不足惜瘾婿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烤咧。 院中可真熱鬧偏陪,春花似錦、人聲如沸煮嫌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昌阿。三九已至饥脑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懦冰,已是汗流浹背灶轰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刷钢,地道東北人笋颤。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像闯捎,于是被迫代替她去往敵國(guó)和親椰弊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,446評(píng)論 0 13
  • Requests快速上手 迫不及待了嗎瓤鼻?本頁(yè)內(nèi)容為如何入門(mén) Requests 提供了很好的指引。其假設(shè)你已經(jīng)安裝了...
    小娟_bb93閱讀 1,464評(píng)論 0 3
  • title: python語(yǔ)法練習(xí) 參考阮一峰等多個(gè)文件用來(lái)練習(xí)python基本語(yǔ)法 [TOC] import文件...
    采香行處蹙連錢(qián)閱讀 2,353評(píng)論 0 2
  • 接口測(cè)試自動(dòng)化的優(yōu)點(diǎn): 1贤重,web自動(dòng)化說(shuō)起來(lái)很多人都會(huì)直接想到UI自動(dòng)化這個(gè)設(shè)計(jì)茬祷,很少有人直接第一個(gè)概念是接口自...
    路邊看雪的小男孩閱讀 4,908評(píng)論 1 26
  • 結(jié)束了為期兩天半青少年實(shí)踐基地活動(dòng)祭犯,我來(lái)說(shuō)說(shuō)我眼里的那群孩子。因?yàn)檫@次我負(fù)責(zé)的是男生滚停,他們的表現(xiàn)看到的相對(duì)...
    taoeasy閱讀 272評(píng)論 0 2