LINUX.ORG.RU

Надёжный GUI-less веб браузер


0

2

Существует ли сабж? HtmlUnit оказалось тормознутым говном. Просто виснет и вешает весь комп вместе с собой на одном веб сайте. Такое неприемлемо. Требуется поддержка JavaScript для сбора ссылок упрятанных за onclick events. Что использует гугл?


Так вам надо «паука», или текстовый веб-браузер? Если второе, то это даже emacs умеет. Напишите скриптец, и он будет вам ссылки собирать ))))

А вот насчет второго сложнее. Но вы должны уточнить вопрос.

Auriel
()

Рекомендую взглянуть на vimprobable

anonymous
()

JavaScript для сбора ссылок упрятанных за onclick events

Если нужно заставить ЭВМ собирать данные - не проще сделать перл-скрипт, а в него через wget или curl давить строки? Или вам все же для чтения нужно?

sudo-s
()
Ответ на: комментарий от wwwsevolod

Две бутылки красного эсторского благородному дону.

cdshines ★★★★★
()
Ответ на: комментарий от sudo-s

Если нужно заставить ЭВМ собирать данные - не проще сделать перл-скрипт, а в него через wget или curl давить строки? Или вам все же для чтения нужно?

wget и curl умеют выполнять JavaScript в onclick?

tyler19
() автор топика
Ответ на: комментарий от tyler19

они хороши если яваскриптом нормально владеешь, глючные может быть, но я не сказал бы что сильно мешало мне использовать, и я сказал бы что каспер глючный, а фантом нет (каспер поверх фантома но он как замена Selenium'а, фантом голый хэдлес браузер)

wwwsevolod
()
Ответ на: комментарий от tyler19

Можешь посмотреть watir, но не помню только для ruby он или нет. Часто идёт страшным oberhead'ом, зато можно практически любое пользовательское действие сделать.

anonymous
()

Если код в onclick относительно похожий, я бы его тупо парсил. Без js, браузеров и прочей мишуры.

x3al ★★★★★
()
Ответ на: комментарий от tyler19

проблема пропарсить весь хтмл на перле регэкспами, вывести ссылки и отдать их как параметр в следующий пункт конвеера?

sudo-s
()

phantomjs единственный адекватный headless браузер. Гугл, очевидно, тоже использует какой-то вебкит.

zz ★★★★
()
Ответ на: комментарий от anonymous

Мне очень нравится, что один человек пишет ерунду типа «Язык, специально придуманный для раскройки больших объемов текста и форматированного его вывода, совершенно не предназначен для того, что бы, используя свой мощнейший механизм, которому нет равных, взять кусок текста и выбрать оттуда лишь нужные ошметки». Если бездумно расставить регэкспов - да, можно покрошить весь процесс, а есть люди, которые еще умеют думать своей головой, а не полагаются на мнение анонимуса на сомнительном форуме. С тем же успехом можно в качестве достоверного источника использовать говнокод.ру или просмотреть лабораторные первокурсников на С. Если один криворукий быдлокодер не осилил даже грамотное проектирование регэкспа, то не думаю, что к его мнению стоит сколько-нибудь прислушиваться. Мне доводилось перл-скриптом на десятки экранов парсить гектары XML, HTML и XHTML. И все почему-то работало на ура. Магия?

sudo-s
()
Ответ на: комментарий от sudo-s

sudo-s

проблема пропарсить весь хтмл на перле регэкспами, вывести ссылки и отдать их как параметр в следующий пункт конвеера?

А этот ваш пёрл может для начала выполнить js чтобы эту самую страницу получить?

andreykyz ★★
()
Ответ на: комментарий от anonymous

А ты точно htmlunit правильно готовишь? Дай URL, на котором он умирает.

http://google.com/ на 75 элементе в этой итерации. Ф-ция рекурсивно вызывает себя что бы обновить страницу и проверять следущий элемент на наличие onclick. После того как она печатает currentElementIndex: 74, судя по дебагеру он виснет на 75 элементе. в вызове `HtmlPage htmlPage2 = htmlElement.click();`. Timeout не помогает. Существует ли какой то метод обернуть эту строчку во что то что убивало бы его после некоторого времени хотя бы? Ну и комп виснет, в top вверху какой то процесс наподобие kswapd0 и под ним java.

    public void process(URL url) throws IOException {
        System.out.println("currentElementIndex: " + currentElementIndex + "\n");
        WebClient webClient = createWebClient();
        webClient.setTimeout(5000);

        HtmlPage htmlPage = webClient.getPage(url);
        redirectChain = new ArrayList<RedirectInfo>(
                ((HistoryHttpWebConnection)webClient.getWebConnection()).redirectChain
        );

        Iterator<HtmlElement> iterator = htmlPage.getHtmlElementDescendants().iterator();
        int i;
        for (i = 0; iterator.hasNext() && i < currentElementIndex; i++) iterator.next();
        for (; iterator.hasNext(); currentElementIndex++) {
            HtmlElement htmlElement = iterator.next();
            HtmlPage htmlPage2 = htmlElement.click();
            if (htmlPage != htmlPage2) {
                List<RedirectInfo> x = new ArrayList<RedirectInfo>();
                List<RedirectInfo> newRedirectChain = new ArrayList<RedirectInfo>(
                        ((HistoryHttpWebConnection)webClient.getWebConnection()).redirectChain
                );
                for (int j = redirectChain.size(); j < newRedirectChain.size(); j++) {
                    x.add(newRedirectChain.get(j));
                }
                links.add(new Link(htmlElement, x));

                System.out.println("HTML Element: " + htmlElement + ", " + htmlElement.getTextContent());
                for (RedirectInfo ri : x) {
                    System.out.println(ri.url + "\t\t\t" + ri.status);
                }
                System.out.println("--------------------------------\n");

                currentElementIndex++;
                process(url);
                return;
            }
        }

        webClient.closeAllWindows();
    }
tyler19
() автор топика
Ответ на: комментарий от x3al

Если код в onclick относительно похожий, я бы его тупо парсил. Без js, браузеров и прочей мишуры.

Речь идёт не о скрэпинге одного веб сайта с одинаковым форматом страниц (я такого много сделал curl'ом и regexp'ами) а об утилите способной извлечь onclick ссылки с любого веб сайта. Хотелось бы увидеть как вы regexp'ами пропарсите когда столько вариантов: может быть в аттрибуте onclick=«» или с помощью jquery $('#id').click(functin () {...}), может быть во внешнем JS файле.

tyler19
() автор топика
Ответ на: комментарий от andreykyz

ксо. для тех, кто ниасилил конвееры, поясняю алгоритм:

1. curl'ом взять HTML как текст (так устроен curl)
2. этот текст пропарсить перл-скриптом, получить на выходе ссылки (так устроен перл-скрипт)
/*для того, чтобы получить ссылку, по ней НЕ ОБЯЗАТЕЛЬНО проходить, она прописана в коде страницы, (так устроен html), нужно лишь регэкспами отсечь все лишнее в строке с "onclick" (так устроены регэкспы).*/
3. эти ссылки вывести в stdout или в файл. если нужно по ним пройти (для статистики, скажем) - запускается баш-скрипт, который последовательно (так устроен баш) берет по одной ссылке и запускает браузер с параметром, например, "links2 http://linux.org.ru/" и браузер открывает эту страницу (так устроены браузеры). А потом выполняет kill для этого браузера, что его закрывает (так устроен Unix), после чего (так устроены ЭВМ) выполняется следующая инструкция, т.е. запуск браузера по новой ссылке (так устроены параметры). 
Итог: мы имеем 2 несложных скрипта на БАШ и Перл. У нас есть файл со всеми ссылками со страницы (или отсеянные по какому-либо критерию), имеем проход по каждой из ссылок с данного IP. Разве это не замечательно?

sudo-s
()
Последнее исправление: sudo-s (всего исправлений: 1)
Ответ на: комментарий от tyler19

или с помощью jquery $('#id').click(functin () {...}), может быть во внешнем JS файле.

Так ведь ничего не мешает брать строки с «script src», например, тем же curl'oм их получать, парсить их на предмет подобных ссылок. Машину ж заставлять этим заниматься, не самому выискивать.

sudo-s
()
Ответ на: комментарий от sudo-s

«взять кусок текста и выбрать оттуда лишь нужные ошметки»

Ты ламер, и тебя близко нельзя подпускать к программированию.

HTML - это не «текст», это контекстно-зависимый язык с очень непростой грамматикой. Из него нельзя «выбрать нужные ошметки», его можно только полноценно парсить и делать полный семантический анализ. А по условию ТС там еще и динамически генерится DOM в JS, так что ты и парсером не отделаешься, тебе придется исполнять весь JS (который тоже может генериться динамически).

И тут вылезает эдакое ламоватое нечто, и начинает верещать пионерский бред про «мощнейший механизм, которому нет равных».

Если один криворукий быдлокодер не осилил даже грамотное проектирование регэкспа, то не думаю, что к его мнению стоит сколько-нибудь прислушиваться.

Нет, придурок ничтожный, никогда нельзя «парсить» регэкспами что бы то ни было, кроме РЕГУЛЯРНЫХ грамматик. Регэкспы твои убогие - это самый низший уровень развития, это самая тупорылая и примитивная форма парсинга. Если ты, ничтожество, не осилил ничего кроме этого, то это не повод для гордости.

Мне доводилось перл-скриптом на десятки экранов парсить гектары XML, HTML и XHTML. И все почему-то работало на ура. Магия?

Нет, всего лишь грязная ложь. Ты не можешь регэкспом парсить HTML. В принципе. Никогда. Малейшее изменение без нарушения семантики сломает твого говняный регэксп.

anonymous
()
Ответ на: комментарий от sudo-s

Ламер, грязный ламер...

Повторяю для тупого быдла - никаких таких «ссылок», для которых возможно сформулировать регэксп, там может и не быть. DOM будет сгенерен динамически из десятков разных источников потенциально сколь угодно сложным кодом на JS.

Ты не программист, ты тупое говно. Иди лучше в дворники, не позорь профессию.

anonymous
()
Ответ на: комментарий от sudo-s

Вот опять быдло употребляет слово «парсить» в одном контексте с регэкспами. Придурок, ты не понимаешь, что регулярные выражения могут парсить только регулярные грамматики, а HTML и JS регулярными не являются?

Ты не понимаешь, гадкая грязь, что JS - это Тьюринг-полный язык. Который может ВСЕ. А регвыры твои Тьюринг-полным языком не являются, а даже если бы и являлись (см. Марковские алгорифмы), писать на регвырах полный интерпретатор JS с полной поддержкой DOM будет только абсолютно невменяемое ничтожество.c

anonymous
()
Ответ на: комментарий от anonymous

HTML - это не «текст»

Удивлю, но все же текст. И скрипты - тоже текст. И даже исходники - это тоже простой текст. Разве что написанный согласно определенным правилам.

Регэкспы твои убогие - это самый низший уровень развития

Перл великолепен в обработке текста, а также для интегрирования в единое целое разных вещей. Ведь для языка сценариев (скриптов) - все эти разные вещи являются по сути одним и тем же. --John Ousterhout, создатель языка сценариев Tcl.

Регулярные выражения в perl одна из самых мощных его возможностей. Они позволяют сопоставлять текст с указанным шаблоном, разбивать текст в массив по шаблону, производить замену текста по шаблону и многое многое другое. Стив Холзнер

Нет, всего лишь грязная ложь. Ты не можешь регэкспом парсить HTML. В принципе. Никогда.

Удивительно. Да, наверное я был неправ, мой скрипт просто так лежит файлом на диске, а комп, получив xml/html на полгектара, рассылает его равными долямя детям Эфиопии, которые старательно переписывают полученное от руки, запечатывают в конверты и с почтовыми голубями отсылают их индусским голодающим семьям, которые штрихом замазывают то, что я хотел отбросить регэкспом. А потом отсылают обратно в Эфиопию, где все каллиграфическим почерком заново переписывается, сканируется, распознается и отсылается обратно мне на комп. Вот я глупый, думал, что это перл мне текст перерабатывает.

sudo-s
()
Ответ на: комментарий от anonymous

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

Вот тут согласен, упустил этот момент.

sudo-s
()
Ответ на: комментарий от sudo-s

не проще сделать перл-скрипт, а в него через wget или curl давить строки? Или вам все же для чтения нужно

хм, лучше python с urllib и с beutifulsoup

XoFfiCEr ★★☆☆
()
Ответ на: комментарий от XoFfiCEr

Ну, питона я не знаю. На перле делал по приведенному выше описанию, работает. Правда, вот, curl'ом в этом случае не отделаешься.

sudo-s
()
Ответ на: комментарий от sudo-s

Вот тут согласен, упустил этот момент.

Ты упустил момент, когда тебе надо было выбрать карьеру дворника. Пошел зачем-то в программисты, и теперь позоришь профессию.

anonymous
()
Ответ на: комментарий от sudo-s

Так ведь ничего не мешает брать строки с «script src», например, тем же curl'oм их получать, парсить их на предмет подобных ссылок. Машину ж заставлять этим заниматься, не самому выискивать.

Да я против regexp'ов ничего не имею, не понимаю чего одно упоминание о них некоторых тут выводит из себя. Ну эти теоретики сколько угодно могут бросаться математическими терминами - то что для того что бы выдернуть пару ссылок из HTML regexp идеально подходит это факт, DOM парсеры громоздкие и жрущие память, во многих случаях их применение - из пушки по воробьям. Особенно когда надо быстро наклепать скрипт для копирования данных из какой то веб базы где все страницы однотипные. Я такое сотни раз делал regexp'ом в PHP + Curl и каждый раз всё отлично работало. Один раз попробовал DOM парсер и выяснилось что скрипт жрёт память а на компе заказчика вообще не запустился из за старой версии PHP. С другим DOM парсером разбираться не было никакого желания, переписал всё с regexp'ом и все довольны.

Однако в данном случае данный вариант совершенно неприемлем. Конечно не проблема если все ссылки имеют такой формат <span onclick=«window.location.href='http://url.com/'">Click Me!</span>. Однако window.location.href может устанавливаться к примеру из переменной, а значение этой переменной может быть скомпановано из некоторых составляющих, некоторые из них могут быть получены через XmlHttpRequest или вычислены каким то образом. Т.к. требуется не частное решение для какого то одного веб сайта где все страницы однотипны, а общее решение - то что вы предлагаете аналогично по трудоёмкости переписыванию того же вебкита с нуля.

Попробовал PhantomJS - это супер. Как раз то что мне надо. Работает идеально, память не жрёт, быстрее HtmlUnit раз в 100.

tyler19
() автор топика
Ответ на: комментарий от tyler19

Однако window.location.href может устанавливаться к примеру из переменной, а значение этой переменной может быть скомпановано из некоторых составляющих, некоторые из них могут быть получены через XmlHttpRequest или вычислены каким то образом

Да, вот тут я промахнулся.

sudo-s
()
Ответ на: комментарий от tyler19

Да я против regexp'ов ничего не имею, не понимаю чего одно упоминание о них некоторых тут выводит из себя.

А ты почитай вышеприведенные ссылки, поймешь.

Грубо говоря, «парсинг» регэкспами - это наивернейший признак быдлокодера самого никчемного, ничтожного пошиба, пасть ниже уже просто некуда.

выдернуть пару ссылок из HTML regexp идеально подходит

Только не надо при этом называть это словом «парсинг». А хуже всего, когда начинается все с «выдернуть пару ссылок», а заканчивается адским месивом из регулярного говна. Лучше сразу делать правильно.

Один раз попробовал DOM парсер и выяснилось что скрипт жрёт память а на компе заказчика вообще не запустился из за старой версии PHP.

Надо быть куском дебила, чтобы делать это на PHP. Есть полно быстрых (очень быстрых) и надежных DOM-парсеров. Но, конечно же, не для быдлоязычков.

anonymous
()
Ответ на: комментарий от anonymous

А ты почитай вышеприведенные ссылки, поймешь.

Грубо говоря, «парсинг» регэкспами - это наивернейший признак быдлокодера самого никчемного, ничтожного пошиба, пасть ниже уже просто некуда.

Расскажите чем этот парсинг regexp'ами вас так задел до глубины души что вы унижаетесь до оскорблений. Создаётся впечатление что для вас это вопрос религии в то время как для меня всего лишь один из инструментов который может быть удобен или нет в зависимости от задачи.

Только не надо при этом называть это словом «парсинг». А хуже всего, когда начинается все с «выдернуть пару ссылок», а заканчивается адским месивом из регулярного говна. Лучше сразу делать правильно.

Какая разница как назвать, вы же математик, такими терминами нас закидали, вам ли не знать что от того как назвать объект смысл не меняется.

Да действительно, бывает адское месиво. Но во многих случаях это лучше того к чему может довести ваш подход. Когда тот самый скрипт для пары ссылок тянет за собой сотни библиотек вместе с их зависимостями. По каждому чиху память засирается тысячами новых классов и их объектов. Теоретический подход крайне редко хорош на практике без изменений, надо идти на компромисс. И ещё - если речь идёт о написании скрипта на 200 строк то ничего страшного, сможете потом его переписать по своему, десяток regexp'ов думаю сумеете расшифровать.

Надо быть куском дебила, чтобы делать это на PHP. Есть полно быстрых (очень быстрых) и надежных DOM-парсеров. Но, конечно же, не для быдлоязычков.

Условия частенько ставит заказчик. PHP весьма распространён среди вебмастеров, многие ничего другого не знают и разбираться не желают. Прошу вас так же не быть голословным и озвучить хотя бы несколько быстрых и надёжных DOM-парсеров.

tyler19
() автор топика
Ответ на: комментарий от sudo-s

anonymous

DOM будет сгенерен динамически из десятков разных источников >>потенциально сколь угодно сложным кодом на JS.

sudo-s

Вот тут согласен, упустил этот момент.

Ты похоже остановился в развитии лет так на 10.
Попробуй проверить почту через gmail.com в аякс режиме при помощи bash и perl.

andreykyz ★★
()
Ответ на: комментарий от tyler19

Расскажите чем этот парсинг regexp'ами вас так задел до глубины души что вы унижаетесь до оскорблений.

Где ты оскорбления увидел? Я лишь констатирую факт. Парсишь регэкспами - быдлокодер. Факт. Близко тебя к программированию подпускать нельзя, тоже факт. Объективный.

Создаётся впечатление что для вас это вопрос религии в то время как для меня всего лишь один из инструментов который может быть удобен или нет в зависимости от задачи.

Это не «инструмент», это маркер. Идеально, безошибочно работающий. «Парсит» регэкспами - следовательно, быдлокодер. Без вариантов.

Условия частенько ставит заказчик.

Ты - анальный раб?

PHP весьма распространён среди вебмастеров, многие ничего другого не знают и разбираться не желают.

Точно, ты - анальный раб.

Прошу вас так же не быть голословным и озвучить хотя бы несколько быстрых и надёжных DOM-парсеров.

Xerces, например.

anonymous
()
Ответ на: комментарий от anonymous

watir, но не помню только для ruby он или нет

он-то для руби (watir - ruby, watij - java, watin - c#), только тут это явный оверхед

vostrik ★★★☆
()
Ответ на: комментарий от vostrik

он-то для руби (watir - ruby, watij - java, watin - c#), только тут это явный оверхед

Здесь http://watir.com/ написано что в headless mode он использует HtmlUnit. Нафиг эту обвязку, HtmlUnit сам по себе способен повесить машину. Одно слово - Java.

tyler19
() автор топика
Ответ на: комментарий от anonymous

Xerces, например.

Для Python или ruby есть что нибудь?

PS. Прошу меня извинить, на ваш бред про анальных рабов отвечать нет времени.

tyler19
() автор топика
Ответ на: комментарий от anonymous

На Java. Гуляй мимо, похапэшничишек.

Бугага, Java. У тебя я вижу всё говно кроме Java. Только у меня ни разу комп не загибался ни от python, ни от ruby, ни от PHP, а от Java - пожалуста. Твоя Java так засирает память что приводит к такому активному свопингу что I/O загибается. Так что в итоге тормозит?

tyler19
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.