#!/usr/bin/env perl
use strict;
use warnings;
use Mojo::UserAgent;
use Mojo::DOM;
use Data::Dumper;
use Date::Calc ( 'Date_to_Days', 'Today' );
my $agent = Mojo::UserAgent->new;
$agent->transactor->name(
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:48.0) Gecko/20100101 Firefox/48.0');
my $urls = [
"https://xhamster.com/users/desirette/photos",
];
my $stamp = sprintf "%d_%02d_%02d", Today
;
open my $output, "> ./pix_stats_$stamp.csv" or die $!;
my $galleries = fetch_galleries_urls( $agent, $urls );
my $photos = process_galleries( $agent, $galleries );
process_photos( $agent, $photos, $output );
sub fetch_galleries_urls {
my ( $agent, $urls ) = @_;
my $galleries = [];
foreach my $url ( @$urls ) {
my $tx = $agent->get( $url );
if ( $tx->success ) {
$tx->res->dom
->find( 'div.gallery a:first-child' )
->map( attr
=> 'href' ) };
} else {
}
}
}
sub process_galleries {
my ( $agent, $galleries, $fh ) = @_;
my @photos;
foreach my $url ( @$galleries ) {
my $tx = $agent->get( $url );
my $counter = 1;
( my $gallery = ( split ///, $url )[-1] ) =~ s/.html$//;
$gallery =~ tr/_/ /;
if ( $tx->success ) {
gallery => $gallery,
position => $counter++,
url => $_
} } @{ $tx->res->dom
->find( 'div.gallery.iItem a:first-child' )
->map( attr
=> 'href' ) };
}
}
}
sub process_photos {
my ( $agent, $photos, $fh ) = @_;
my @unsorted;
foreach my $photo ( @$photos ) {
my $tx = $agent->get( $photo->{url} );
if ( $tx->success ) {
->find( 'td#galleryUser div.item span.hint' )
->map( attr
=> 'hint' )->[0];
( my $views = ( split / /, $tx->res->dom
->find( 'td#galleryUser div.item' )
->last->content )[-1] ) =~ s/,//g;
my $days = Date_to_Days( Today )
- Date_to_Days
( split /-/, $upload );
$photo->{url} =~ s/^(.*)#content$/$1/;
gallery => $photo->{gallery},
position => $photo->{position},
url => $photo->{url},
upload => $upload,
views => $views,
days => $days,
average
=> sprintf "%.2f", $views / $days
};
} else {
}
}
printf $fh "URL;Gallery;Position;Days;Views;Average;Uploadedn";
printf $fh "%s;%s;%d;%d;%d;%.2f;%sn",
@{ $_ }{ qw/ url gallery position days views average upload / }
foreach sort { $b->{average
} <=> $a->{average
} } @unsorted;
}
{"html5":"htmlmixed","css":"css","javascript":"javascript","php":"php","python":"python","ruby":"ruby","lua":"text\/x-lua","bash":"text\/x-sh","go":"go","c":"text\/x-csrc","cpp":"text\/x-c++src","diff":"diff","latex":"stex","sql":"sql","xml":"xml","apl":"apl","asterisk":"asterisk","c_loadrunner":"text\/x-csrc","c_mac":"text\/x-csrc","coffeescript":"text\/x-coffeescript","csharp":"text\/x-csharp","d":"d","ecmascript":"javascript","erlang":"erlang","groovy":"text\/x-groovy","haskell":"text\/x-haskell","haxe":"text\/x-haxe","html4strict":"htmlmixed","java":"text\/x-java","java5":"text\/x-java","jquery":"javascript","mirc":"mirc","mysql":"sql","ocaml":"text\/x-ocaml","pascal":"text\/x-pascal","perl":"perl","perl6":"perl","plsql":"sql","properties":"text\/x-properties","q":"text\/x-q","scala":"scala","scheme":"text\/x-scheme","tcl":"text\/x-tcl","vb":"text\/x-vb","verilog":"text\/x-verilog","yaml":"text\/x-yaml","z80":"text\/x-z80"}