Python查询天气预报

原创 2013年12月02日 08:59:37

一. 实现过程


1.1 查询外网IP


通过这个网址查询到外网IP http://ip.dnsexit.com/index.php


1.2 查询IP所在省份和城市


通过这个地址查询到IP所在省份和城市 http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=54.54.194.134


1.3 查询所在城市的天气URL


所在省份和城市, 查找到城市天气的URL


1.4 查询所在城市的天气情况.


通过这个网址查询天气的URL查询天气信息

http://m.weather.com.cn/data/101280101.html

(前面3个步骤都是为了这一步准备)


二. 实现技术


2.1 网页数据抓取与提取


所有网页数据通过Python抓取然后使用正则表达式或者BeautifulSoup或者json来解析.


2.2 城市天气URL的获取


利用这个网站上的信息http://www.weather.com.cn/

先获得城市的省份URL, 在通过省份信息获得该城市的URL


2.3 天气信息的获得


利用这个网站上的信息http://www.weather.com.cn/

使用json解析.


实现


3.1 查询外网IP


这个简单

#!/usr/bin/env python
# coding=utf-8
# Python 2.7.3
# File: GetIP.py
# 获得外网IP地址
import urllib2
import httplib

def GetIP():
	response = urllib2.urlopen('http://ip.dnsexit.com/index.php')
	htmlStr = response.read()
	return htmlStr

'''
# 测试代码
print GetIP()
'''


3.2 获得IP所在省份和城市


这个也很简单

#!/usr/bin/env python
# coding=utf-8
# Python 2.7.3
# File: GetCity.py
# 获取IP所在国家/省份/城市
import urllib2
import httplib
import json

'''
返回信息的结构
{"ret":1,"start":"54.52.163.0","end":"54.57.3.255","country":"美国","province":"新泽西州","city":"Woodbridge","district":"","isp":"联通","type":"","desc":""}
'''
def GetCity(ip, city):
	response = urllib2.urlopen('http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=' + ip)
	htmlStr = response.read()
	cityInfo = htmlStr.decode("unicode-escape");	
	st = json.loads(cityInfo);
	city[0] = st["country"]
	city[1] = st["province"]
	city[2] = st["city"]

'''
# 测试代码
city = ["", "", ""]
GetCity("54.54.194.134", city)
print city
'''

3.3 获取城市的天气的URL


先获得省份信息在查找城市信息.


3.3.1 获得省份URL


看这个网址 http://www.weather.com.cn/textFC/hb.shtml

分析html(保存为GetCityID1.html)知道 <div class="lqcontentBoxheader">包含省份信息由于这个html比较复杂和有些字符不是唯一的所以这里使用的是BeautifulSoup分析.


3.3.2 获得城市URL


上面步骤获得省份URL例如 http://www.weather.com.cn/textFC/xizang.shtml

分析html(保存为GetCityID2.html)知道 <div class="hanml"> 包含城市URL信息同样使用BeautifulSoup分析.

这里获得的URL是这样的格式 http://www.weather.com.cn/weather/101280101.shtml 你需要修改成这样的格式http://m.weather.com.cn/data/101280101.html


3.3.3 实现代码


这个代码有一个明显的缺点就是运行速度很慢(一个是网站数据比较多所以慢还有就是BeautifulSoup分析也有一点慢(HTML的数据太多了)). 所以动态或者这个就比较慢了先把这些URL下载再来保存到本地也是一个好方法.

#!/usr/bin/env python
# coding=utf-8
# Python 2.7.3
# File: GetCityID.py
# 获取城市的天气的URL地址
import urllib2
import HTMLParser
import httplib
from bs4 import BeautifulSoup

def GetProvinceURL(province):
	response = urllib2.urlopen('http://www.weather.com.cn/textFC/hn.shtml')
	htmlByte = response.read()
	htmlStr = htmlByte.decode("utf8")

	soup2 = BeautifulSoup(htmlStr)
	div = soup2.find("div", class_ = "lqcontentBoxheader")
	lista = div.find_all("a")
	provinceURL = "http://www.weather.com.cn"
	for aItem in lista:
		if aItem.text == province:
			provinceURL = provinceURL + aItem["href"]
			break
	
	return provinceURL
			
def GetCityURL(provinceURL, city):
	response = urllib2.urlopen(provinceURL)
	htmlByte = response.read()
	htmlStr = htmlByte.decode("utf8")

	soup2 = BeautifulSoup(htmlStr)
	div = soup2.find("div", class_ = "hanml")
	lista = div.find_all("a", text = city)
	cityURL = lista[0]["href"].replace("www.weather.com.cn/weather", "m.weather.com.cn/data")
	cityURL = cityURL.replace("shtml", "html")
	return cityURL
'''
# GetProvinceURL 测试代码
print GetProvinceURL(u"广东")
'''
# GetProvinceURL 测试代码
provinceURL = GetProvinceURL(u"广东")
print provinceURL
cityURL = GetCityURL(provinceURL, u"广州")
print cityURL

3.4 天气数据的获取


3.4.1 天气数据的解析


从获http://m.weather.com.cn/data/101280101.html得到的数据是Json格式需要进行解析. (有了这些数据你喜欢怎么显示都可以了)

{"weatherinfo":{"city":"广州","city_en":"guangzhou","date_y":"20131129","date":"","week":"星期五","fchh":"11","cityid":"101280101","temp1":"18~5","temp2":"20~7","temp3":"21~8","temp4":"21~9","temp5":"22~10","temp6":"23~10","tempF1":"64.4~41","tempF2":"68~44.6","tempF3":"69.8~46.4","tempF4":"69.8~48.2","tempF5":"71.6~50","tempF6":"73.4~50","weather1":"","weather2":"","weather3":"","weather4":"","weather5":"","weather6":"","img1":"0","img2":"99","img3":"0","img4":"99","img5":"0","img6":"99","img7":"0","img8":"99","img9":"0","img10":"99","img11":"0","img12":"99","img_single":"0","img_title1":"","img_title2":"","img_title3":"","img_title4":"","img_title5":"","img_title6":"","img_title7":"","img_title8":"","img_title9":"","img_title10":"","img_title11":"","img_title12":"","img_title_single":"","wind1":"北风3-4级转微风","wind2":"微风","wind3":"微风","wind4":"微风","wind5":"微风","wind6":"微风","fx1":"北风","fx2":"微风","fl1":"3-4级转小于3","fl2":"小于3","fl3":"小于3","fl4":"小于3","fl5":"小于3","fl6":"小于3","index":"较冷","index_d":"建议着大衣、呢外套加毛衣、卫衣等服装。体弱者宜着厚外套、厚毛衣。因昼夜温差较大,注意增减衣服。","index48":"较冷","index48_d":"建议着大衣、呢外套加毛衣、卫衣等服装。体弱者宜着厚外套、厚毛衣。因昼夜温差较大,注意增减衣服。","index_uv":"中等","index48_uv":"中等","index_xc":"适宜","index_tr":"适宜","index_co":"舒适","st1":"16","st2":"6","st3":"19","st4":"8","st5":"20","st6":"9","index_cl":"不宜","index_ls":"适宜","index_ag":"易发"}}

#!/usr/bin/env python
# coding=utf-8
# Python 2.7.3
# File: GetCityWeather.py
# 获得城市天气数据
import urllib2
import httplib
import json

def GetCityWeather(cityURL):
	response = urllib2.urlopen(cityURL)
	htmlByte = response.read()
	htmlStr = htmlByte.decode("utf8")
	st = json.loads(htmlStr);
	return st
'''
# http://m.weather.com.cn/data/101280101.html
{"weatherinfo":{"city":"广州","city_en":"guangzhou","date_y":"2013年11月29日","date":"","week":"星期五","fchh":"11","cityid":"101280101","temp1":"18℃~5℃","temp2":"20℃~7℃","temp3":"21℃~8℃","temp4":"21℃~9℃","temp5":"22℃~10℃","temp6":"23℃~10℃","tempF1":"64.4℉~41℉","tempF2":"68℉~44.6℉","tempF3":"69.8℉~46.4℉","tempF4":"69.8℉~48.2℉","tempF5":"71.6℉~50℉","tempF6":"73.4℉~50℉","weather1":"晴","weather2":"晴","weather3":"晴","weather4":"晴","weather5":"晴","weather6":"晴","img1":"0","img2":"99","img3":"0","img4":"99","img5":"0","img6":"99","img7":"0","img8":"99","img9":"0","img10":"99","img11":"0","img12":"99","img_single":"0","img_title1":"晴","img_title2":"晴","img_title3":"晴","img_title4":"晴","img_title5":"晴","img_title6":"晴","img_title7":"晴","img_title8":"晴","img_title9":"晴","img_title10":"晴","img_title11":"晴","img_title12":"晴","img_title_single":"晴","wind1":"北风3-4级转微风","wind2":"微风","wind3":"微风","wind4":"微风","wind5":"微风","wind6":"微风","fx1":"北风","fx2":"微风","fl1":"3-4级转小于3级","fl2":"小于3级","fl3":"小于3级","fl4":"小于3级","fl5":"小于3级","fl6":"小于3级","index":"较冷","index_d":"建议着大衣、呢外套加毛衣、卫衣等服装。体弱者宜着厚外套、厚毛衣。因昼夜温差较大,注意增减衣服。","index48":"较冷","index48_d":"建议着大衣、呢外套加毛衣、卫衣等服装。体弱者宜着厚外套、厚毛衣。因昼夜温差较大,注意增减衣服。","index_uv":"中等","index48_uv":"中等","index_xc":"适宜","index_tr":"适宜","index_co":"舒适","st1":"16","st2":"6","st3":"19","st4":"8","st5":"20","st6":"9","index_cl":"不宜","index_ls":"适宜","index_ag":"易发"}}
'''

'''
# GetCityWeather测试代码
# GetProvinceURL 测试代码
cityURL = "http://m.weather.com.cn/data/101280101.html"
st = GetCityWeather(cityURL)
ss = st["weatherinfo"]
print ss["city"]
print ss["date_y"]
print ss["week"]
print ss["temp1"]
print ss["weather1"]
'''
'''
# 输出
广州
2013年11月29日
星期五
18℃~5℃
晴
'''


3.5 主程序代码


#!/usr/bin/env python
# coding=utf-8
# Python 2.7.3
import GetIP
import GetCity
import GetCityID
import GetCityWeather


ip = GetIP.GetIP()
print ip

# 国家/省份/城市
city = ["", "", ""]
GetCity.GetCity(ip, city)
print city[0], city[1], city[2]
 
provinceURL = GetCityID.GetProvinceURL(city[1])
cityURL = GetCityID.GetCityURL(provinceURL, city[2])
print provinceURL
print cityURL

st = GetCityWeather.GetCityWeather(cityURL)
ss = st["weatherinfo"]
print ss["city"]
print ss["date_y"]
print ss["week"]
print ss["temp1"]
print ss["weather1"]

这两段代码运行的非常慢

provinceURL = GetCityID.GetProvinceURL(city[1])

cityURL = GetCityID.GetCityURL(provinceURL, city[2])


小结


4.1 国外的城市可能查不到因为天气数据依赖于http://www.weather.com.cn/

4.2 获取城市url的速度实在太慢了的确先提取保存可能会更快吧.

4.3 通过实现这样的功能了解了json.

4.4 网上有很多有用的数据特别是一些动态的海量的数据你不可能手动去取就看你能不能抓找出规律两手抓两手都要硬

4.5 本文是参考http://blog.csdn.net/x_iya/article/details/8583015

相关文章推荐

Android有效地减少方法数

multidex android proguard

用python写一个简单的天气预报

#!/usr/bin/env python3 # -*- coding: utf-8 -*- '通过百度天气API,获取天气信息' import json from urllib import r...
  • qzh3578
  • qzh3578
  • 2015年11月15日 19:42
  • 4321

python获取天气预报

  • 2012年02月09日 07:20
  • 2KB
  • 下载

4、python开源——scrapy爬虫天气预报

获取信息 修改items.py如下: import scrapy class TutorialItem(scrapy.Item):     # define the fields fo...
  • notbaron
  • notbaron
  • 2017年03月06日 23:24
  • 30054

python 获取省份的天气预报

其实这些东西好像不用这样获取的,中国天气网上直接提供有天气的json数据接口, 不过最近想弄一个一键新闻或者其它例如糗百、微博热点、QQ热点聚合的东西。 先拿天气来练练手 其实这个不用模拟登陆,所...
  • xyz5354
  • xyz5354
  • 2014年07月31日 11:45
  • 779

python进阶——利用网页爬虫写天气预报采集器

在上一篇博文中,博主通过三个游戏程序讲述了python入门知识点击打开链接,现在再讲讲如何利用网页爬虫来写一个天气预报采集器,主要就是在中国天气网上爬取网页并过滤数据,得到需要的天气信息并打印出来。 ...
  • buptlrw
  • buptlrw
  • 2014年12月14日 15:57
  • 4605

python天气预报

注:我用的是和风天气的api

基于Python的微信开发(2):定时天气预报

定时天气预报。
  • qcyfred
  • qcyfred
  • 2017年06月22日 23:36
  • 380

Dragonbaord 410c Python交互设计(3)——天气预报demo数据解析

前面已经给大家介绍了在设计天气预报demo中如何设计界面和从网络天气API接口中获取天气数据,但是实际应用中我们可能只需要非常少的一部分天气数据,并且能够见这部分数据提取出来进行单独的显示或者应用,如...
  • ANDYMFC
  • ANDYMFC
  • 2016年12月15日 10:44
  • 886

python3获取天气预报(转)

python3获取天气预报(转)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python查询天气预报
举报原因:
原因补充:

(最多只允许输入30个字)