今天做一個簡單的天氣查詢的程序,主要用到Urllib2(python自帶的),和Json(Java Script Object Notation,JavaScript 對象表示法),安裝步驟:
json的安裝包在這里:https://www.lfd.uci.edu/~gohlke/pythonlibs/#simplejson,
打開cmd,進入到Python安裝目錄的Scripts文件夾中.比如:D:\Program Files\Python\Scripts。使用pip安裝剛剛下載好的whl文件,pip.exe install *.whl,例如:
cd D:\Program Files\python\Scripts>
pip.exe install D:\python\simplejson-3.10.0-cp36-cp36m-win_amd64.whl
提示安裝成功后,在\Python\Lib\site-packages目錄下可以看到simplejson.
Urllib2用於獲取網頁的內容,Json用於對內容里的東西進行分析處理,
以下是一個簡單的爬取語句:
import urllib2
web = urllib2.urlopen("http://www.sina.com") #這里得加一個http://,不是直接寫網頁地址的
content = web.read()
print content
實例:
import urllib2
web = urllib2.urlopen("http://www.weather.com.cn/data/cityinfo/101200101.html") #這里得加一個http://,不是直接寫網頁地址的
content = web.read()
print content
天氣的查詢是通過中國天氣網(www.weather.com.cn)的信息獲取完成的,點擊http://www.weather.com.cn/data/cityinfo/101010100.html會發現101010100是北京的天氣,這個網站是通過代號查詢的,所以我們做一個城市與代號的字典,city.py,放在網盤中(https://pan.baidu.com/s/1c0Nw4m?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0&traceid=),使用的時候只要放在和你的代碼同一路徑下,用
from city import city
前一個“city”是模塊名,也就是py文件的名稱,后一個“city”是模塊中變量的名稱。
我們分析http://www.weather.com.cn/data/cityinfo/101010100.html里的內容發現我們想要的內容都在里面,如果把101010100改成別的就變成了其他城市的天氣,所以:
#python默認ASCII碼,這一句是為了轉換為UTF-8,不是注釋同時city.py里也要聲明
#在這個程序中第一行加了 # -*- coding: UTF-8 -*- 這句反而不行了,不知道為啥
import urllib2
import json
city = {
'北京': '101010100',
'上海': '101020100',
'天津': '101030100',
'蘭州': '101160101',
'鄂州': '101200301',
'荊州': '101200801',
'香港': '101320101',
'新界': '101320103',
'澳門': '101330101',
'台北': '101340101',
'高雄': '101340201',
'台中': '101340401'
}
cityname = raw_input("The weather in which city do you want ?")
citycode = city.get(cityname)
print citycode #測試代碼,測試可行
url = ("http://www.weather.com.cn/data/cityinfo/%s.html" %citycode) #一定要注意%s
pagecontent = urllib2.urlopen(url).read()
print pagecontent
binggo。
得到如下數據:
{"weatherinfo":
{"city":"武漢",
"cityid":"101200101",
"temp1":"7℃",
"temp2":"19℃",
"weather":"小雨轉多雲",
"img1":"n7.gif",
"img2":"d1.gif",
"ptime":"18:00"}
}
接下來是分析的環節,我們發現這是嵌套的字典,我們只需要里面的temp1,2和weather的信息即可。
那么如何提取嗯?
現在我們需要借助json來完成了,可以先了解一下:http://www.w3school.com.cn/json/
import json
data = json.loads(pagecontent),這時候的data已經是一個字典,盡管在控制台中輸出它,看上去和pagecontent沒什么區別
這是編碼上有區別:
{u'weatherinfo': {u'city': u'\u5357\u4eac', u'ptime': u'11:00', u'cityid': u'101190101', u'temp2': u'28\u2103', u'temp1': u'37\u2103', u'weather': u'\u591a\u4e91', u'img2': u'n1.gif', u'img1': u'd1.gif'}}
但如果你用type方法看一下它們的類型:
print type(pagecontent)
print type(data)
就知道區別在哪里了。
import urllib2
import json
city = {
"北京":"101010100",
"武漢":"101200101"
}
cityname = raw_input("which city?\n")
citycode = city.get(cityname)
print citycode
print
if citycode:
url = ("http://www.weather.com.cn/data/cityinfo/%s.html" %citycode)
print url
print
page = urllib2.urlopen(url).read()
print page #這里打印出來的東西里就有我們想要的東西了
print
#使用json
data = json.loads(page) #loads是json方法中的一種
result = data["weatherinfo"]
str_temp = ("%s\t%s - %s") % (
result["weather"],
result["temp1"],
result["temp2"]
)
print str_temp
else:
print "Can not find this city."
就可以輸出:
晴-2℃ - 16℃