查天气(1)
http://wthrcdn.etouch.cn/weather_mini?citykey=101280804
http://wthrcdn.etouch.cn/WeatherApi?citykey=101280804
http://bbs.crossincode.com/forum.php?mod=viewthread&tid=8&extra=page%3D4
http://bbs.crossincode.com/forum.php?mod=viewthread&tid=9&extra=page%3D4
查天气(2)
# -*- coding: utf-8 -*-
import urllib2
web = urllib2.urlopen('http://www.baidu.com')
content = web.read()
print content
# -*- coding: UTF-8 -*-
import urllib2
import json
from city import city
cityname = raw_input('你想查哪个城市的天气?\n')
citycode = city.get(cityname)
if citycode:
url = ('http://www.weather.com.cn/data/cityinfo/%s.html' % citycode)
content = urllib2.urlopen(url).read()
print content
http://www.weather.com.cn/data/cityinfo/101280800.html
# -*- coding: UTF-8 -*-
import urllib2
import json
from city import city cityname = raw_input('你想查哪个城市的天气?\n'.decode('utf-8').encode('gbk'))
citycode = city.get(cityname.decode('gbk').encode('utf-8'))
if citycode:
url = ('http://www.weather.com.cn/data/cityinfo/%s.html'%citycode)
print url
content = urllib2.urlopen(url).read().decode('utf-8').encode('gbk')
print content
查天气(3)
看一下我们已经拿到的json格式的天气数据:
{"weatherinfo":{"city":"佛山","cityid":"101280800","temp1":"14℃","temp2":"24℃","weather":"晴","img1":"n0.gif","img2":"d0.gif","ptime":"18:00"}}
{
"weatherinfo":{
"city":"佛山",
"cityid":"101280800",
"temp1":"14℃",
"temp2":"24℃",
"weather":"晴",
"img1":"n0.gif",
"img2":"d0.gif",
"ptime":"18:00"}
}
直接在命令行中看到的应该是没有换行和空格的一长串字符,这里我把格式整理了一下。可以看出,它像是一个字典的结构,但是有两层。最外层只有一个key--“weatherinfo”,它的value是另一个字典,里面包含了好几项天气信息,现在我们最关心的就是其中的temp1,temp2和weather。
虽然看上去像字典,但它对于程序来说,仍然是一个字符串,只不过是一个满足json格式的字符串。我们用python中提供的另一个模块json提供的loads方法,把它转成一个真正的字典。
import json
data = json.loads(content)
这时候的data已经是一个字典,尽管在控制台中输出它,看上去和content没什么区别,只是编码上有些不同:
{u'weatherinfo': {u'city': u'\u4f5b\u5c71', u'ptime': u'18:00', u'cityid': u'101280800', u'temp2': u'24\u2103', u'temp1': u'14\u2103', u'weather': u'\u6674', u'img2': u'd0.gif', u'img1': u'n0.gif'}}
但如果你用type方法看一下它们的类型:
print type(content)
print type(data)
就知道区别在哪里了。
# -*- coding: UTF-8 -*-
import urllib2
import json
from city import city cityname = raw_input('你想查哪个城市的天气?\n'.decode('utf-8').encode('gbk'))
citycode = city.get(cityname.decode('gbk').encode('utf-8'))
if citycode:
url = ('http://www.weather.com.cn/data/cityinfo/%s.html'%citycode)
print url
content = urllib2.urlopen(url).read().decode('utf-8').encode('gbk')
content1 = urllib2.urlopen(url).read()
data = json.loads(content1)
print type(content)
print type(data)
print data
print content
之后的事情就比较容易了。
result = data['weatherinfo']
str_temp = ('%s\n%s ~ %s') % (
result['weather'],
result['temp1'],
result['temp2'] )
print str_temp
# -*- coding: UTF-8 -*-
import urllib2
import json
from city import city cityname = raw_input('你想查哪个城市的天气?\n'.decode('utf-8').encode('gbk'))
citycode = city.get(cityname.decode('gbk').encode('utf-8'))
if citycode:
url = ('http://www.weather.com.cn/data/cityinfo/%s.html'%citycode)
print url
content = urllib2.urlopen(url).read().decode('utf-8').encode('gbk')
content1 = urllib2.urlopen(url).read()
data = json.loads(content1)
print type(content)
print type(data)
print data
print content
result = data['weatherinfo']
str_temp = ('%s\n%s ~ %s') % (
result['weather'],
result['temp1'],
result['temp2'] )
print str_temp
为了防止在请求过程中出错,我加上了一个异常处理。
try:
###
###
except:
print '查询失败'
以及没有找到城市时的处理:
if citycode:
###
###
else:
print '没有找到该城市'
# -*- coding: UTF-8 -*-
import urllib2
import json
from city import city cityname = raw_input('你想查哪个城市的天气?\n'.decode('utf-8').encode('gbk'))
citycode = city.get(cityname.decode('gbk').encode('utf-8'))
if citycode:
try:
url = ('http://www.weather.com.cn/data/cityinfo/%s.html'%citycode)
print url
content = urllib2.urlopen(url).read().decode('utf-8').encode('gbk')
content1 = urllib2.urlopen(url).read()
data = json.loads(content1)
print type(content)
print type(data)
print data
print content
result = data['weatherinfo']
print result
str_temp = ('%s\n%s ~ %s') % (
result['weather'],
result['temp1'],
result['temp2'] )
print str_temp
except:
print '查询失败'
else:
print '没有找到该城市'
查天气(4)
这一课算是“查天气”程序的附加内容。没有这一课,你也查到天气了。但了解一下城市代码的抓取过程,会对网页抓取有更深的理解。
天气网的城市代码信息结构比较复杂,所有代码按层级放在了很多xml为后缀的文件中。而这些所谓的“xml”文件又不符合xml的格式规范,导致在浏览器中无法显示,给我们的抓取又多加了一点难度。
首先,抓取省份的列表:
# -*- coding: UTF-8 -*-
import urllib2 url1 = 'http://m.weather.com.cn/data3/city.xml' content1 = urllib2.urlopen(url1).read() provinces = content1.split(',') print content1
输出content1可以查看全部省份代码:
对于每个省,抓取城市列表:
url = 'http://m.weather.com.cn/data3/city%s.xml' for p in provinces: p_code = p.split('|')[0] url2 = url % p_code content2 = urllib2.urlopen(url2).read() cities = content2.split(',') print content2.decode('utf-8')
输出content2可以查看此省份下所有城市代码:
再对于每个城市,抓取地区列表:
for c in cities[:3]: c_code = c.split('|')[0] url3 = url % c_code content3 = urllib2.urlopen(url3).read() districts = content3.split(',') print content3.decode('utf-8')
content3是此城市下所有地区代码:
最后,对于每个地区,我们把它的名字记录下来,然后再发送一次请求,得到它的最终代码: