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