perl6
Помогающий
Offline
|
|
« : 31-05-2017 21:09 » |
|
Доброго времени суток. Уже несколько дней бьюсь над такой вот проблемой. А именно, как разрешить выборочный редирект. Т.е., парсинг сайта временами заканчивается редиректом на левые страницы, мне ясное дело незачем туда ходить, но, вот нужный редирект делать приходится. Пока, как довольно геморрное и громоздкое решение делаю общий запрет на редирект через $ua->max_redirect(0); и вручную обрабатываю редирект через регулярку, если в урле редиректа есть нужные мне данные, то перехожу. Но, проблема в том, что редиектов много, один может породить другой. Нет ли возможности средствами LWP, например, объявить в начале для каких запросов я разрешаю редирект (что то типа $ua->redirect_ok(перечислить разрешенные), а остальные редиректы бы отбрасывались.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 31-05-2017 22:22 » |
|
|
|
« Последнее редактирование: 31-05-2017 22:24 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #2 : 31-05-2017 23:00 » |
|
А что такое выборочный редирект я так и не понял?
Ведь в ответе есть куда редиректить? Поэтому и нужно самому разбираться куда тебя посылают
Не знаю как в перле но в php curl CURLOPT_FOLLOWLOCATION CURLOPT_MAXREDIRS
Но я думаю, что вас это не интересует А интересует именно ответ сервера
Ну так сервер может ответить различными редиректами - смотрите ответы редиректов (301, 302, 307 ) как часто используемые
Поэтому 0 exec 1 анализ кода ответа 2 анализ адреса редиректа (а здесь уже можно поступать как угодно) 3. Подсчет количества редиректов и такое бывает ведь не зря CURLOPT_MAXREDIRS 4 goto 0
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
|
|
« Ответ #3 : 01-06-2017 07:29 » |
|
В перле так же можно использовать curl. В перл вообще богатый инструментарий.
С LWP есть обработчики, включая response_redirect. Возможность решать самому, чего еще нужно...
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
perl6
Помогающий
Offline
|
|
« Ответ #4 : 01-06-2017 18:49 » |
|
Вчера тоже этот раздел смотрел, только с англ. беда. Непонятно многое.
|
|
|
Записан
|
|
|
|
perl6
Помогающий
Offline
|
|
« Ответ #5 : 01-06-2017 18:50 » |
|
А что такое выборочный редирект я так и не понял? Это когда мы выбираем сами, по каким редиректам ходить (парсим header location). Как я это реализовал в программе, через костыль. В общей части кода запретил редиректы (чтобы по всем подряд не переходить), а в нужных местах в ручную обрабатываю его. Но, это костыль, хочется гибкого решения средствами lwp
|
|
« Последнее редактирование: 01-06-2017 18:53 от perl6 »
|
Записан
|
|
|
|
perl6
Помогающий
Offline
|
|
« Ответ #6 : 01-06-2017 18:52 » |
|
В перле так же можно использовать curl. В перл вообще богатый инструментарий.
С LWP есть обработчики, включая response_redirect. Возможность решать самому, чего еще нужно...
curl нам не нужен, а вот гибкий обработчик, а что это вообще за вариант? Что-то не найду примера с использованием.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #7 : 01-06-2017 20:01 » |
|
Не знает система, что редиректить, а что нет. почему вы считаете, что єто костыль? Мало того, я 100% уверен, что внутренняя реализация отслеживания редиректов так и построена.
Я реально не знаю, что такое LWP Причем здесь нужен или не нужен curl, который был приведен как пример.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
perl6
Помогающий
Offline
|
|
« Ответ #8 : 01-06-2017 22:36 » |
|
Не знает система, что редиректить, а что нет. Вот я о том и речь веду. Неплохо было бы разрешить редиректы только для определенных запросов, а для остальных, по умолчанию, запретить. почему вы считаете, что єто костыль?. Смотрите сами. Вот я в начале программы, так сказать, глобально отключаю редиректы совсем. Незачем мне ходить по ним всегда. Но, в процессе парсинга, для определенных запросов, допустим, $req1, $req5, $req7 редиректы нужны. Приходится в ручную городить обработку, вот было бы здорово, заранее, определить, для каких запросов и/или доменов разрешить редиректы. Мало того, я 100% уверен, что внутренняя реализация отслеживания редиректов так и построена. Пока только нарыл то, что можно определить макс. количество редиректов или их вообще запретить. Я реально не знаю, что такое LWP Это перловый www броузер, позволяет ходить по сайтам, делать запросы, поддерживает куки. Короче, библиотека для работы с www (ине только) сетью. Причем здесь нужен или не нужен curl, который был приведен как пример.
Да, я понял, спасибо за пример. Для его использования в перле его надо скомпилировать сначала, а хочется обойтись средствами перла.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #9 : 01-06-2017 22:37 » |
|
Вчера тоже этот раздел смотрел, только с англ. беда. Непонятно многое. Да, беда. Не может человек, не читающий документацию, писать программы. #!/usr/bin/perl
use 5.010; use strict; use warnings;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->add_handler(response_header => sub { my ($response, $ua) = @_;
say 'Received redirect to location: ', $response->header('location'); $response->code(400); return; }, m_code => [301, 302]);
$ua->add_handler(response_done => sub { my ($response, $ua) = @_;
say 'Response done: ', $response->code; return; });
$ua->add_handler(response_redirect => sub { my ($response, $ua) = @_;
return unless $response->is_redirect; say 'Performs redirection to ', $response->header('location'); return; });
say "==== request with redirect ===="; $ua->get('http://yandex.ru/');
say "==== request without redirect ===="; $ua->get('https://yandex.ru/'); Дальше сам. Читай еще: http://search.cpan.org/~ether/HTTP-Message-6.11/lib/HTTP/Config.pm#Matching
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
RXL
|
|
« Ответ #10 : 01-06-2017 22:39 » |
|
Я реально не знаю, что такое LWP
LWP — libwww-perl Библиотека libwww очень старая — 1992-й год. Сделано под первые браузеры. Позже растиражирована под различные нужны, включая реализацию для перл.
|
|
« Последнее редактирование: 02-06-2017 07:45 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #11 : 02-06-2017 08:51 » |
|
Я реально не знаю, что такое LWP
LWP — libwww-perl Библиотека libwww очень старая — 1992-й год. Сделано под первые браузеры. Позже растиражирована под различные нужны, включая реализацию для перл. Я писал, что не знаю - не пользовался, не видел. А прочитать заголовок доки - это я умею Но я также понимаю принципы, как это работает, или представляю как это должно работать, потмоу и привел пример, из тог что знаю. Никто не застваляет компилировать curl. Принцип один Открыть порт, сделать запрос Разобрать ответ Все!!! А дальше.. назови хоть груздем, лишь бы грибом был
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
perl6
Помогающий
Offline
|
|
« Ответ #12 : 02-06-2017 14:30 » |
|
Да, беда. Не может человек, не читающий документацию, писать программы.
Да, а что делать. Никто не переводит документацию нормально. Никому не надо. А в школе нас тех. англ. не учили. Спасибо за пример, поковыряю вечерком.
|
|
« Последнее редактирование: 02-06-2017 14:37 от perl6 »
|
Записан
|
|
|
|
perl6
Помогающий
Offline
|
|
« Ответ #13 : 02-06-2017 14:32 » |
|
LWP — libwww-perl Библиотека libwww очень старая — 1992-й год. Сделано под первые браузеры. Позже растиражирована под различные нужны, включая реализацию для перл.
Да я бы не сказал, что прям настолько устарела, последнее обновление датировано 3 апрелем 2017 года. Некоторые библиотеки уже года 3 не обновляются. Кстати, какой модуль вы бы посоветовали, актуальный на сегодня?
|
|
« Последнее редактирование: 02-06-2017 14:37 от perl6 »
|
Записан
|
|
|
|
perl6
Помогающий
Offline
|
|
« Ответ #14 : 02-06-2017 17:09 » |
|
Вроде более менее логика понятна. P.S. Интересует, как регуляркой задать определенные соотв. в "location" урле. Можно, конечно по доменам разрешить, но способ корявый, ибо домены все собирать не айс. А вот регуляркой задать соответствие не получается почему-то. Я про m_path_match, ищущей в ссылке, с которой редиректит, а не в ссылке, куда редиректит. Иными словами, ссылка site1.ru, которая отправляет редиректом на site2.ru, вот мне в site2.ru и надо искать соотв. Если site2 содержит опр. слова, то переходить. Может m_response_attr__$key поможет. Непонятно, что это за поле такое m_response_attr__
|
|
« Последнее редактирование: 02-06-2017 17:57 от perl6 »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #15 : 02-06-2017 22:05 » |
|
Да, а что делать. Никто не переводит документацию нормально. Никому не надо. А в школе нас тех. англ. не учили. Спасибо за пример, поковыряю вечерком.
Отговорки. Я немецкий учил. Правда, нихрена не помню. В общем, если что-то нужно, научиться можно без школ и университетов. Т.к. ты пишешь синхронный код, порекомендую curl. Он также может делать параллельные запросы: даешь ему N заданий и встаешь в ожидание первого завершенного. Но это не параллельный процесс, его нельзя с активными запросами надолго лишать управления. Но можно и по одному запросу гонять. С другой стороны, если ты привык к LWP, то зачем менять. Только если не подходит как инструмент. Насчет логики: response_redirect используется не при редиректах, а для имитации редиректа. ссылка site1.ru, которая отправляет редиректом на site2.ru, вот мне в site2.ru и надо искать соотв. Если site2 содержит опр. слова, то переходить. Это расходится с изначальным описанием. Определись с логикой.
|
|
« Последнее редактирование: 02-06-2017 22:17 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
perl6
Помогающий
Offline
|
|
« Ответ #16 : 03-06-2017 21:54 » |
|
Т.к. ты пишешь синхронный код, порекомендую curl. Он также может делать параллельные запросы: даешь ему N заданий и встаешь в ожидание первого завершенного. Но это не параллельный процесс, его нельзя с активными запросами надолго лишать управления. Но можно и по одному запросу гонять. С другой стороны, если ты привык к LWP, то зачем менять. Только если не подходит как инструмент. Вот, я тоже подумал. Курл для этого слишком громоздкий, LWP прекрасно справляется. Это расходится с изначальным описанием. Определись с логикой.
Я просто не умею выражать свои мысли, это да. Изначально неправильно истолковал.
|
|
|
Записан
|
|
|
|
|