powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Пример приложения для сканирования сайта
28 сообщений из 28, показаны все 2 страниц
Пример приложения для сканирования сайта
    #39638866
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

На выходных делал приложение командной строки для сканирования сайта angel.co.

Используемые технологии: java8, phantomjs, selenium, jsoup, apache cvs, apache poi.

Может будет кому интересно.

https://github.com/javadev/scan-angel-co

С уважением, Валентин
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39638973
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin KolesnikovПривет!

На выходных делал приложение командной строки для сканирования сайта angel.co.

Используемые технологии: java8, phantomjs, selenium, jsoup, apache cvs, apache poi.

Может будет кому интересно.

https://github.com/javadev/scan-angel-co

С уважением, Валентин


Спасибо .


зы

а вы все проекты одним файлом кода оформляете ?
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39638988
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Valentin KolesnikovПривет!

На выходных делал приложение командной строки для сканирования сайта angel.co.

Используемые технологии: java8, phantomjs, selenium, jsoup, apache cvs, apache poi.

Может будет кому интересно.

https://github.com/javadev/scan-angel-co

С уважением, Валентин


Спасибо .


зы

а вы все проекты одним файлом кода оформляете ?

Пожалуйста.

С уважением, Валентин
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639010
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот за такой ад и не любят java. Ну хоть стримы впилили и то гуд.
Кстати, не понимаю семантику этого метода, но возможно тут баг

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private static List<List<Map<String, String>>> removeDuplicates(List<List<Map<String, String>>> listOfUrlData) {
        List<List<Map<String, String>>> result = new ArrayList<>();
        Map<String, Map<String, String>> urlToItem = new LinkedHashMap<>();
        for (List<Map<String, String>> list : listOfUrlData) {
            List<Map<String, String>> newList = new ArrayList<>();
            for (Map<String, String> item : list) {
                if (urlToItem.containsKey(item.get("url"))) {
                    continue;
                }
                urlToItem.put(item.get("url"), item);
                newList.add(item);
            }
            result.add(newList);
        }
        return result;
    }
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639064
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

Тут выполняется удаление дубликатов.

С уважением, Валентин
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639083
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я чего-то недопонял, но не проще ли было пробегать список от текущего и до конца и удалять дубликаты?
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639084
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettМожет я чего-то недопонял, но не проще ли было пробегать список от текущего и до конца и удалять дубликаты?

Вас только удаление дубликатов заинтересовало. Ну ок.

С уважением, Валентин
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639097
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikovзабыл ник,

Тут выполняется удаление дубликатов.

С уважением, Валентин

Дубликатов чего? У вас настолько вложенная структура данных что я без пол-литра и не разберу..

Код: java
1.
List<List<Map<String, String>>>



Если вы хотите вывести список уникальных ссылок с каждой страницы, то ваш кусок логики -

Код: java
1.
2.
3.
if (urlToItem.containsKey(item.get("url"))) {
                    continue;
                }



не позволит это сделать, потому что если такой же урл был на предыдущей странице, то он скипнется. Я вот это имел ввиду.

А в данной имплементации у вас получается находятся все уникальные ссылки на первой странице, на второй только те что не на первой странице, на третьей -... чтопо мне нелогично, поэтому я и написал что семантика мне непонятна.

Если же я прав(в чем тоже есть сомнения ибо код очевидно хитрый и может так оно и надо) - то ваш код можно сильно упрощать.

В любом случае он адовый конечно..
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639098
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
метод адовый, не весь код конечно:)
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639132
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

Нужно было получить уникальные записи для всех страниц а не внутри одной страницы.

С уважением, Валентин
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639153
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никВот за такой ад и не любят java. Ну хоть стримы впилили и то гуд.
Кстати, не понимаю семантику этого метода, но возможно тут баг

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private static List<List<Map<String, String>>> removeDuplicates(List<List<Map<String, String>>> listOfUrlData) {
        List<List<Map<String, String>>> result = new ArrayList<>();
        Map<String, Map<String, String>> urlToItem = new LinkedHashMap<>();
        for (List<Map<String, String>> list : listOfUrlData) {
            List<Map<String, String>> newList = new ArrayList<>();
            for (Map<String, String> item : list) {
                if (urlToItem.containsKey(item.get("url"))) {
                    continue;
                }
                urlToItem.put(item.get("url"), item);
                newList.add(item);
            }
            result.add(newList);
        }
        return result;
    }


Да. Я думаю что у нас такой код не прошел-бы code-review. Основной поинт - вложенность дженериков.
Их не должно быть так много. Говоря простым языком на каждом уровне вложенности программист
должен понимать "имя" той сущности с которой он работает. Если имя этой сущности
"список-списков-мап-с-ключом-строка"... e.t.c. то разговаривать о таком коде становится
не просто сложно а немыслимо. Как вариант можно разбить эту цепочку дженериков
на вспомогательные классы, которые отражают суть решаемой проблемы.

Кстати сравнительно недавно в смежном топике мы обсуждали NASA-вский документ
рекомендаций по стилю кодирования и там что-то было про ограничение на количество
разыменований в С.
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639164
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Хорошо, я переделаю. Добавлю типизированных классов и создам pull request. Сможете его проверить?

С уважением, Валентин
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639258
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://github.com/javadev/scan-angel-co/pull/1

Так должно быть лучше.

С уважением, Валентин
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639260
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сейчас со смартфона. Неудобно читать исходники.

Я посмотрю вечером ваш чендж. Но если sql. Ru сообщество тоже
Посмотрит то и я буду не против. В конце концов у меня не больше привилегий
В вашем проекте чем у случайного прохожего.
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639273
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Безусловно так гораздо лучше, но мне все равно непонятно почему вы упорно сопротивляетесь алгоритму "в лоб" -

1) сначала схлопываем лист листов в лист(через flatMap)
2) переопределяем equals у DataItem, чтобы сранивались по url
3) переводим list в set, так все дубликаты уйдут
4) переводим set в мап

Никаких foreach, никаких мутабельных структур и тд

ну и
Код: java
1.
2.
3.
4.
5.
          for (CvsItem item : urlToLinkedin) {
          if (item.url.equals(url)) {
               return item.email;
             }
         }



по-моему проще выглядит как

Код: java
1.
urlToLinkedin.filter(...)



Не подумайте что придираюсь, сам функционал хороший, может когда и пригодится. Надо какраз сайт один скачать
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639334
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нельзя схлопывать. На вход идет дерево. На выходе по протоколу тоже дерево.
Возможно автору нужен итератор по урлам но это другая постановка.
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639449
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНельзя схлопывать. На вход идет дерево. На выходе по протоколу тоже дерево.
Возможно автору нужен итератор по урлам но это другая постановка.

Если задача такая, то можно
авторзабыл ник,

Нужно было получить уникальные записи для всех страниц а не внутри одной страницы.

С уважением, Валентин
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639459
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никmaytonНельзя схлопывать. На вход идет дерево. На выходе по протоколу тоже дерево.
Возможно автору нужен итератор по урлам но это другая постановка.

Если задача такая, то можно
авторзабыл ник,

Нужно было получить уникальные записи для всех страниц а не внутри одной страницы.

С уважением, Валентин


При этом разбивка на группы должна оставаться. Результат сохраняется в нескольких файлах а не одном.

С уважением, Валентин
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639676
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин.

1) Твой рефакторинг полезный. Я-бы закоммитил.

Сейчас в среде разработки я вижу еще старую версию и это осложняет дальнейшие улучшения.
Я-бы не остановился на вложенных списках и еще разбил

2) Я обратил внимание что у тебя нет модульных тестов. Я-бы покрыл. Хотя-бы тривиальными. Чтобы
проверять что рефакторинг не сломал основные утверждения.

3) Вложенные списки мне почему-то напоминают мои эксперименты с XML/XPath
лет 10 назад. Подумай, если тебе надо собирать какие-то сведенья с деревьев
то лучшим DSL является XPath.
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639803
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВалентин.

1) Твой рефакторинг полезный. Я-бы закоммитил.

Сейчас в среде разработки я вижу еще старую версию и это осложняет дальнейшие улучшения.
Я-бы не остановился на вложенных списках и еще разбил

2) Я обратил внимание что у тебя нет модульных тестов. Я-бы покрыл. Хотя-бы тривиальными. Чтобы
проверять что рефакторинг не сломал основные утверждения.

3) Вложенные списки мне почему-то напоминают мои эксперименты с XML/XPath
лет 10 назад. Подумай, если тебе надо собирать какие-то сведенья с деревьев
то лучшим DSL является XPath.

Спасибо за коментарий. Добавлю юнит тестов к проекту.

С уважением, Валентин
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639817
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ООП, solid, grasp - да ну нафиг. Все в один класс запихнем и на прод
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639842
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLООП, solid, grasp - да ну нафиг. Все в один класс запихнем и на прод

Там теперь есть встроенные классы и один интерфейс.

С уважением, Валентин
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39639845
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLООП, solid, grasp - да ну нафиг. Все в один класс запихнем и на продкто что умеет.
К парсеру ООП не главное. Увы.
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39664618
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще одно приложение для парсинга сайта.

https://github.com/javadev/scan-google

С уважением, Валентин
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39664793
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Code review point.

Valentin Kolesnikov, почему в одном интерфейсе вы использовали различные способы доступа
к массивам и коллекциям?

Код: java
1.
2.
3.
4.
5.
6.
private interface HeadersAndValues {

        String[] getHeaders();

        List<String> getValues();
}
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39664831
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonCode review point.

Valentin Kolesnikov, почему в одном интерфейсе вы использовали различные способы доступа
к массивам и коллекциям?

Код: java
1.
2.
3.
4.
5.
6.
private interface HeadersAndValues {

        String[] getHeaders();

        List<String> getValues();
}



Такие параметры нужно передавать для библиотеки apache csv.

Массив строк для заголовков и список для данных.

С уважением, Валентин
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39664913
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikov, можно было так.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
        @Override
        public List<String> getHeaders() {
            return Arrays.asList(new String[]{"url", "type", "date", "size"});
        }

        @Override
        public List<String> getValues() {
            return Arrays.asList(url, type, dateTime.toString(), "" + size);
        }


Если беспокоит перформанс - то можно сделать статическую константу. Но во всех случаях
я-бы ставил дизайн интерфейса выше чем удобство его применения в конкретной библиотеке
Apache CSV. Сегодня у вас - апач. А завтра еще десяток других. А этот забитый гвоздь останется
навечно. Вообще есть хорошее правило. Проектировать интерфесы - навечно. Экстендить можно
новые. Но базовые - это сама суть приложения. Костяк если хотите.
...
Рейтинг: 0 / 0
Пример приложения для сканирования сайта
    #39668860
Алексей Cивоплясов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

авторВот за такой ад и не любят java.

Кто не любит ? По вашему этот код написала java?
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Пример приложения для сканирования сайта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]