从Wunderground解析HTML数据

2 投票
2 回答
1555 浏览
提问于 2025-04-17 12:37

大家好,

我正在尝试从Wunderground下载天气数据的历史记录。我的问题是,我需要完整的METAR信息。

这是我想下载的一个例子:包含完整METAR的CSV文件

因为我想下载整整一年的每小时数据,所以我需要写脚本来实现。但是无论我尝试了什么(用bash和wget,或者用python),我还是无法通过脚本获取到包含完整METAR的信息的页面。

这是我脚本的一个例子:

import urllib2
from BeautifulSoup import BeautifulSoup
url = "http://www.wunderground.com/history/airport/KBUF/2011/1/1/DailyHistory.html?theprefset=SHOWMETAR&theprefvalue=1&format=1"
page = urllib2.urlopen(url)
dailyData = page.read()                            
print dailyData

我得到的结果大概是这样的:

12:54 AM,52.0,45.0,77,29.93,10.0,SSW,15.0,-,N/A,,Scattered Clouds,200,2011-01-01 05:54:00<br />
1:54 AM,53.1,45.0,74,29.95,10.0,SSW,12.7,-,N/A,,Mostly Cloudy,200,2011-01-01 06:54:00<br />
2:54 AM,50.0,44.1,80,29.95,10.0,SSW,8.1,-,N/A,,Mostly Cloudy,200,2011-01-01 07:54:00<br />
3:54 AM,51.1,44.1,77,29.93,10.0,SSE,5.8,-,N/A,,Scattered Clouds,150,2011-01-01 08:54:00<br />

通过网页浏览器,这就是我看到的内容——注意有一列是以METAR开头的:

12:54 AM,52.0,45.0,77,29.93,10.0,SSW,15.0,-,N/A,,Scattered Clouds,METAR KBUF 010554Z COR 20013KT 10SM FEW045 SCT140 11/07 A2992 RMK AO2 SLP134 60004 T01110072 10111 20078 58016,200,2011-01-01 05:54:00
1:54 AM,53.1,45.0,74,29.95,10.0,SSW,12.7,-,N/A,,Mostly Cloudy,METAR KBUF 010654Z 20011KT 10SM BKN055 BKN130 12/07 A2994 RMK AO2 SLP141 T01170072,200,2011-01-01 06:54:00
2:54 AM,50.0,44.1,80,29.95,10.0,SSW,8.1,-,N/A,,Mostly Cloudy,METAR KBUF 010754Z 20007KT 10SM BKN050 BKN130 10/07 A2994 RMK AO2 SLP140 T01000067,200,2011-01-01 07:54:00
3:54 AM,51.1,44.1,77,29.93,10.0,SSE,5.8,-,N/A,,Scattered Clouds,METAR KBUF 010854Z 15005KT 10SM SCT050 SCT130 11/07 A2992 RMK AO2 SLP134 T01060067 58000,150,2011-01-01 08:54:00

如果有人能提供解决方案,我将非常感激。谢谢!

2 个回答

0

当我通过浏览器访问那个网址时,我看到的数据和你提供的第一个样本是一样的。在Wunderground网站上转转,似乎有办法注册一个开发者/API账户——如果你已经注册了,并且在获取数据时登录了,那么你看到的数据和我看到的不同,可能是因为注册用户可以获取更多的信息。

如果你需要登录才能获取完整的数据,花时间了解一下如何使用mechanize来管理cookies,会对你有帮助。

否则,我猜测你使用的网址可能有差别——扩展的数据可能是通过额外的参数来指定的。

3

在浏览wunderground网站的时候,我发现了一个“显示完整的METAR数据”的链接。点击这个链接后,如果你把浏览器指向你发的链接或者“逗号分隔文件”链接,就会显示METAR数据。看起来这个操作会设置一些cookies。比如,page.info()显示“Prefs”中包含“SHOWMETAR:1”。

Set-Cookie: Prefs=FAVS:1|WXSN:1|PWSOBS:1|WPHO:1|PHOT:1|RADC:0|RADALL:0|HIST0:NULL|GIFT:1|SHOWMETAR:1|PHOTOTHUMBS:50|HISTICAO:KBUF*NULL|; path=/; expires=Fri, 01-Jan-2020 00:00:00 GMT; domain=.wunderground.com

import urllib2
import cookielib

cookieJar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))

setmetar = 'http://www.wunderground.com/cgi-bin/findweather/getForecast?setpref=SHOWMETAR&value=1'
request = urllib2.Request(setmetar)
response = opener.open(request)

url = "http://www.wunderground.com/history/airport/KBUF/2011/1/1/DailyHistory.html?theprefset=SHOWMETAR&theprefvalue=1&format=1"
request = urllib2.Request(url)
page = opener.open(request)
# print(page.info())
dailyData = page.read()                            
print dailyData

结果是

TimeEST,TemperatureF,Dew PointF,Humidity,Sea Level PressureIn,VisibilityMPH,Wind Direction,Wind SpeedMPH,Gust SpeedMPH,PrecipitationIn,Events,Conditions,FullMetar,WindDirDegrees,DateUTC<br />
12:54 AM,52.0,45.0,77,29.93,10.0,SSW,15.0,-,N/A,,Scattered Clouds,METAR KBUF 010554Z COR 20013KT 10SM FEW045 SCT140 11/07 A2992 RMK AO2 SLP134 60004 T01110072 10111 20078 58016,200,2011-01-01 05:54:00<br />
1:54 AM,53.1,45.0,74,29.95,10.0,SSW,12.7,-,N/A,,Mostly Cloudy,METAR KBUF 010654Z 20011KT 10SM BKN055 BKN130 12/07 A2994 RMK AO2 SLP141 T01170072,200,2011-01-01 06:54:00<br />

撰写回答