swamp_agr (swamp_agr) wrote,
swamp_agr
swamp_agr

Пицца. часть вторая.

Эти ребята делают классную пиццу.

По крайней мере в Кировском районе города Санкт-Петербурга. Конечно, в Купчино о них отзываются неважно, но на то оно и Купчино, чтобы неважно отзываться об окружающих.

Не так давно, каких-то пару месяцев назад, в компании, которой мне выпала честь работать по сей день, решили организовать "корпоратив" в честь празднования какого-то праздника: то ли 23 февраля, то ли 8 марта, то ли всех сразу. В качестве досуга был избран боулинг. Так сложилось, что свободный и оптимальный для празднования клуб находился как раз в Купчино. В назначенное время я подъехал в клуб. Зашёл, переобулся и, как водится, осмотрелся по сторонам. Каково же было моё удивление увидеть катающих шары детишек под (это даже музыкой язык с трудом поворачивается обозвать) "реп", в котором через слово встречался мат. А детишки слышат, но не слушают, не понимают музыки. Им с детства так нагло вдалбливают купчинский жизненный стереотип. Я двадцать минут сдерживал себя в руках, чтобы не "психануть". Я испытал настоящее страдание и получил наслаждение от волевого усилия, направленного на сдерживание в себе порыва гнева. Просчитывал, как можно покалечить охрану (чтобы не мешала), бармена (у него ведь проигрыватель стоял), гардеробщицу (за компанию), а также заинтересовался адресом офиса (напоследок). Подошёл к бармену и сквозь зубы сказал, что "мой друг плохо переносит мат, особенно, когда он отовсюду звучит, он становится неадекватен и калечит людей", указав в сторону, где никого не было. Много было услышано в свой адрес, в адрес несуществующего (ха-ха) друга, но реп прекратился, из колонок зазвучало что-то зарубежное. Так закончилась битва за подсознание детишек. Не было благодарностей. Был боулинг, были такими довольными наивные детские лица коллег.

На этом возвращаюсь к пицце. Эти ребята делают классную пиццу, я уже говорил. Но у них до невозможности безобразный сайт. Что первая его версия, что вторая - обновлённая.

До 7 кликов нужно было осуществить, чтобы узреть конкретную пиццу и её состав. Юзабилистам-аналитикам надо поставить "неуд" и лишить премии заодно, только я уверен, их не было.

В результате я решил исправить ситуацию, взяв в свои руки и написав парсер для сайта с пиццами, продолжив, тем самым, своё знакомство с языком Perl.

Парсер закончен. Прототип сайта, крутящегося на локалхосте (большее и не нужно), исправно работает. Пусть за рекламу пиццерии мне никто не платит, оно мне нужно. Как нынче модно выражаться: всё - тлен; пицца, боулинг, "реп" - тоже.


#!/usr/bin/perl

# author: swamp_agr

use strict;
use warnings;
use LWP;
use URI;
use HTML::TreeBuilder;
use locale;
use Encode;
use utf8;

##################### функции ########################

# Открыть menu.xml и прочитать массив наименований.
sub read_file(\@) {
    my @tmp = @_;
    open FILE, "<", "/var/www/ollis/menu.xml" or die $!;
    while (<FILE>) {
    if ($_ =~ /<item>(.*?)<\/item>/g) {
        push(@tmp, $1);
    }
    }
    close(FILE);

    @_ = @tmp;
    return @tmp;
}

# Считать страницу сайта с меню и образовать хэши, содержащие ключи, 
# совпадающие с наименованиями из массивов, а значения - 
# числовые категории меню; на выходе имеем массив хэшей.
sub get_menu_items(@) {
    my @tmp = @{$_[0]};
    my $tmp1 = $_[1];
    my $tmp2 = $_[2];
    my @result;
    
    my $menu = $tmp1->get( $tmp2 )->content;
    for (my $i = 0; $i < @tmp; $i++) {
    my $tmp = $tmp[$i];
    $menu =~ s/\n//g;
    if ($menu =~ /<a href="\/menu\/category([0-9]*?)\/" class="r_menu_item"><span class="cnt">($tmp).*?<\/a>/g) {
        my %hash = (
        'id' => $i,
        'category' => $2,
        'number' => $1
        );
        push @result, \%hash;
    }
    }
#    print "$result[0]->{'number'}", "\n\n";
#    print $result[0]{'id'};
    return @result;
}

# По хэшам просканировать каждую категорию меню и сформировать итоговую страницу
sub get_all_pizza (@) {
    my @tmp = @{$_[0]};
    my $tmp1 = $_[1];
    my $tmp2 = $_[2];
    my $result = '';
    my $arrayLength = @tmp;

    for (my $i = 0; $i < $arrayLength; $i++) {
    my $page = $tmp1->get( $tmp2 . $tmp[$i]{'number'} )->content;
    $page =~ s/\n//g;
    $page =~ s/\s{2,}/ /g;

    # выбор шаблона для поиска 
    while ($page =~ m/(<div class="meal_item">.*?<!-- end .meal_item -->.*?<div class="box_price_order">.*?<!-- end .prices -->)/g) {
        my $pattern = $1;

        if ($pattern =~ m/<div class="meal_item">.*?<a href="(\/images\/_[0-9]*?\.jpg)" class="box_img f_box" title="(.*?)"><img src="\/images\/_[0-9]*?_thumb\.jpg" alt=".*?"><\/a> <a class="add_address meal_name.*?">(.*?)<\/a>.*?<div class="meal_price">(.*?)<\/div>/g) {
        $result = $result . '<tr><td class="name">' . $3 . '</td><td class="content">' . $2 . '</td><td class="price">' . $4 . '</td><td class="image"><img width="300px" height="300px" src="http://www.ollis.ru' . $1 . '" /></td></tr>';
        }
    }

    }
    return $result;
    
}

######################################################

print "Content-type: text/html\r\n\r\n";

my $encoding = 'utf8';
my $author = 'swamp_agr';
my $title = 'Пицца';
my $year = 2013;

my $browser = LWP::UserAgent->new;
my $url = 'http://www.ollis.ru';
my $url_menu = $url . '/menu';
my $url_extend = $url_menu . '/category';

my @category = ();
@category = read_file( @category );
my @hashArray = get_menu_items( \@category, $browser, $url_menu );
my $pizza_html = get_all_pizza( \@hashArray, $browser, $url_extend );
$pizza_html = decode('utf8', $pizza_html);

# наименование  # состав  # цена се    сем./взр.  # картинка
# 100x400   # 200x400   # 50x400        # 400x400

my $web_page = <<HTML;
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta http-equiv="content-type"
    content="text/html; charset=$encoding"/>
    <meta name="author" content="$author"/>
    <title>$title</title>
    <link rel="stylesheet" type="text/css" href="style.css">
    
    </link>
    </head>
    <body>
    <div class="all">
    <table><tr>
    <td class="name" style="height:35px; text-align: center;"><b>Наименование пиццы</b></td>
    <td class="content" style="height:35px; text-align: center;"><b>Ингредиенты</b></td>
    <td class="price" style="height:35px; text-align: center;"><b>Цена (30 см)<b/></td>
    <td class="image" style="height:35px; text-align: center;"><b>Изображение</b></td>
    $pizza_html
    </table>
    </div>
    <div class="btm"><hr/><small>Copyright © $year, $author.</small></div>
    </body>
    </html>
HTML
print $web_page;



Tags: perl, pizza, стихия
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments