It started with me wanting to know how to code with R. R is about handling and graphing data, and I didn't really have data of my own. So, what I did was find a source I liked for weather and started putting it into a MySQL database.
That source was Google, specifically the XML used for weather in the soon-to-be-closed iGoogle.
Here's that code.
That source was Google, specifically the XML used for weather in the soon-to-be-closed iGoogle.
Here's that code.
#!/usr/bin/perl
# $Id: hpsetdisp.pl 11 2006-03-22 01:21:03Z yaakov $
# hpsetdisp.pl
# Connects to a JetDirect equipped HP printer and uses
# HP's control language to set the ready message on the
# LCD display. Takes an IP address and message on the
# command line. My favorite message is "INSERT COIN".
# Keep in mind the limitations of the display when composing
# your clever verbiage.
#
# THIS PROGRAM IS PROVIDED WITH NO WARRANTY OF ANY KIND EXPRESSED OR IMPLIED
# THE AUTHOR CANNOT BE RESPONSIBLE FOR THE EFFECTS OF THIS PROGRAM
# IF YOU ARE UNCERTAIN ABOUT THE ADVISABILITY OF USING IT, DO NOT!
#
# Yaakov (http://kovaya.com/ )
#
# Modified by Garrett Hoofman
# 10/18/2007
# http://www.visionsofafar.com
# Modified by David Jacoby
# 12/10/2008
# http://varlogrant.blogspot.com/
# Modified by David Jacoby, using notify-send and tweaking Unicode
# 09/08/2008
# http://varlogrant.blogspot.com/
# Modified by David Jacoby, moving from Google to NOAA
# 08/28/2012
# http://varlogrant.blogspot.com/
use strict ;
use warnings ;
use Modern::Perl ;
use DBI ;
use Getopt::Long ;
use IO::Interactive qw{ interactive } ;
use IO::Socket ;
use XML::DOM ;
use Data::Dumper ;
use lib '/home/jacoby/lib' ;
use MyDB 'db_connect' ;
use subs qw{ get_weather notify db_upload } ;
my $zip = '' ;
my $interactive = '' ;
my $degree = '°' ; #the unicode, straight
$degree = "\x{00b0}" ; #the unicode, specified
my $rdymsg = "Ready" ;
my $curr_cond ;
GetOptions(
'zipcode=s' => \$zip ,
) ;
$zip !~ /\d/ and exit 0 ;
my %weather = get_weather ;
db_upload %weather ;
exit ;
########## ########## ########## ########## ########## ########## ##########
sub get_weather {
my %output ;
my $parser = XML::DOM::Parser->new() ;
my $file = 'http://www.google.com/ig/api?weather=XXXXX&hl=en' ;
#my $zip = shift ;
$zip =~ s{(\d{5})}{}mx ;
$zip = $1 ;
$file =~ s/XXXXX/$zip/mx ;
my $doc = $parser->parsefile( $file ) ;
exit if ! defined $doc ;
$output{zip} = $zip ;
$output{city} = $doc->getElementsByTagName( 'city' )->item( 0 )
->getAttribute('data');
$output{temp_c} = $doc->getElementsByTagName( 'temp_c' )->item( 0 )
->getAttribute('data');
$output{temp_f} = $doc->getElementsByTagName( 'temp_f' )->item( 0 )
->getAttribute('data');
$output{humidity} = $doc->getElementsByTagName( 'humidity' )->item( 0 )
->getAttribute('data');
$output{wind} = $doc->getElementsByTagName( 'wind_condition' )->item( 0 )
->getAttribute('data');
$output{conditions} = $doc->getElementsByTagName( 'condition' )->item( 0 )
->getAttribute('data') ;
return %output ;
}
########## ########## ########## ########## ########## ########## ##########
########## ########## ########## ########## ########## ########## ##########
sub db_upload {
my %cond = @_ ;
my $dbh = db_connect() ;
for my $k ( sort keys %cond ) {
$cond{$k} = $dbh->quote( $cond{$k} ) ;
}
my $fields = join ',' , qw{
city conditions
humidity temp_c
temp_f wind
zip
} ;
my $sql ;
my $rows ;
$sql = qq{
INSERT INTO weather_data ( $fields ) VALUES (
$cond{ city } ,
$cond{ conditions } ,
$cond{ humidity } ,
$cond{ temp_c } ,
$cond{ temp_f } ,
$cond{ wind } ,
$cond{ zip }
) } ;
#$rows = $dbh->do( $sql ) or croak $dbh->errstr;
$sql = qq{
INSERT INTO weather ( $fields ) VALUES (
$cond{ city } ,
$cond{ conditions } ,
$cond{ humidity } ,
$cond{ temp_c } ,
$cond{ temp_f } ,
$cond{ wind } ,
$cond{ zip }
) } ;
$rows = $dbh->do( $sql ) or croak $dbh->errstr;
return ;
}
########## ########## ########## ########## ########## ########## ##########
Problem is, Google knows I've been grabbing weather data every 10 minutes and has blocked me.While I fill in all these, I am not pulling in weather data from multiple cities, so I can hardcode city and zip, and I couldjust drop conditions and wind. All I'm really watching is temp_f, and it's a simple conversion to get temp_c if I wanted it.
I have code that pulls from NOAA. Think I'll try to bring that in here.
No comments:
Post a Comment