- 帖子
- 3232
- 精华
- 6
- 积分
- 118232
- 阅读权限
- 200
- 注册时间
- 2013-7-21
- 最后登录
- 2024-11-21
|
这一课算是“查天气”程序的附加内容。没有这一课,你也查到天气了。但了解一下城市代码的抓取过程,会对网页抓取有更深的理解。
天气网的城市代码信息结构比较复杂,所有代码按层级放在了很多xml为后缀的文件中。而这些所谓的“xml”文件又不符合xml的格式规范,导致在浏览器中无法显示,给我们的抓取又多加了一点难度。
首先,抓取省份的列表:- url1 = 'http://m.weather.com.cn/data3/city.xml'
- content1 = urllib2.urlopen(url1).read()
- provinces = content1.split(',')
复制代码 输出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(',')
复制代码 输出content2可以查看此省份下所有城市代码:- 1901|南京,1902|无锡,1903|镇江,...
复制代码 再对于每个城市,抓取地区列表:- for c in cities[:3]:
- c_code = c.split('|')[0]
- url3 = url % c_code
- content3 = urllib2.urlopen(url3).read()
- districts = content3.split(',')
复制代码 content3是此城市下所有地区代码:- 190101|南京,190102|溧水,190103|高淳,...
复制代码 最后,对于每个地区,我们把它的名字记录下来,然后再发送一次请求,得到它的最终代码:- for d in districts:
- d_pair = d.split('|')
- d_code = d_pair[0]
- name = d_pair[1]
- url4 = url % d_code
- content4 = urllib2.urlopen(url4).read()
- code = content4.split('|')[1]
复制代码 name和code就是我们最终要得到的城市代码信息。它们格式化到字符串中,最终保存在文件里:- line = " '%s': '%s',\n" % (name, code)
- result += line
复制代码 同时你也可以输出它们,以便在抓取的过程中查看进度:完整代码:- import urllib2
- url1 = 'http://m.weather.com.cn/data3/city.xml'
- content1 = urllib2.urlopen(url1).read()
- provinces = content1.split(',')
- result = 'city = {\n'
- 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(',')
- for c in cities:
- c_code = c.split('|')[0]
- url3 = url % c_code
- content3 = urllib2.urlopen(url3).read()
- districts = content3.split(',')
- for d in districts:
- d_pair = d.split('|')
- d_code = d_pair[0]
- name = d_pair[1]
- url4 = url % d_code
- content4 = urllib2.urlopen(url4).read()
- code = content4.split('|')[1]
- line = " '%s': '%s',\n" % (name, code)
- result += line
- print name + ':' + code
- result += '}'
- f = file('/home/crossin/Desktop/city.py', 'w')
- f.write(result)
- f.close()
复制代码 如果你只是想抓几个测试一下,并不用全部抓下来,在provices后面加上[:3],抓3个省的试试看就好了。
补充:如果发现输出的是乱码(这种事往往发生在windows下),试着把输出那行改为
- print name.decode('utf-8') + ':' + code
复制代码
#==== Crossin的编程教室 ====#
微信ID:crossincode
QQ群:312723402
面向零基础初学者的编程课
每天5分钟,轻松学编程
|
|