Facebook
From Funky Motmot, 6 Years ago, written in Perl.
This paste is a reply to Re: statystyki fotek from Cobalt Tamarin - go back
Embed
Viewing differences between Re: statystyki fotek and Re: Re: statystyki fotek
#!/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 ) {
            push @$galleries, @{
                $tx->res->dom
                    ->find( 'div.gallery a:first-child' )
                    ->map( attr => 'href' ) };
        } else {
            print STDERR join( ': ', $tx->error ), $/;
        }
    }

    return $galleries;
}

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 ) {
            push @photos, map { {
                    gallery => $gallery,
                    position => $counter++,
                    url     => $_
                } } @{ $tx->res->dom
                ->find( 'div.gallery.iItem a:first-child' )
                ->map( attr => 'href' ) };
        }
    }

    return @photos;
}

sub process_photos {
    my ( $agent, $photos, $fh ) = @_;

    my @unsorted;

    foreach my $photo ( @$photos ) {
        my $tx = $agent->get( $photo->{url} );

        if ( $tx->success ) {
            my ( $upload, undef ) = split / /, $tx->res->dom
                ->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/;

            push @unsorted, {
                gallery => $photo->{gallery},
                position => $photo->{position},
                url     => $photo->{url},
                upload  => $upload,
                views   => $views,
                days    => $days,
                average => sprintf "%.2f", $views / $days
            };
        } else {
            print STDERR join( ': ', $tx->error ), $/;
            return;
        }
    }

    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;
}