ASVShade

Блог Вавилова Александра

  • Home
  • Posts RSS
  • Comments RSS
  • Edit

Архив блога

  • ▼  2011 (3)
    • ▼  сентября (1)
      • Обновление цен с SSG
    • ►  марта (1)
      • А кто такой заяц?
    • ►  января (1)
      • Sorry, I don`t Russian
  • ►  2010 (4)
    • ►  ноября (1)
    • ►  августа (1)
    • ►  февраля (1)
    • ►  января (1)
  • ►  2009 (10)
    • ►  ноября (1)
    • ►  октября (2)
    • ►  июля (2)
    • ►  июня (2)
    • ►  мая (1)
    • ►  апреля (1)
    • ►  февраля (1)
  • ►  2008 (7)
    • ►  сентября (2)
    • ►  августа (2)
    • ►  июля (3)

Обо мне

ASVShade
Просмотреть профиль

Обновление цен с SSG

by ASVShade

Всем добрый день!

Меня несколько раз спрашивали как работает программа по обновлению цен на карты с сайта http://www.starcitygames.com.

Вот решил немного рассказать об этом и выложить исходники.

Разработка всего этого заняла всего пару выходных, за то польза на долгое-долгое время)

Хочу отметить что вначале все это было реализовано когда то давно на Delphi 2009 – Delphi 2010 и хранение результатов в текстовых файлах, но чуть позже переписано на Java + MySQL.

Сегодня как раз и рассмотрим как это все работает именно на Java.

Алгоритм будет у нас следующий:

  1. Формируем массив состоящий из названий необходимых карт
  2. С цикле запрашиваем по HTTP страницы с картами (обычный метод “Get”)
  3. Обрабатываем полученные страницы как строки, избавляя их от HTML мусора
  4. Далее обрабатываем эти уже очищенные страницы как XML
  5. Сохраняем полученные результаты

Для начала немного о типах

Массив для карт:

public class CardsSSGPrice {
    public ArrayList<CardSSGPrice> Cards = new ArrayList<CardSSGPrice>();
}

Сама карта:

public class CardSSGPrice {
    public String fName;
    public String fSet;
    public String fCondition;
    public String fStock;
    public String fPrice;
    public CardSSGPrice(
            String Name,
            String Set,
            String Condition,
            String Stock,
            String Price) {
        this.fName=Name.replaceAll(" ","+");
        this.fSet=Set;
        this.fCondition=Condition;
        this.fStock=Stock;
        this.fPrice=Price;
    }

Метод который запрашивает страницу:

    private String GetHTMLFile(URL u) {
        String s = "";
        InputStream is = null;
        try {
            is = u.openStream();
            BufferedReader BR = new BufferedReader(new InputStreamReader(is));
            String Temp = BR.readLine();
            while (Temp != null) {
                s = s + Temp + "\n";
                Temp = BR.readLine();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                assert is != null;
                is.close();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
        return s;
    }

Метод проводящий очистку страницы от HTML мусора

private String ParsStr(String str) {
    int posB;
    int posE;
    //удаляем шапку
    posB = str.indexOf("<tr class=\"deckdbbody\">", 0);
    str = "<table>\n" + str.substring(posB, str.length());
    //удаляем хвост
    posE = str.indexOf("<tr><td colspan=\"10\" align=\"center\">", 0);
    str = str.substring(0, posE) + "</table>";
    //удаляем мелочь
    str = str.replaceAll("<br>", "");
    str = str.replaceAll("&nbsp", "");
    str = str.replaceAll("&", "");
    str = str.replaceAll("\\]", "");
    str = str.replaceAll("\\[", "");
    str = str.replaceAll("<div style='text-align: center;'>", "");
    str = str.replaceAll("</div>", "");
    str = str.replaceAll("<b>", "");
    str = str.replaceAll("</b>", "");
    str = str.replaceAll("<tr height=\"4\"><td colspan=\"11\" class=\"deckdbheader\"></td></tr>", "");
    str = str.replaceAll("<img src=\"
http://static.starcitygames.com/sales//images/plus_white.png\" alt=\"\\+1 Qty\\\" width=\\\"16\\\" height=\\\"16\\\">", "");
    //Удаляем все блоки input
    posB = str.indexOf("<input ");
    while (posB != -1) {
        posE = str.indexOf(">", posB);
        str = str.replaceAll(str.substring(posB, posE + 1), "");
        posB = str.indexOf("<input ");
    }
    //Удаляем все блоки img
    posB = str.indexOf("<img ");
    while (posB != -1) {
        posE = str.indexOf(">", posB);
        str = str.replaceFirst(str.substring(posB, posE + 1), "");
        posB = str.indexOf("<img ");
    }
  return str;
}

Ну и самый главный метод

    public ssg(WorkDB MyDB) {
        //заполнение массива карт (здесь уже сами решайте как это удобнее реализовать, я например запрашиваю с БД)
        CardsSSGPrice MyCard = MyDB.GetCardsForPriceSSG();
        //Перебор карт
        for (int i_MyCard = 0; i_MyCard < MyCard.Cards.size(); i_MyCard++) {
            System.out.println((i_MyCard + 1) + " (" + MyCard.Cards.size() + ") [" + MyCard.Cards.get(i_MyCard).fName + "]");
            try {
                boolean PageGo = true;
                int PageNum = 0;
                //Если есть страница для обработки
                while (PageGo) {
                    //Формирование строки запроса и сам запрос
                    String str = GetHTMLFile(new URL(
                            "
http://sales.starcitygames.com//search.php" +
                                    "?substring=" + MyCard.Cards.get(i_MyCard).fName +
                                    "&start=" + Integer.toString(PageNum)));
                    //смотрим есть ли результаты
                    if (str.indexOf("We're sorry!  There are no results with the name ") == -1) {
                        //Посылаем страницу на строковую обработку
                        str = ParsStr(str);
                        //Начинаем работать с XML
                        SAXBuilder builder = new SAXBuilder();
                        Document MyDoc = builder.build(new ByteArrayInputStream(str.getBytes("UTF-8")));
                        List Children = MyDoc.getRootElement().getChildren();
                        //Эти 2 переменные нужны что бы хранить прошлое название, так как если по строкам названия одинаковые, то они не пишутся
                        String Name_Old = "";
                        String Set_Old = "";
                        for (int i = 0; i < Children.size(); i++) {
                            Element Child = (Element) Children.get(i);
                            String Name = "";
                            String Set = "";
                            String Condition = "";
                            String Stock = "";
                            String Price = "";
                            //Название новое
                            if (Child.getChildren().size() == 10) {
                                Name = ((Element) Child.getChildren().get(0)).getValue().trim();
                                Set = ((Element) Child.getChildren().get(1)).getValue().trim();
                                Condition = ((Element) Child.getChildren().get(6)).getValue().trim();
                                Stock = ((Element) Child.getChildren().get(7)).getValue().replaceAll("Out of Stock", "0");
                                Price = ((Element) Child.getChildren().get(8)).getValue().replaceAll("
\\$", "");
                                Name_Old = Name;
                                Set_Old = Set;
                            }
                            //Название не изменилось
                            if (Child.getChildren().size() == 9) {
                                Name = Name_Old;
                                Set = Set_Old;
                                Condition = ((Element) Child.getChildren().get(5)).getValue().trim();
                                Stock = ((Element) Child.getChildren().get(6)).getValue().replaceAll("Out of Stock", "0");
                                Price = ((Element) Child.getChildren().get(7)).getValue().replaceAll("
\\$", "");
                            }
                            //Сохранение результатов (здесь уже сами решайте как это удобнее реализовать, я например сохраняю в БД)
                            MyDB.PriceToDB(Name, Set, Condition, Stock, Price);
                        }
                        if (Children.size() == 50) {
                            PageGo = true;
                            PageNum = PageNum + 50;
                            System.out.println("=========Next Page==========");
                        } else {
                            PageGo = false;
                            PageNum = 0;
                        }
                    } else {
                        PageGo = false;
                        PageNum = 0;
                        System.out.println("=========No Results==========");
                    }

                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (JDOMException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

Как видите кода не так уж и много, разобраться думаю не составит особого труда.

Всем удачи!

0 коммент.

А кто такой заяц?

by ASVShade






Посмотрел я итоги выбора талисмана Сочи-2014. Это просто какой-то абзац товарищи!
В целом видно что конечную обработку идей проводил один и тот же рукожопый дизайнер. Может кому то и нравится стиль, в котором выполнены сие монстры, но по моему они реально убогие.
Представлены же они были в прямом эфире Первого канала Иваном Ургантом. Вообще-то из того что я там увидел я бы проголосовал за самого Ивана. Тот стиль, что он выбрал при демонстрации: эдакий веселый небритый звереныш – вылитый Талисман!

Теперь разберем каждого:





Дельфин: По мне так сам дельфин – доброе животное, которого любят все люди и дети, и который является символом Сочи, и должен был стать Талисманом, но… Об этом ниже. Выполнен же он слишком навязчиво. Видимо американская ехидная улыбка начинающего ганстера – гопаря убила все желание народа голосовать за него.






Матрешки: Матрешки символ России это факт. НО ПЛЯ не в таком же виде. Кегли от игры в боулинг немного перевыпили и на несвежу голову предстали перед зрителями. Вы всмотритесь в них – это же просто ахтунг какой то товарищи. Над адекватностью этих ммм… «матрешек» стоит вообще задуматься.






Снегирь: «Ой, щас кто-то испортит воздух» - первое что пришло мне в голову когда я увидел этот экземпляр. Вообще у меня снегири с красными грудками и острыми взглядами являются любимыми птицами, но этому синему снегирю явно плохо – весь образ говорит об этом… - нееее такого нельзя в талисманы.






Снежинка: Ну конечно: Вам нужен талисман-инвалид – ТАААДАААА заворачивайте! Меланхоличная дама, скорее всего с выпавшими волосами) с неудавшимся костюмом бетмена готова.






Огненный мальчик: Ну и в пару к Снежинке, парень в полной релаксации, видимо под полным кайфом с придурковатой улыбкой и шапке индейца.






Солнышко: По названию хорошая идея, яркий добрый персонаж. Исполнение же, как всегда: Девушка Прасковья из-под Подмосковья. Взгляд будто справа кирпичом заехали.






Зайка: Ну что зайка, как зайка такой нейтральный незапоминающийся персонаж. О нем тоже ниже…






Белый медведь: Вот тут конечно произошла полная херня. Образ Белого медведя тупо скопирован с образа Мишки 80. О чем написано на ленте. Медведь стал более толстый и белый. Копирайт в минус – обидно, очень обидно что такое происходит.






Леопард: Самый проработанный в деталях персонаж. Неплохая динамика в образе в общем из того что здесь представлено это безусловно лучший вариант… Интересно почему?






Бурый медведь: А вот и тот, кто Солнышку кирпичом заехал. Авторы будто лукаво намекают: товарищи, это же и есть наш истинный талисман – коричневое тело с тупым, сфокусировавшимся на одном месте взглядом. Дополняет образ неприлизанный хохолок и видимо атрофированная после дикой попойки правая рука – Блеск!






Дед Мороз: Конечно не особо понятно отношение Деда Мороза к олимпиаде, НО именно его поддерживало большинство народа. В итоге деда мороза исключили со списка с первого места. По исполнению же как обычно твердая двойка. Ни радости, ни спорта. Поставить перед собой и с горя выпить.

Теперь перейдем итогам выбора:
Снежинка + Огненный мальчик как и следовало ожидать нашли своих места для инвалидов.
Бурый медведь с попойки – 3%
Матрешки-непоняшки - 5%
Солнышко-дурашка - 8%
Снегирь - ща пёрну -10%
Дельфин - 12%
Остальные (Леопард, Белый медведь и Зайка) - 62 % и стали победителями.
Главный вопрос: а почему 2+3?
Ну 2 понятно, парочка снежинка и лучик друг без друга не могут, а вот почему +3?
Неужели все такие охрененные символы, что просто не выбрать? Вот сколько я не читал на форумах, сколько не спрашивал у знакомых, никто не поддерживает идею целых 5 символов. Так почему 2+3?
В интернете полно шуток на эту тему, долго и искать не нужно.
Действительно видимо Леопард крутой съест всех. Медведь безобидный, в принципе, но если кто дорогу перейдет, мало не покажется. А зайцам - сидеть боятся!





Теперь кого бы что бы я выбрал символом. Над символом паралимпийских игр чет мне задумываться неохота, да и претендентов кроме тех двух кадров нет. А вот символом олимпийских игр я бы выбрал Дельфина, но не того что представлен на конкурсе, а оригинального…

Кстати еще задолго до официального голосования в Сочи народу представили всего 4 претендента: Дед Мороз, белый медведь, снежинка на лыжах и дельфин.
Народ единогласно проголосовал за дельфина – он действительно там милый… Но пришло всероссийское голосование, с зайцев собрали по 1.44 руб. на смску и выбрали то, что выбрали, с чем я Вас всех и поздравлю!

P/S/ Для поднятия настроения советую все же порыться в интернете и почитать темы с обсуждением этих монстров. Например тут

2 коммент.

Sorry, I don`t Russian

by ASVShade

Уже наверное как года я использую очень действенный способ отвязаться от всяких прилипал в городе.
Идешь бывает по городу никого не трогаешь и тут бац пристает какой нибудь мужик:
- А Вы не поможет 10 рублей на проезд не хватает.
Ну или вручая какую нибудь ненужную мне книгу типа почитайте и может купите. На крайняк бывает что липнут с помочь найти куда то дорогу.
В общем выход это смотря в глаза человеку очень четко произнести:
- Sorry, I don`t Russian.
Эта фраза помогает в 100% случаев (почти). Первые секунд 10 обратившийся тупо втыкает что произошло (ведь в его планах не было такого разворота событий), а потом я уже успеваю отойди на безопасное расстояние. И вроде как человеку не отказал, и вроде как и не помог.
Но что произошло сегодня, стоит рассказать отдельно.
Иду значит примерно в 23:30 по Невскому домой. Тут ко мне подбегает вполне нормальная девушка и выдает:
- Ой, вы не могли бы мне помочь, мне нужно немного денег на…
Дослушивать эту печальную историю у меня не было желания, и я выдал свое коронное:
- Sorry A don`t Russian. – и зашагал дальше.
Девушка задумалась буквально на 2 секунды, после чего себе под нос пробурчала:
- Ах, блять так – и после этого догоняя меня начала говорить милым голоском – Sorry, can you help me, I`am need a money…
Ржач на меня напал неимоверный, девушка сразу же от меня отстала, а я от смеха еле доперся до метро.

P/S/ Хорошо что она не добавила что нибудь тиба Факкинг Американ пипл))) Хотя кто знает)

0 коммент.
Следующие Предыдущие Главная страница

2010 Designed by Wordpress Theme Designer Wordpress Theme Designer Blogger Templates by Blogger Template Place | Blogger Tutorial