user2186465
user2186465

Reputation: 197

Perl print the redirected url

I want to print the redirected url in perl.

Input url : http://pricecheckindia.com/go/store/snapdeal/52517?ref=velusliv

output url : http://www.snapdeal.com/product/vox-2-in-1-camcorder/1154987704?utm_source=aff_prog&utm_campaign=afts&offer_id=17&aff_id=1298&source=pricecheckindia

use LWP::UserAgent qw();
use CGI qw(:all);
print header();
my ($url) = "http://pricecheckindia.com/go/store/snapdeal/52517?ref=velusliv";
my $ua = LWP::UserAgent->new;
my $req = new HTTP::Request(GET => $url);
my $res = $ua->request($req);
print $res->request;

How to get this done in perl?

Upvotes: 1

Views: 1587

Answers (3)

i alarmed alien
i alarmed alien

Reputation: 9520

You need to examine the HTTP response to find the URL. The documentation of HTTP::Response gives full details of how to do this, but to summarise, you should do the following:

use strict;
use warnings;
use feature ':5.10'; # enables "say"
use LWP::UserAgent;
my $url = "http://pricecheckindia.com/go/store/snapdeal/52517?ref=velusliv";

my $ua = LWP::UserAgent->new;
my $req = new HTTP::Request(GET => $url);
my $res = $ua->request($req);

# you should add a check to ensure the response was actually successful:
if (! $res->is_success) {
   say "GET failed! " . $res->status_line;
}

# show the base URI for the response:
say "Base URI: " . $res->base;

You can view redirects using HTTP::Response's redirects method:

if ($res->redirects) {  # are there any redirects?
    my @redirects = $res->redirects;
    say join(", ", @redirects);
}
else {
    say "No redirects.";
}

In this case, the base URI is the same as $url, and if you examine the contents of the page, you can see why.

# print out the contents of the response:
say $res->decoded_contents;

Right near the bottom of the page, there is the following code:

    $(window).load(function() {
        window.setTimeout(function() {
            window.location = "http://www.snapdeal.com/product/vox-2-in-1-camcorder/1154987704?utm_source=aff_prog&utm_campaign=afts&offer_id=17&aff_id=1298&source=pricecheckindia"
        }, 300);
    });

The redirect is handled by javascript, and so is not picked up by LWP::UserAgent. If you want to get this URL, you will need to extract it from the response contents (or use a different client that supports javascript).

On a different note, your script starts off like this:

use LWP::UserAgent qw();

The code following the module name, qw(), is used to import particular subroutines into your script so that you can use them by name (instead of having to refer to the module name and the subroutine name). If the qw() is empty, it's not doing anything, so you can just omit it.

Upvotes: 2

Miller
Miller

Reputation: 35198

To have LWP::UserAgent follow redirects, just set the max_redirects option:

use strict;
use warnings;

use LWP::UserAgent qw();

my $url = "http://pricecheckindia.com/go/store/snapdeal/52517?ref=velusliv";

my $ua = LWP::UserAgent->new( max_redirect => 5 );

my $res = $ua->get($url);

if ( $res->is_success ) {
    print $res->decoded_content;    # or whatever
} else {
    die $res->status_line;
}

However, that website is using a JavaScript redirect.

    $(window).load(function() {
        window.setTimeout(function() {
            window.location = "http://www.snapdeal.com/product/vox-2-in-1-camcorder/1154987704?utm_source=aff_prog&utm_campaign=afts&offer_id=17&aff_id=1298&source=pricecheckindia"
        }, 300);
    });

This will not work unless you use a framework that enables JavaScript, like WWW::Mechanize::Firefox.

Upvotes: 1

Praveen
Praveen

Reputation: 902

It will throw you an error for the last line $res - > request since it is returning hash and content from the response. So below is the code:

use LWP::UserAgent qw();
use CGI qw(:all);
print header();
my ($url) = "http://pricecheckindia.com/go/store/snapdeal/52517?ref=velusliv";
my $ua = LWP::UserAgent->new;
my $req = new HTTP::Request(GET => $url);
my $res = $ua->request($req);
print $res->content;

Upvotes: 0

Related Questions